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

Artifact 52f09127b53697b1a95835a9b0db9309cca8079f:


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 33 32 33  select.c,v 1.323
0200: 20 32 30 30 36 2f 31 32 2f 31 36 20 31 36 3a 32   2006/12/16 16:2
0210: 35 3a 31 35 20 64 72 68 20 45 78 70 20 24 0a 2a  5:15 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 53  id clearSelect(S
02c0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c  elect *p){.  sql
02d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
02e0: 74 65 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  te(p->pEList);. 
02f0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
0300: 65 6c 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a  elete(p->pSrc);.
0310: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
0320: 65 74 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  ete(p->pWhere);.
0330: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0340: 74 44 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75  tDelete(p->pGrou
0350: 70 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  pBy);.  sqlite3E
0360: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 48 61  xprDelete(p->pHa
0370: 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  ving);.  sqlite3
0380: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
0390: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73  ->pOrderBy);.  s
03a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
03b0: 74 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  te(p->pPrior);. 
03c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
03d0: 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  te(p->pLimit);. 
03e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
03f0: 74 65 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  te(p->pOffset);.
0400: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  }.../*.** Alloca
0410: 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20  te a new Select 
0420: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65  structure and re
0430: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
0440: 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74  o that.** struct
0450: 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a  ure..*/.Select *
0460: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
0470: 28 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  (.  ExprList *pE
0480: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
0490: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
04a0: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
04b0: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
04c0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
04d0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
04e0: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
04f0: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0500: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0510: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0520: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0530: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0540: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0550: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0560: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
0570: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
0580: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
0590: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
05a0: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
05b0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
05c0: 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
05d0: 2c 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20  ,       /* true 
05e0: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
05f0: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
0600: 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  nt */.  Expr *pL
0610: 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  imit,         /*
0620: 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e   LIMIT value.  N
0630: 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73  ULL means not us
0640: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  ed */.  Expr *pO
0650: 66 66 73 65 74 20 20 20 20 20 20 20 20 20 2f 2a  ffset         /*
0660: 20 4f 46 46 53 45 54 20 76 61 6c 75 65 2e 20 20   OFFSET value.  
0670: 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66  NULL means no of
0680: 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  fset */.){.  Sel
0690: 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
06a0: 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 70  ect standin;.  p
06b0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
06c0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
06d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
06e0: 70 4f 66 66 73 65 74 20 7c 7c 20 70 4c 69 6d 69  pOffset || pLimi
06f0: 74 20 29 3b 20 20 20 2f 2a 20 43 61 6e 27 74 20  t );   /* Can't 
0700: 68 61 76 65 20 4f 46 46 53 45 54 20 77 69 74 68  have OFFSET with
0710: 6f 75 74 20 4c 49 4d 49 54 2e 20 2a 2f 0a 20 20  out LIMIT. */.  
0720: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
0730: 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61 6e 64     pNew = &stand
0740: 69 6e 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  in;.    memset(p
0750: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  New, 0, sizeof(*
0760: 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20 69 66  pNew));.  }.  if
0770: 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  ( pEList==0 ){. 
0780: 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69     pEList = sqli
0790: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
07a0: 64 28 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  d(0, sqlite3Expr
07b0: 28 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20  (TK_ALL,0,0,0), 
07c0: 30 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  0);.  }.  pNew->
07d0: 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b  pEList = pEList;
07e0: 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20  .  pNew->pSrc = 
07f0: 70 53 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  pSrc;.  pNew->pW
0800: 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
0810: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
0820: 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e  = pGroupBy;.  pN
0830: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48  ew->pHaving = pH
0840: 61 76 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70  aving;.  pNew->p
0850: 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
0860: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69  By;.  pNew->isDi
0870: 73 74 69 6e 63 74 20 3d 20 69 73 44 69 73 74 69  stinct = isDisti
0880: 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  nct;.  pNew->op 
0890: 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70  = TK_SELECT;.  p
08a0: 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c  New->pLimit = pL
08b0: 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  imit;.  pNew->pO
08c0: 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
08d0: 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20  .  pNew->iLimit 
08e0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f  = -1;.  pNew->iO
08f0: 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 70 4e  ffset = -1;.  pN
0900: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0910: 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [0] = -1;.  pNew
0920: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
0930: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
0940: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
0950: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 4e 65 77  = -1;.  if( pNew
0960: 3d 3d 26 73 74 61 6e 64 69 6e 29 20 7b 0a 20 20  ==&standin) {.  
0970: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 70 4e    clearSelect(pN
0980: 65 77 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  ew);.    pNew = 
0990: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
09a0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  pNew;.}../*.** D
09b0: 65 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20  elete the given 
09c0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
09d0: 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
09e0: 73 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  substructures..*
09f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
0a00: 6c 65 63 74 44 65 6c 65 74 65 28 53 65 6c 65 63  lectDelete(Selec
0a10: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
0a20: 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63  {.    clearSelec
0a30: 74 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t(p);.    sqlite
0a40: 46 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  Free(p);.  }.}..
0a50: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f  /*.** Given 1 to
0a60: 20 33 20 69 64 65 6e 74 69 66 69 65 72 73 20 70   3 identifiers p
0a70: 72 65 63 65 65 64 69 6e 67 20 74 68 65 20 4a 4f  receeding the JO
0a80: 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65  IN keyword, dete
0a90: 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70  rmine the.** typ
0aa0: 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75  e of join.  Retu
0ab0: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  rn an integer co
0ac0: 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72  nstant that expr
0ad0: 65 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a  esses that type.
0ae0: 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ** in terms of t
0af0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74  he following bit
0b00: 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
0b10: 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20     JT_INNER.**  
0b20: 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20     JT_CROSS.**  
0b30: 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20     JT_OUTER.**  
0b40: 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a     JT_NATURAL.**
0b50: 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20       JT_LEFT.** 
0b60: 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a      JT_RIGHT.**.
0b70: 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20  ** A full outer 
0b80: 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62  join is the comb
0b90: 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45  ination of JT_LE
0ba0: 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e  FT and JT_RIGHT.
0bb0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c  .**.** If an ill
0bc0: 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72  egal or unsuppor
0bd0: 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73  ted join type is
0be0: 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c   seen, then stil
0bf0: 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f  l return.** a jo
0c00: 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74  in type, but put
0c10: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
0c20: 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
0c30: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
0c40: 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20  3JoinType(Parse 
0c50: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
0c60: 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54  pA, Token *pB, T
0c70: 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74  oken *pC){.  int
0c80: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
0c90: 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d   Token *apAll[3]
0ca0: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20  ;.  Token *p;.  
0cb0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
0cc0: 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
0cd0: 63 68 61 72 20 7a 4b 65 79 77 6f 72 64 5b 38 5d  char zKeyword[8]
0ce0: 3b 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b 0a  ;.    u8 nChar;.
0cf0: 20 20 20 20 75 38 20 63 6f 64 65 3b 0a 20 20 7d      u8 code;.  }
0d00: 20 6b 65 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a   keywords[] = {.
0d10: 20 20 20 20 7b 20 22 6e 61 74 75 72 61 6c 22 2c      { "natural",
0d20: 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 7d   7, JT_NATURAL }
0d30: 2c 0a 20 20 20 20 7b 20 22 6c 65 66 74 22 2c 20  ,.    { "left", 
0d40: 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54     4, JT_LEFT|JT
0d50: 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20  _OUTER },.    { 
0d60: 22 72 69 67 68 74 22 2c 20 20 20 35 2c 20 4a 54  "right",   5, JT
0d70: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
0d80: 7d 2c 0a 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c  },.    { "full",
0d90: 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a      4, JT_LEFT|J
0da0: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
0db0: 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 75 74 65 72   },.    { "outer
0dc0: 22 2c 20 20 20 35 2c 20 4a 54 5f 4f 55 54 45 52  ",   5, JT_OUTER
0dd0: 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 6e 65 72   },.    { "inner
0de0: 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52  ",   5, JT_INNER
0df0: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 72 6f 73 73   },.    { "cross
0e00: 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52  ",   5, JT_INNER
0e10: 7c 4a 54 5f 43 52 4f 53 53 20 7d 2c 0a 20 20 7d  |JT_CROSS },.  }
0e20: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
0e30: 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20  apAll[0] = pA;. 
0e40: 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a   apAll[1] = pB;.
0e50: 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b    apAll[2] = pC;
0e60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20  .  for(i=0; i<3 
0e70: 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b  && apAll[i]; i++
0e80: 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41 6c 6c  ){.    p = apAll
0e90: 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  [i];.    for(j=0
0ea0: 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b 65 79 77 6f  ; j<sizeof(keywo
0eb0: 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77  rds)/sizeof(keyw
0ec0: 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b 2b 29 7b 0a  ords[0]); j++){.
0ed0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d        if( p->n==
0ee0: 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61  keywords[j].nCha
0ef0: 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  r .          && 
0f00: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
0f10: 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 6b 65 79  (char*)p->z, key
0f20: 77 6f 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72  words[j].zKeywor
0f30: 64 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20  d, p->n)==0 ){. 
0f40: 20 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20         jointype 
0f50: 7c 3d 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63  |= keywords[j].c
0f60: 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ode;.        bre
0f70: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
0f80: 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a  }.    if( j>=siz
0f90: 65 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69  eof(keywords)/si
0fa0: 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d  zeof(keywords[0]
0fb0: 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74  ) ){.      joint
0fc0: 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b  ype |= JT_ERROR;
0fd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
0fe0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20    }.  }.  if(.  
0ff0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28     (jointype & (
1000: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1010: 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a  R))==(JT_INNER|J
1020: 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20  T_OUTER) ||.    
1030: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f   (jointype & JT_
1040: 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20  ERROR)!=0.  ){. 
1050: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1060: 53 70 31 20 3d 20 22 20 22 3b 0a 20 20 20 20 63  Sp1 = " ";.    c
1070: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 32 20  onst char *zSp2 
1080: 3d 20 22 20 22 3b 0a 20 20 20 20 69 66 28 20 70  = " ";.    if( p
1090: 42 3d 3d 30 20 29 7b 20 7a 53 70 31 2b 2b 3b 20  B==0 ){ zSp1++; 
10a0: 7d 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20  }.    if( pC==0 
10b0: 29 7b 20 7a 53 70 32 2b 2b 3b 20 7d 0a 20 20 20  ){ zSp2++; }.   
10c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10d0: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
10e0: 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64  n or unsupported
10f0: 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20   join type: ".  
1100: 20 20 20 20 20 22 25 54 25 73 25 54 25 73 25 54       "%T%s%T%s%T
1110: 22 2c 20 70 41 2c 20 7a 53 70 31 2c 20 70 42 2c  ", pA, zSp1, pB,
1120: 20 7a 53 70 32 2c 20 70 43 29 3b 0a 20 20 20 20   zSp2, pC);.    
1130: 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e  jointype = JT_IN
1140: 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NER;.  }else if(
1150: 20 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 52   jointype & JT_R
1160: 49 47 48 54 20 29 7b 0a 20 20 20 20 73 71 6c 69  IGHT ){.    sqli
1170: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1180: 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48  se, .      "RIGH
1190: 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52  T and FULL OUTER
11a0: 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63   JOINs are not c
11b0: 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74  urrently support
11c0: 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79  ed");.    jointy
11d0: 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20  pe = JT_INNER;. 
11e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e   }.  return join
11f0: 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  type;.}../*.** R
1200: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
1210: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  of a column in a
1220: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1230: 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  -1 if the column
1240: 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  .** is not conta
1250: 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c  ined in the tabl
1260: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1270: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62   columnIndex(Tab
1280: 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20  le *pTab, const 
1290: 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69  char *zCol){.  i
12a0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
12b0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
12c0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
12d0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62  ite3StrICmp(pTab
12e0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c  ->aCol[i].zName,
12f0: 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75   zCol)==0 ) retu
1300: 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
1310: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
1320: 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
1330: 20 61 20 74 6f 6b 65 6e 20 74 6f 20 61 20 27 5c   a token to a '\
1340: 30 30 30 27 2d 74 65 72 6d 69 6e 61 74 65 64 20  000'-terminated 
1350: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
1360: 63 20 76 6f 69 64 20 73 65 74 54 6f 6b 65 6e 28  c void setToken(
1370: 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e 73 74 20  Token *p, const 
1380: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a  char *z){.  p->z
1390: 20 3d 20 28 75 38 2a 29 7a 3b 0a 20 20 70 2d 3e   = (u8*)z;.  p->
13a0: 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a  n = z ? strlen(z
13b0: 29 20 3a 20 30 3b 0a 20 20 70 2d 3e 64 79 6e 20  ) : 0;.  p->dyn 
13c0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  = 0;.}../*.** Cr
13d0: 65 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  eate an expressi
13e0: 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 6e 20 69  on node for an i
13f0: 64 65 6e 74 69 66 69 65 72 20 77 69 74 68 20 74  dentifier with t
1400: 68 65 20 6e 61 6d 65 20 6f 66 20 7a 4e 61 6d 65  he name of zName
1410: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
1420: 33 43 72 65 61 74 65 49 64 45 78 70 72 28 63 6f  3CreateIdExpr(co
1430: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
1440: 7b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b  {.  Token dummy;
1450: 0a 20 20 73 65 74 54 6f 6b 65 6e 28 26 64 75 6d  .  setToken(&dum
1460: 6d 79 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  my, zName);.  re
1470: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
1480: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64  (TK_ID, 0, 0, &d
1490: 75 6d 6d 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ummy);.}.../*.**
14a0: 20 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74   Add a term to t
14b0: 68 65 20 57 48 45 52 45 20 65 78 70 72 65 73 73  he WHERE express
14c0: 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70 72 20 74  ion in *ppExpr t
14d0: 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
14e0: 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20  .** zCol column 
14f0: 74 6f 20 62 65 20 65 71 75 61 6c 20 69 6e 20 74  to be equal in t
1500: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 70 54  he two tables pT
1510: 61 62 31 20 61 6e 64 20 70 54 61 62 32 2e 0a 2a  ab1 and pTab2..*
1520: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64  /.static void ad
1530: 64 57 68 65 72 65 54 65 72 6d 28 0a 20 20 63 6f  dWhereTerm(.  co
1540: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20  nst char *zCol, 
1550: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1560: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  f the column */.
1570: 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70    const Table *p
1580: 54 61 62 31 2c 20 20 20 20 20 20 2f 2a 20 46 69  Tab1,      /* Fi
1590: 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63  rst table */.  c
15a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61  onst char *zAlia
15b0: 73 31 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73  s1,     /* Alias
15c0: 20 66 6f 72 20 66 69 72 73 74 20 74 61 62 6c 65   for first table
15d0: 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
15e0: 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20  /.  const Table 
15f0: 2a 70 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20  *pTab2,      /* 
1600: 53 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a  Second table */.
1610: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
1620: 6c 69 61 73 32 2c 20 20 20 20 20 2f 2a 20 41 6c  lias2,     /* Al
1630: 69 61 73 20 66 6f 72 20 73 65 63 6f 6e 64 20 74  ias for second t
1640: 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  able.  May be NU
1650: 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67  LL */.  int iRig
1660: 68 74 4a 6f 69 6e 54 61 62 6c 65 2c 20 20 20 20  htJoinTable,    
1670: 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
1680: 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 74 61  for the right ta
1690: 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  ble */.  Expr **
16a0: 70 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  ppExpr          
16b0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 71 75    /* Add the equ
16c0: 61 6c 69 74 79 20 74 65 72 6d 20 74 6f 20 74 68  ality term to th
16d0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
16e0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 31 61  .){.  Expr *pE1a
16f0: 2c 20 2a 70 45 31 62 2c 20 2a 70 45 31 63 3b 0a  , *pE1b, *pE1c;.
1700: 20 20 45 78 70 72 20 2a 70 45 32 61 2c 20 2a 70    Expr *pE2a, *p
1710: 45 32 62 2c 20 2a 70 45 32 63 3b 0a 20 20 45 78  E2b, *pE2c;.  Ex
1720: 70 72 20 2a 70 45 3b 0a 0a 20 20 70 45 31 61 20  pr *pE;..  pE1a 
1730: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49  = sqlite3CreateI
1740: 64 45 78 70 72 28 7a 43 6f 6c 29 3b 0a 20 20 70  dExpr(zCol);.  p
1750: 45 32 61 20 3d 20 73 71 6c 69 74 65 33 43 72 65  E2a = sqlite3Cre
1760: 61 74 65 49 64 45 78 70 72 28 7a 43 6f 6c 29 3b  ateIdExpr(zCol);
1770: 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 31 3d 3d  .  if( zAlias1==
1780: 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 31  0 ){.    zAlias1
1790: 20 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b   = pTab1->zName;
17a0: 0a 20 20 7d 0a 20 20 70 45 31 62 20 3d 20 73 71  .  }.  pE1b = sq
17b0: 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70  lite3CreateIdExp
17c0: 72 28 7a 41 6c 69 61 73 31 29 3b 0a 20 20 69 66  r(zAlias1);.  if
17d0: 28 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29 7b 0a  ( zAlias2==0 ){.
17e0: 20 20 20 20 7a 41 6c 69 61 73 32 20 3d 20 70 54      zAlias2 = pT
17f0: 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  ab2->zName;.  }.
1800: 20 20 70 45 32 62 20 3d 20 73 71 6c 69 74 65 33    pE2b = sqlite3
1810: 43 72 65 61 74 65 49 64 45 78 70 72 28 7a 41 6c  CreateIdExpr(zAl
1820: 69 61 73 32 29 3b 0a 20 20 70 45 31 63 20 3d 20  ias2);.  pE1c = 
1830: 73 71 6c 69 74 65 33 45 78 70 72 4f 72 46 72 65  sqlite3ExprOrFre
1840: 65 28 54 4b 5f 44 4f 54 2c 20 70 45 31 62 2c 20  e(TK_DOT, pE1b, 
1850: 70 45 31 61 2c 20 30 29 3b 0a 20 20 70 45 32 63  pE1a, 0);.  pE2c
1860: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4f 72   = sqlite3ExprOr
1870: 46 72 65 65 28 54 4b 5f 44 4f 54 2c 20 70 45 32  Free(TK_DOT, pE2
1880: 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70  b, pE2a, 0);.  p
1890: 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4f  E = sqlite3ExprO
18a0: 72 46 72 65 65 28 54 4b 5f 45 51 2c 20 70 45 31  rFree(TK_EQ, pE1
18b0: 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20 20 69  c, pE2c, 0);.  i
18c0: 66 28 20 70 45 20 29 7b 0a 20 20 20 20 45 78 70  f( pE ){.    Exp
18d0: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 2c  rSetProperty(pE,
18e0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
18f0: 20 20 20 70 45 2d 3e 69 52 69 67 68 74 4a 6f 69     pE->iRightJoi
1900: 6e 54 61 62 6c 65 20 3d 20 69 52 69 67 68 74 4a  nTable = iRightJ
1910: 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  oinTable;.  }.  
1920: 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pE = sqlite3Expr
1930: 41 6e 64 28 2a 70 70 45 78 70 72 2c 20 70 45 29  And(*ppExpr, pE)
1940: 3b 0a 20 20 69 66 28 20 70 45 20 29 7b 0a 20 20  ;.  if( pE ){.  
1950: 20 20 2a 70 70 45 78 70 72 20 3d 20 70 45 3b 0a    *ppExpr = pE;.
1960: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
1970: 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   the EP_FromJoin
1980: 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c   property on all
1990: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69   terms of the gi
19a0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ven expression..
19b0: 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45  ** And set the E
19c0: 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
19d0: 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f  ble to iTable fo
19e0: 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  r every term in 
19f0: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
1a00: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f  n..**.** The EP_
1a10: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
1a20: 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72  y is used on ter
1a30: 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  ms of an express
1a40: 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74  ion to tell.** t
1a50: 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  he LEFT OUTER JO
1a60: 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  IN processing lo
1a70: 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65  gic that this te
1a80: 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  rm is part of th
1a90: 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69  e.** join restri
1aa0: 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
1ab0: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
1ac0: 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f  NG clause and no
1ad0: 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  t a part.** of t
1ae0: 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20  he more general 
1af0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54  WHERE clause.  T
1b00: 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d  hese terms are m
1b10: 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65  oved over to the
1b20: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
1b30: 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f   during join pro
1b40: 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e  cessing but we n
1b50: 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
1b60: 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69  that they.** ori
1b70: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
1b80: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
1b90: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70  e..**.** The Exp
1ba0: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
1bb0: 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52  e tells the WHER
1bc0: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
1bd0: 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ing that the.** 
1be0: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e  expression depen
1bf0: 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67  ds on table iRig
1c00: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e  htJoinTable even
1c10: 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69   if that table i
1c20: 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69  s not.** explici
1c30: 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  tly mentioned in
1c40: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
1c50: 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69    That informati
1c60: 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20  on is needed.** 
1c70: 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74  for cases like t
1c80: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  his:.**.**    SE
1c90: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
1ca0: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
1cb0: 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e  1.a=t2.b AND t1.
1cc0: 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68  x=5.**.** The wh
1cd0: 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73  ere clause needs
1ce0: 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61   to defer the ha
1cf0: 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31  ndling of the t1
1d00: 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74  .x=5.** term unt
1d10: 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20  il after the t2 
1d20: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e  loop of the join
1d30: 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20  .  In that way, 
1d40: 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77  a.** NULL t2 row
1d50: 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
1d60: 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21  d whenever t1.x!
1d70: 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f  =5.  If we do no
1d80: 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68  t.** defer the h
1d90: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d  andling of t1.x=
1da0: 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72  5, it will be pr
1db0: 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74  ocessed immediat
1dc0: 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65  ely.** after the
1dd0: 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77   t1 loop and row
1de0: 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77  s with t1.x!=5 w
1df0: 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72  ill never appear
1e00: 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75   in.** the outpu
1e10: 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f  t, which is inco
1e20: 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrect..*/.static
1e30: 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70   void setJoinExp
1e40: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  r(Expr *p, int i
1e50: 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28  Table){.  while(
1e60: 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65   p ){.    ExprSe
1e70: 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  tProperty(p, EP_
1e80: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70  FromJoin);.    p
1e90: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
1ea0: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
1eb0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70  setJoinExpr(p->p
1ec0: 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20  Left, iTable);. 
1ed0: 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74     p = p->pRight
1ee0: 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ;.  } .}../*.** 
1ef0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f  This routine pro
1f00: 63 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20  cesses the join 
1f10: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
1f20: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1f30: 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53  nt..** ON and US
1f40: 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20  ING clauses are 
1f50: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65  converted into e
1f60: 78 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68  xtra terms of th
1f70: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  e WHERE clause..
1f80: 2a 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73  ** NATURAL joins
1f90: 20 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74   also create ext
1fa0: 72 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ra WHERE clause 
1fb0: 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  terms..**.** The
1fc0: 20 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d   terms of a FROM
1fd0: 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74   clause are cont
1fe0: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c  ained in the Sel
1ff0: 65 63 74 2e 70 53 72 63 20 73 74 72 75 63 74 75  ect.pSrc structu
2000: 72 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20  re..** The left 
2010: 6d 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74 68  most table is th
2020: 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
2030: 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54   Select.pSrc.  T
2040: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a  he right-most.**
2050: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61   table is the la
2060: 73 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a  st entry.  The j
2070: 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20  oin operator is 
2080: 68 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72  held in the entr
2090: 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74  y to.** the left
20a0: 2e 20 20 54 68 75 73 20 65 6e 74 72 79 20 30 20  .  Thus entry 0 
20b0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69  contains the joi
20c0: 6e 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74  n operator for t
20d0: 68 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a  he join between.
20e0: 2a 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64  ** entries 0 and
20f0: 20 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55   1.  Any ON or U
2100: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73  SING clauses ass
2110: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2120: 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73   join are.** als
2130: 6f 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  o attached to th
2140: 65 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a  e left entry..**
2150: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2160: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
2170: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
2180: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74  countered..*/.st
2190: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50  atic int sqliteP
21a0: 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65  rocessJoin(Parse
21b0: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
21c0: 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20   *p){.  SrcList 
21d0: 2a 70 53 72 63 3b 20 20 20 20 20 20 20 20 20 20  *pSrc;          
21e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74          /* All t
21f0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2200: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  M clause */.  in
2210: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2230: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2240: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
2250: 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20  st_item *pLeft; 
2260: 20 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c      /* Left tabl
2270: 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a  e being joined *
2280: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
2290: 73 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b  st_item *pRight;
22a0: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62      /* Right tab
22b0: 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20  le being joined 
22c0: 2a 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e  */..  pSrc = p->
22d0: 70 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20  pSrc;.  pLeft = 
22e0: 26 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70  &pSrc->a[0];.  p
22f0: 52 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31  Right = &pLeft[1
2300: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
2310: 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b  pSrc->nSrc-1; i+
2320: 2b 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65  +, pRight++, pLe
2330: 66 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  ft++){.    Table
2340: 20 2a 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65   *pLeftTab = pLe
2350: 66 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61  ft->pTab;.    Ta
2360: 62 6c 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d  ble *pRightTab =
2370: 20 70 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 0a   pRight->pTab;..
2380: 20 20 20 20 69 66 28 20 70 4c 65 66 74 54 61 62      if( pLeftTab
2390: 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62  ==0 || pRightTab
23a0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
23b0: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  .    /* When the
23c0: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
23d0: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64   is present, add
23e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
23f0: 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65  rms for.    ** e
2400: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74  very column that
2410: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
2420: 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a  have in common..
2430: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2440: 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20  Right->jointype 
2450: 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a  & JT_NATURAL ){.
2460: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
2470: 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d  ->pOn || pRight-
2480: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
2490: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
24a0: 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41  sg(pParse, "a NA
24b0: 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e  TURAL join may n
24c0: 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20  ot have ".      
24d0: 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55       "an ON or U
24e0: 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29  SING clause", 0)
24f0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2500: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2510: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65    for(j=0; j<pLe
2520: 66 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ftTab->nCol; j++
2530: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
2540: 2a 7a 4e 61 6d 65 20 3d 20 70 4c 65 66 74 54 61  *zName = pLeftTa
2550: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
2560: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
2570: 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74  lumnIndex(pRight
2580: 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  Tab, zName)>=0 )
2590: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57  {.          addW
25a0: 68 65 72 65 54 65 72 6d 28 7a 4e 61 6d 65 2c 20  hereTerm(zName, 
25b0: 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d  pLeftTab, pLeft-
25c0: 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20  >zAlias, .      
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61          pRightTa
25f0: 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61  b, pRight->zAlia
2600: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2620: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
2630: 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , &p->pWhere);. 
2640: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
2650: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2660: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c  }..    /* Disall
2670: 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ow both ON and U
2680: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20  SING clauses in 
2690: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20  the same join.  
26a0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
26b0: 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67  ght->pOn && pRig
26c0: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
26d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
26e0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
26f0: 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e  not have both ON
2700: 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20   and USING ".   
2710: 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e       "clauses in
2720: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29   the same join")
2730: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2740: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2750: 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  Add the ON claus
2760: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
2770: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2780: 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  , connected by. 
2790: 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65     ** an AND ope
27a0: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
27b0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
27c0: 6e 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f  n ){.      setJo
27d0: 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70  inExpr(pRight->p
27e0: 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72  On, pRight->iCur
27f0: 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  sor);.      p->p
2800: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
2810: 78 70 72 41 6e 64 28 70 2d 3e 70 57 68 65 72 65  xprAnd(p->pWhere
2820: 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a  , pRight->pOn);.
2830: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f        pRight->pO
2840: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
2850: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
2860: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
2870: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
2880: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
2890: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
28a0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
28b0: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
28c0: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
28d0: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
28e0: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
28f0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
2900: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
2910: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
2920: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
2930: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
2940: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
2950: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
2960: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
2970: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
2980: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
2990: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
29a0: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
29b0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
29c0: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
29d0: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
29e0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
29f0: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
2a00: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  dList *pList = p
2a10: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20  Right->pUsing;. 
2a20: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2a30: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
2a40: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
2a50: 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61  zName = pList->a
2a60: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
2a70: 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64     if( columnInd
2a80: 65 78 28 70 4c 65 66 74 54 61 62 2c 20 7a 4e 61  ex(pLeftTab, zNa
2a90: 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e 49  me)<0 || columnI
2aa0: 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20  ndex(pRightTab, 
2ab0: 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20  zName)<0 ){.    
2ac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2ad0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
2ae0: 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67  annot join using
2af0: 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c   column %s - col
2b00: 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20  umn ".          
2b10: 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69    "not present i
2b20: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20  n both tables", 
2b30: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2b40: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2b50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
2b60: 64 57 68 65 72 65 54 65 72 6d 28 7a 4e 61 6d 65  dWhereTerm(zName
2b70: 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66  , pLeftTab, pLef
2b80: 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20  t->zAlias, .    
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61          pRightTa
2bb0: 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61  b, pRight->zAlia
2bc0: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2be0: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20  Right->iCursor, 
2bf0: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
2c00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2c10: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2c20: 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20  .** Insert code 
2c30: 69 6e 74 6f 20 22 76 22 20 74 68 61 74 20 77 69  into "v" that wi
2c40: 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63 6f  ll push the reco
2c50: 72 64 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  rd on the top of
2c60: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e   the.** stack in
2c70: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
2c80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
2c90: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
2ca0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2cb0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
2cc0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
2cd0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
2ce0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  ,    /* The ORDE
2cf0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
2d00: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
2d10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77          /* The w
2d20: 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74  hole SELECT stat
2d30: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  ement */.){.  Vd
2d40: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2d50: 70 56 64 62 65 3b 0a 20 20 73 71 6c 69 74 65 33  pVdbe;.  sqlite3
2d60: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
2d70: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
2d80: 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  y);.  sqlite3Vdb
2d90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71  eAddOp(v, OP_Seq
2da0: 75 65 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d  uence, pOrderBy-
2db0: 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20  >iECursor, 0);. 
2dc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2dd0: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 70 4f  p(v, OP_Pull, pO
2de0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20  rderBy->nExpr + 
2df0: 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  1, 0);.  sqlite3
2e00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2e10: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 4f 72 64  MakeRecord, pOrd
2e20: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 32 2c  erBy->nExpr + 2,
2e30: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
2e40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
2e50: 78 49 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42  xInsert, pOrderB
2e60: 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b  y->iECursor, 0);
2e70: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
2e80: 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20  iLimit>=0 ){.   
2e90: 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72   int addr1, addr
2ea0: 32 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73  2;.    addr1 = s
2eb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2ec0: 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c  v, OP_IfMemZero,
2ed0: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
2ee0: 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  +1, 0);.    sqli
2ef0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2f00: 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20  OP_MemIncr, -1, 
2f10: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 2b  pSelect->iLimit+
2f20: 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  1);.    addr2 = 
2f30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f40: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
2f50: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
2f60: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
2f70: 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddr1);.    sqlit
2f80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2f90: 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79  P_Last, pOrderBy
2fa0: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a  ->iECursor, 0);.
2fb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2fc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74  ddOp(v, OP_Delet
2fd0: 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  e, pOrderBy->iEC
2fe0: 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 73  ursor, 0);.    s
2ff0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
3000: 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20  re(v, addr2);.  
3010: 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69    pSelect->iLimi
3020: 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  t = -1;.  }.}../
3030: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f  *.** Add code to
3040: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f   implement the O
3050: 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20  FFSET.*/.static 
3060: 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28  void codeOffset(
3070: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
3080: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
3090: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
30a0: 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  VM */.  Select *
30b0: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p,        /* The
30c0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
30d0: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
30e0: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
30f0: 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ,    /* Jump her
3100: 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75  e to skip the cu
3110: 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a  rrent record */.
3120: 20 20 69 6e 74 20 6e 50 6f 70 20 20 20 20 20 20    int nPop      
3130: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3140: 20 74 69 6d 65 73 20 74 6f 20 70 6f 70 20 73 74   times to pop st
3150: 61 63 6b 20 77 68 65 6e 20 6a 75 6d 70 69 6e 67  ack when jumping
3160: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
3170: 69 4f 66 66 73 65 74 3e 3d 30 20 26 26 20 69 43  iOffset>=0 && iC
3180: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20  ontinue!=0 ){.  
3190: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
31a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
31b0: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20  (v, OP_MemIncr, 
31c0: 2d 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b  -1, p->iOffset);
31d0: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
31e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
31f0: 4f 50 5f 49 66 4d 65 6d 4e 65 67 2c 20 70 2d 3e  OP_IfMemNeg, p->
3200: 69 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20  iOffset, 0);.   
3210: 20 69 66 28 20 6e 50 6f 70 3e 30 20 29 7b 0a 20   if( nPop>0 ){. 
3220: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3230: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
3240: 20 6e 50 6f 70 2c 20 30 29 3b 0a 20 20 20 20 7d   nPop, 0);.    }
3250: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3260: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
3270: 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , 0, iContinue);
3280: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
3290: 28 28 76 2c 20 22 23 20 73 6b 69 70 20 4f 46 46  ((v, "# skip OFF
32a0: 53 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a  SET records"));.
32b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
32c0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
32d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
32e0: 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  dd code that wil
32f0: 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  l check to make 
3300: 73 75 72 65 20 74 68 65 20 74 6f 70 20 4e 20 65  sure the top N e
3310: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  lements of the.*
3320: 2a 20 73 74 61 63 6b 20 61 72 65 20 64 69 73 74  * stack are dist
3330: 69 6e 63 74 2e 20 20 69 54 61 62 20 69 73 20 61  inct.  iTab is a
3340: 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
3350: 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f  hat holds previo
3360: 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d  usly.** seen com
3370: 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  binations of the
3380: 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65   N values.  A ne
3390: 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20  w entry is made 
33a0: 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68  in iTab.** if th
33b0: 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75  e current N valu
33c0: 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a  es are new..**.*
33d0: 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72  * A jump to addr
33e0: 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61  Repeat is made a
33f0: 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65  nd the N+1 value
3400: 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f  s are popped fro
3410: 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69  m the.** stack i
3420: 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d  f the top N elem
3430: 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73  ents are not dis
3440: 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  tinct..*/.static
3450: 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e   void codeDistin
3460: 63 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  ct(.  Vdbe *v,  
3470: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
3480: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
3490: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
34a0: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
34b0: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
34c0: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
34d0: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
34e0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
34f0: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
3500: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
3510: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
3520: 20 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   N              
3530: 2f 2a 20 54 68 65 20 74 6f 70 20 4e 20 65 6c 65  /* The top N ele
3540: 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 74 61  ments of the sta
3550: 63 6b 20 6d 75 73 74 20 62 65 20 64 69 73 74 69  ck must be disti
3560: 6e 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nct */.){.  sqli
3570: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3580: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 2d  OP_MakeRecord, -
3590: 4e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  N, 0);.  sqlite3
35a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
35b0: 44 69 73 74 69 6e 63 74 2c 20 69 54 61 62 2c 20  Distinct, iTab, 
35c0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
35d0: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
35e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35f0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 4e 2b 31 2c  (v, OP_Pop, N+1,
3600: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
3610: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
3620: 74 6f 2c 20 30 2c 20 61 64 64 72 52 65 70 65 61  to, 0, addrRepea
3630: 74 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  t);.  VdbeCommen
3640: 74 28 28 76 2c 20 22 23 20 73 6b 69 70 20 69 6e  t((v, "# skip in
3650: 64 69 73 74 69 6e 63 74 20 72 65 63 6f 72 64 73  distinct records
3660: 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  "));.  sqlite3Vd
3670: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
3680: 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 30  xInsert, iTab, 0
3690: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
36a0: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
36b0: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
36c0: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
36d0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
36e0: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
36f0: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e  .** If srcTab an
3700: 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f  d nColumn are bo
3710: 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  th zero, then th
3720: 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73  e pEList express
3730: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c  ions.** are eval
3740: 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uated in order t
3750: 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66  o get the data f
3760: 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66  or this row.  If
3770: 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68   nColumn>0.** th
3780: 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65  en data is pulle
3790: 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e  d from srcTab an
37a0: 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64  d pEList is used
37b0: 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65   only to get the
37c0: 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f  .** datatypes fo
37d0: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a  r each column..*
37e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
37f0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
3800: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3810: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
3820: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
3830: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
3840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
3850: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
3860: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
3870: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
3880: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
3890: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
38a0: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
38b0: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
38c0: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
38d0: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
38e0: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
38f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
3900: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n,            /*
3910: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
3920: 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65  ns in the source
3930: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
3940: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
3950: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
3960: 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73  LL, sort results
3970: 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20   using this key 
3980: 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63  */.  int distinc
3990: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
39a0: 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72  If >=0, make sur
39b0: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
39c0: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20  stinct */.  int 
39d0: 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20  eDest,          
39e0: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
39f0: 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
3a00: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ults */.  int iP
3a10: 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  arm,            
3a20: 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65 6e 74    /* An argument
3a30: 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73 61 6c   to the disposal
3a40: 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74   method */.  int
3a50: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20   iContinue,     
3a60: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
3a70: 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  e to continue wi
3a80: 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20  th next row */. 
3a90: 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20 20 20   int iBreak,    
3aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
3ab0: 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f   here to break o
3ac0: 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  ut of the inner 
3ad0: 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a  loop */.  char *
3ae0: 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  aff             
3af0: 20 20 2f 2a 20 61 66 66 69 6e 69 74 79 20 73 74    /* affinity st
3b00: 72 69 6e 67 20 69 66 20 65 44 65 73 74 20 69 73  ring if eDest is
3b10: 20 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 29 7b   SRT_Union */.){
3b20: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
3b30: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
3b40: 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69  t i;.  int hasDi
3b50: 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f  stinct;        /
3b60: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49  * True if the DI
3b70: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
3b80: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 0a 20 20  s present */..  
3b90: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
3ba0: 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
3bb0: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f  EList!=0 );..  /
3bc0: 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
3bd0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e   LIMIT clause on
3be0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
3bf0: 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20 74  ement, then do t
3c00: 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74 6f  he check.  ** to
3c10: 20 73 65 65 20 69 66 20 74 68 69 73 20 72 6f 77   see if this row
3c20: 20 73 68 6f 75 6c 64 20 62 65 20 6f 75 74 70 75   should be outpu
3c30: 74 2e 0a 20 20 2a 2f 0a 20 20 68 61 73 44 69 73  t..  */.  hasDis
3c40: 74 69 6e 63 74 20 3d 20 64 69 73 74 69 6e 63 74  tinct = distinct
3c50: 3e 3d 30 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  >=0 && pEList->n
3c60: 45 78 70 72 3e 30 3b 0a 20 20 69 66 28 20 70 4f  Expr>0;.  if( pO
3c70: 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61  rderBy==0 && !ha
3c80: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
3c90: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
3ca0: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 30 29 3b  , iContinue, 0);
3cb0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20  .  }..  /* Pull 
3cc0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
3cd0: 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  lumns..  */.  if
3ce0: 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20  ( nColumn>0 ){. 
3cf0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
3d00: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
3d10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3d20: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
3d30: 2c 20 73 72 63 54 61 62 2c 20 69 29 3b 0a 20 20  , srcTab, i);.  
3d40: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
3d50: 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73   nColumn = pELis
3d60: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 73 71  t->nExpr;.    sq
3d70: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
3d80: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
3d90: 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
3da0: 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   If the DISTINCT
3db0: 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65   keyword was pre
3dc0: 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45  sent on the SELE
3dd0: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  CT statement.  *
3de0: 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68  * and this row h
3df0: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66  as been seen bef
3e00: 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ore, then do not
3e10: 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20   make this row. 
3e20: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
3e30: 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
3e40: 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29  f( hasDistinct )
3e50: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
3e60: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  List!=0 );.    a
3e70: 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e  ssert( pEList->n
3e80: 45 78 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b  Expr==nColumn );
3e90: 0a 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63  .    codeDistinc
3ea0: 74 28 76 2c 20 64 69 73 74 69 6e 63 74 2c 20 69  t(v, distinct, i
3eb0: 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d  Continue, nColum
3ec0: 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64  n);.    if( pOrd
3ed0: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
3ee0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
3ef0: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f  , iContinue, nCo
3f00: 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lumn);.    }.  }
3f10: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ..  switch( eDes
3f20: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
3f30: 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  his mode, write 
3f40: 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c  each query resul
3f50: 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20  t to the key of 
3f60: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
3f70: 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d    ** table iParm
3f80: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
3f90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
3fa0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20  POUND_SELECT.   
3fb0: 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a   case SRT_Union:
3fc0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
3fd0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3fe0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c  MakeRecord, nCol
3ff0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  umn, 0);.      i
4000: 66 28 20 61 66 66 20 29 7b 0a 20 20 20 20 20 20  f( aff ){.      
4010: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
4020: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 61 66 66  ngeP3(v, -1, aff
4030: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
4040: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
4050: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4060: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
4070: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  arm, 0);.      b
4080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
4090: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
40a0: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
40b0: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
40c0: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
40d0: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
40e0: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
40f0: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
4100: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
4110: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
4120: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
4130: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
4140: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
4150: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
4160: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
4170: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4180: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4190: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
41a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
41b0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 61 66  angeP3(v, -1, af
41c0: 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  f, P3_STATIC);. 
41d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
41e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46  AddOp(v, OP_NotF
41f0: 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20 61 64 64  ound, iParm, add
4200: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
4210: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4220: 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61 72 6d  OP_Delete, iParm
4230: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
4240: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
4250: 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
4260: 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61  e result as data
4270: 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20   using a unique 
4280: 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  key..    */.    
4290: 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
42a0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
42b0: 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73  emTab: {.      s
42c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
42d0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
42e0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
42f0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
4300: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
4310: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
4320: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 29  se, pOrderBy, p)
4330: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4340: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4350: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
4360: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 30  wRowid, iParm, 0
4370: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4380: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4390: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
43a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
43b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
43c0: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b  sert, iParm, 0);
43d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
43e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
43f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4400: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a  _SUBQUERY.    /*
4410: 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74   If we are creat
4420: 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e  ing a set for an
4430: 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43   "expr IN (SELEC
4440: 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63  T ...)" construc
4450: 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  t,.    ** then t
4460: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
4470: 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20   single item on 
4480: 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74  the stack.  Writ
4490: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74  e this.    ** it
44a0: 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20  em into the set 
44b0: 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73  table with bogus
44c0: 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
44d0: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
44e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
44f0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
4500: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
4510: 20 20 20 20 20 69 6e 74 20 61 64 64 72 32 3b 0a       int addr2;.
4520: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
4530: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
4540: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4550: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  dOp(v, OP_NotNul
4560: 6c 2c 20 2d 31 2c 20 61 64 64 72 31 2b 33 29 3b  l, -1, addr1+3);
4570: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4580: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
4590: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
45a0: 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
45b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
45c0: 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  oto, 0, 0);.    
45d0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
45e0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
45f0: 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75  first glance you
4600: 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20   would think we 
4610: 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f  could optimize o
4620: 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ut the.        *
4630: 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68  * ORDER BY in th
4640: 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68  is case since th
4650: 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69  e order of entri
4660: 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20  es in the set.  
4670: 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f        ** does no
4680: 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74  t matter.  But t
4690: 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20  here might be a 
46a0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e  LIMIT clause, in
46b0: 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a   which.        *
46c0: 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72  * case the order
46d0: 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a   does matter */.
46e0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
46f0: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
4700: 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20  OrderBy, p);.   
4710: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4720: 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 20    char affinity 
4730: 3d 20 28 69 50 61 72 6d 3e 3e 31 36 29 26 30 78  = (iParm>>16)&0x
4740: 46 46 3b 0a 20 20 20 20 20 20 20 20 61 66 66 69  FF;.        affi
4750: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 43 6f  nity = sqlite3Co
4760: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
4770: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
4780: 2c 20 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20  , affinity);.   
4790: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
47a0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
47b0: 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66 66  cord, 1, 0, &aff
47c0: 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
47d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
47e0: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  dOp(v, OP_IdxIns
47f0: 65 72 74 2c 20 28 69 50 61 72 6d 26 30 78 30 30  ert, (iParm&0x00
4800: 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20  00FFFF), 0);.   
4810: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
4820: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
4830: 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 20 20  , addr2);.      
4840: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4850: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
4860: 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
4870: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
4880: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
4890: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
48a0: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
48b0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
48c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
48d0: 4d 65 6d 49 6e 74 2c 20 31 2c 20 69 50 61 72 6d  MemInt, 1, iParm
48e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
48f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4900: 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  Pop, nColumn, 0)
4910: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
4920: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
4930: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
4940: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
4950: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4960: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
4970: 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
4980: 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
4990: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
49a0: 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
49b0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
49c0: 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
49d0: 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
49e0: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
49f0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
4a00: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
4a10: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
4a20: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
4a30: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
4a40: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
4a50: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
4a60: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
4a70: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 29 3b  e, pOrderBy, p);
4a80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4aa0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
4ab0: 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29  Store, iParm, 1)
4ac0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
4ad0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
4ae0: 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
4af0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
4b00: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
4b10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
4b20: 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
4b30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
4b40: 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ERY */..    /* S
4b50: 65 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f 20  end the data to 
4b60: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  the callback fun
4b70: 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75  ction or to a su
4b80: 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68  broutine.  In th
4b90: 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66  e.    ** case of
4ba0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74   a subroutine, t
4bb0: 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74  he subroutine it
4bc0: 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69  self is responsi
4bd0: 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70  ble for.    ** p
4be0: 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 20  opping the data 
4bf0: 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a  from the stack..
4c00: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4c10: 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 0a  SRT_Subroutine:.
4c20: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c      case SRT_Cal
4c30: 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 69  lback: {.      i
4c40: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
4c50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4c60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
4c70: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
4c80: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  n, 0);.        p
4c90: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
4ca0: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
4cb0: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  p);.      }else 
4cc0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
4cd0: 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  ubroutine ){.   
4ce0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4cf0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75  AddOp(v, OP_Gosu
4d00: 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20  b, 0, iParm);.  
4d10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4d20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4d30: 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61  dOp(v, OP_Callba
4d40: 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  ck, nColumn, 0);
4d50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4d60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
4d70: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4d80: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20  _OMIT_TRIGGER). 
4d90: 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
4da0: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73  e results.  This
4db0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c   is used for SEL
4dc0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
4dd0: 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  nside.    ** the
4de0: 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47   body of a TRIGG
4df0: 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  ER.  The purpose
4e00: 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73   of such selects
4e10: 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20   is to call.    
4e20: 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ** user-defined 
4e30: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68  functions that h
4e40: 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73  ave side effects
4e50: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72  .  We do not car
4e60: 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74  e.    ** about t
4e70: 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
4e80: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  s of the select.
4e90: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
4ea0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
4eb0: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
4ec0: 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20  Discard );.     
4ed0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4ee0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f  p(v, OP_Pop, nCo
4ef0: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4f00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
4f10: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
4f20: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
4f30: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
4f40: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
4f50: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
4f60: 3e 69 4c 69 6d 69 74 3e 3d 30 20 26 26 20 70 4f  >iLimit>=0 && pO
4f70: 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
4f80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4f90: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c  p(v, OP_MemIncr,
4fa0: 20 2d 31 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b   -1, p->iLimit);
4fb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4fc0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65  AddOp(v, OP_IfMe
4fd0: 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  mZero, p->iLimit
4fe0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 20  , iBreak);.  }. 
4ff0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5000: 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70  .** Given an exp
5010: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65  ression list, ge
5020: 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f  nerate a KeyInfo
5030: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
5040: 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63  records.** the c
5050: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
5060: 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65  e for each expre
5070: 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78  ssion in that ex
5080: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
5090: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72  *.** If the Expr
50a0: 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52  List is an ORDER
50b0: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
50c0: 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20  clause then the 
50d0: 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79  resulting.** Key
50e0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
50f0: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
5100: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
5110: 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
5120: 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74  o.** implement t
5130: 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20  hat clause.  If 
5140: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
5150: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
5160: 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68  f a SELECT.** th
5170: 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  en the KeyInfo s
5180: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
5190: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
51a0: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
51b0: 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69  al.** index to i
51c0: 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49  mplement a DISTI
51d0: 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20  NCT test..**.** 
51e0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
51f0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
5200: 75 72 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72  ure is obtain fr
5210: 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20  om malloc.  The 
5220: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
5230: 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ion is responsib
5240: 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68  le for seeing th
5250: 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
5260: 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
5270: 2a 2a 20 66 72 65 65 64 2e 20 20 41 64 64 20 74  ** freed.  Add t
5280: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
5290: 74 75 72 65 20 74 6f 20 74 68 65 20 50 33 20 66  ture to the P3 f
52a0: 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64  ield of an opcod
52b0: 65 20 75 73 69 6e 67 0a 2a 2a 20 50 33 5f 4b 45  e using.** P3_KE
52c0: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73  YINFO_HANDOFF is
52d0: 20 74 68 65 20 75 73 75 61 6c 20 77 61 79 20 6f   the usual way o
52e0: 66 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74  f dealing with t
52f0: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b  his..*/.static K
5300: 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46  eyInfo *keyInfoF
5310: 72 6f 6d 45 78 70 72 4c 69 73 74 28 50 61 72 73  romExprList(Pars
5320: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c  e *pParse, ExprL
5330: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73  ist *pList){.  s
5340: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5350: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
5360: 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Expr;.  KeyInfo 
5370: 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  *pInfo;.  struct
5380: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
5390: 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
53a0: 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74  .  nExpr = pList
53b0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f  ->nExpr;.  pInfo
53c0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
53d0: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20   sizeof(*pInfo) 
53e0: 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28  + nExpr*(sizeof(
53f0: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a  CollSeq*)+1) );.
5400: 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20    if( pInfo ){. 
5410: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
5420: 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 6e  rder = (u8*)&pIn
5430: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d  fo->aColl[nExpr]
5440: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69  ;.    pInfo->nFi
5450: 65 6c 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20  eld = nExpr;.   
5460: 20 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e   pInfo->enc = EN
5470: 43 28 64 62 29 3b 0a 20 20 20 20 66 6f 72 28 69  C(db);.    for(i
5480: 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
5490: 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  >a; i<nExpr; i++
54a0: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
54b0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
54c0: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ;.      pColl = 
54d0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
54e0: 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
54f0: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
5500: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
5510: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62        pColl = db
5520: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
5530: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f     }.      pInfo
5540: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
5550: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
5560: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
5570: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
5580: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
5590: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
55a0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
55b0: 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e  ner loop was gen
55c0: 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e  erated using a n
55d0: 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79  on-null pOrderBy
55e0: 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68   argument,.** th
55f0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77  en the results w
5600: 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20  ere placed in a 
5610: 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74  sorter.  After t
5620: 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69  he loop is termi
5630: 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64  nated.** we need
5640: 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74   to run the sort
5650: 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  er and output th
5660: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20  e results.  The 
5670: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75  following.** rou
5680: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
5690: 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74  he code needed t
56a0: 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74  o do that..*/.st
56b0: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
56c0: 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61  teSortTail(.  Pa
56d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
56e0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
56f0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
5700: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53  ,       /* The S
5710: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
5720: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  */.  Vdbe *v,   
5730: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
5740: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
5750: 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e   VDBE */.  int n
5760: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 4e  Column,     /* N
5770: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
5780: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e   of data */.  in
5790: 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 2f  t eDest,       /
57a0: 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74  * Write the sort
57b0: 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ed results here 
57c0: 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 20  */.  int iParm  
57d0: 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61        /* Optiona
57e0: 6c 20 70 61 72 61 6d 65 74 65 72 20 61 73 73 6f  l parameter asso
57f0: 63 69 61 74 65 64 20 77 69 74 68 20 65 44 65 73  ciated with eDes
5800: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 72  t */.){.  int br
5810: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
5820: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69  akeLabel(v);.  i
5830: 6e 74 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65  nt cont = sqlite
5840: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
5850: 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  );.  int addr;. 
5860: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e 74   int iTab;.  int
5870: 20 70 73 65 75 64 6f 54 61 62 3b 0a 20 20 45 78   pseudoTab;.  Ex
5880: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
5890: 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
58a0: 0a 20 20 69 54 61 62 20 3d 20 70 4f 72 64 65 72  .  iTab = pOrder
58b0: 42 79 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20  By->iECursor;.  
58c0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
58d0: 61 6c 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73 74  allback || eDest
58e0: 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65  ==SRT_Subroutine
58f0: 20 29 7b 0a 20 20 20 20 70 73 65 75 64 6f 54 61   ){.    pseudoTa
5900: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
5910: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
5920: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
5930: 70 65 6e 50 73 65 75 64 6f 2c 20 70 73 65 75 64  penPseudo, pseud
5940: 6f 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71  oTab, 0);.    sq
5950: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5960: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
5970: 6e 73 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 6e  ns, pseudoTab, n
5980: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20 61  Column);.  }.  a
5990: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
59a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
59b0: 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 62 72 6b  _Sort, iTab, brk
59c0: 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28  );.  codeOffset(
59d0: 76 2c 20 70 2c 20 63 6f 6e 74 2c 20 30 29 3b 0a  v, p, cont, 0);.
59e0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
59f0: 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c 20 65 44 65  _Callback || eDe
5a00: 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69  st==SRT_Subrouti
5a10: 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ne ){.    sqlite
5a20: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5a30: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b  _Integer, 1, 0);
5a40: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
5a50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
5a60: 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64  lumn, iTab, pOrd
5a70: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 29  erBy->nExpr + 1)
5a80: 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ;.  switch( eDes
5a90: 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
5aa0: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
5ab0: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
5ac0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5ad0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
5ae0: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
5af0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
5b00: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5b10: 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20  _Pull, 1, 0);.  
5b20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5b30: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72  ddOp(v, OP_Inser
5b40: 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  t, iParm, 0);.  
5b50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5b60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5b70: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
5b80: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
5b90: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5ba0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
5bb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5bc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  ddOp(v, OP_NotNu
5bd0: 6c 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 56  ll, -1, sqlite3V
5be0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
5bf0: 29 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  )+3);.      sqli
5c00: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5c10: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
5c20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5c30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
5c40: 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65  , 0, sqlite3Vdbe
5c50: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
5c60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5c70: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  VdbeOp3(v, OP_Ma
5c80: 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20  keRecord, 1, 0, 
5c90: 22 63 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  "c", P3_STATIC);
5ca0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5cb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
5cc0: 78 49 6e 73 65 72 74 2c 20 28 69 50 61 72 6d 26  xInsert, (iParm&
5cd0: 30 78 30 30 30 30 46 46 46 46 29 2c 20 30 29 3b  0x0000FFFF), 0);
5ce0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5cf0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
5d00: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
5d10: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
5d20: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
5d30: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5d40: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
5d50: 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
5d60: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
5d70: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
5d80: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
5d90: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
5da0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
5db0: 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63  case SRT_Callbac
5dc0: 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  k:.    case SRT_
5dd0: 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20  Subroutine: {.  
5de0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
5df0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5e00: 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  p(v, OP_Insert, 
5e10: 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20  pseudoTab, 0);. 
5e20: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5e30: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
5e40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5e50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
5e60: 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61 62 2c  lumn, pseudoTab,
5e70: 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
5e80: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
5e90: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
5ea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5eb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
5ec0: 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  lback, nColumn, 
5ed0: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
5ee0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5ef0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5f00: 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29  Gosub, 0, iParm)
5f10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5f20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5f30: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
5f40: 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
5f50: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
5f60: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
5f70: 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
5f80: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 68 65 6e  of the loop when
5f90: 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
5fa0: 61 63 68 65 64 0a 20 20 2a 2f 0a 20 20 69 66 28  ached.  */.  if(
5fb0: 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b   p->iLimit>=0 ){
5fc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5fd0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
5fe0: 6e 63 72 2c 20 2d 31 2c 20 70 2d 3e 69 4c 69 6d  ncr, -1, p->iLim
5ff0: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
6000: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6010: 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c  IfMemZero, p->iL
6020: 69 6d 69 74 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a  imit, brk);.  }.
6030: 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d  .  /* The bottom
6040: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a   of the loop.  *
6050: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
6060: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63  esolveLabel(v, c
6070: 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ont);.  sqlite3V
6080: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
6090: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
60a0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
60b0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 62  esolveLabel(v, b
60c0: 72 6b 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74  rk);.  if( eDest
60d0: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c  ==SRT_Callback |
60e0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75 62  | eDest==SRT_Sub
60f0: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 73  routine ){.    s
6100: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6110: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65  v, OP_Close, pse
6120: 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a  udoTab, 0);.  }.
6130: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6140: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
6150: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
6160: 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69  g the 'declarati
6170: 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a  on type' of the.
6180: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  ** expression pE
6190: 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20  xpr. The string 
61a0: 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61  may be treated a
61b0: 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20  s static by the 
61c0: 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  caller..**.** Th
61d0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
61e0: 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74 20  pe is the exact 
61f0: 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69 74  datatype definit
6200: 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66 72  ion extracted fr
6210: 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  om the.** origin
6220: 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  al CREATE TABLE 
6230: 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65  statement if the
6240: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
6250: 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20   column. The.** 
6260: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
6270: 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65   for a ROWID fie
6280: 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45  ld is INTEGER. E
6290: 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65  xactly when an e
62a0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
62b0: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
62c0: 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  umn can be compl
62d0: 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e  ex in the presen
62e0: 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65 73  ce of subqueries
62f0: 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d  . The.** result-
6300: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  set expression i
6310: 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  n all of the fol
6320: 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74  lowing SELECT st
6330: 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20  atements is .** 
6340: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
6350: 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63  umn by this func
6360: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45  tion..**.**   SE
6370: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
6380: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
6390: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
63a0: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
63b0: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
63c0: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c  M tbl);.**   SEL
63d0: 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45  ECT abc FROM (SE
63e0: 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20  LECT col AS abc 
63f0: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a  FROM tbl);.** .*
6400: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
6410: 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65  n type for any e
6420: 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20  xpression other 
6430: 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73  than a column is
6440: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
6450: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c   const char *col
6460: 75 6d 6e 54 79 70 65 28 0a 20 20 4e 61 6d 65 43  umnType(.  NameC
6470: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20  ontext *pNC, .  
6480: 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63  Expr *pExpr,.  c
6490: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
64a0: 69 67 69 6e 44 62 2c 0a 20 20 63 6f 6e 73 74 20  iginDb,.  const 
64b0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 54  char **pzOriginT
64c0: 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ab,.  const char
64d0: 20 2a 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29   **pzOriginCol.)
64e0: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
64f0: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61  zType = 0;.  cha
6500: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e  r const *zOrigin
6510: 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  Db = 0;.  char c
6520: 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 54 61 62  onst *zOriginTab
6530: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
6540: 73 74 20 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d  st *zOriginCol =
6550: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69   0;.  int j;.  i
6560: 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70  f( pExpr==0 || p
6570: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20  NC->pSrcList==0 
6580: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
6590: 2a 20 54 68 65 20 54 4b 5f 41 53 20 6f 70 65 72  * The TK_AS oper
65a0: 61 74 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 6f 63  ator can only oc
65b0: 63 75 72 20 69 6e 20 4f 52 44 45 52 20 42 59 2c  cur in ORDER BY,
65c0: 20 47 52 4f 55 50 20 42 59 2c 20 48 41 56 49 4e   GROUP BY, HAVIN
65d0: 47 2c 0a 20 20 2a 2a 20 61 6e 64 20 4c 49 4d 49  G,.  ** and LIMI
65e0: 54 20 63 6c 61 75 73 65 73 2e 20 20 42 75 74 20  T clauses.  But 
65f0: 70 45 78 70 72 20 6f 72 69 67 69 6e 61 74 65 73  pExpr originates
6600: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
6610: 65 74 20 6f 66 20 61 0a 20 20 2a 2a 20 53 45 4c  et of a.  ** SEL
6620: 45 43 54 2e 20 20 53 6f 20 70 45 78 70 72 20 63  ECT.  So pExpr c
6630: 61 6e 20 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e  an never contain
6640: 20 61 6e 20 41 53 20 6f 70 65 72 61 74 6f 72 2e   an AS operator.
6650: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
6660: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53  pExpr->op!=TK_AS
6670: 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
6680: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
6690: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
66a0: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
66b0: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
66c0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
66d0: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c  n is a column. L
66e0: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
66f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65  the column is be
6700: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74  ing.      ** ext
6710: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e  racted from in N
6720: 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c  ameContext.pSrcL
6730: 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20  ist. This table 
6740: 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20  may be real.    
6750: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61    ** database ta
6760: 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72  ble or a subquer
6770: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
6780: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
6790: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
67a0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
67b0: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
67c0: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
67d0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
67e0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
67f0: 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c  * Select the col
6800: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
6810: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69   from */.      i
6820: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
6830: 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e  >iColumn;  /* In
6840: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
6850: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77   pTab */.      w
6860: 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54  hile( pNC && !pT
6870: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72  ab ){.        Sr
6880: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
6890: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
68a0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
68b0: 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ;j<pTabList->nSr
68c0: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
68d0: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78  [j].iCursor!=pEx
68e0: 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b  pr->iTable;j++);
68f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
6900: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b  TabList->nSrc ){
6910: 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20  .          pTab 
6920: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
6930: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
6940: 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e   pS = pTabList->
6950: 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[j].pSelect;.  
6960: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6970: 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43         pNC = pNC
6980: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
6990: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
69a0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
69b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 49 58 20  .        /* FIX 
69c0: 4d 45 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  ME:.        ** T
69d0: 68 69 73 20 63 61 6e 20 6f 63 63 75 72 73 20 69  his can occurs i
69e0: 66 20 79 6f 75 20 68 61 76 65 20 73 6f 6d 65 74  f you have somet
69f0: 68 69 6e 67 20 6c 69 6b 65 20 22 53 45 4c 45 43  hing like "SELEC
6a00: 54 20 6e 65 77 2e 78 3b 22 20 69 6e 73 69 64 65  T new.x;" inside
6a10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72  .        ** a tr
6a20: 69 67 67 65 72 2e 20 20 49 6e 20 6f 74 68 65 72  igger.  In other
6a30: 20 77 6f 72 64 73 2c 20 69 66 20 79 6f 75 20 72   words, if you r
6a40: 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 70 65  eference the spe
6a50: 63 69 61 6c 20 22 6e 65 77 22 0a 20 20 20 20 20  cial "new".     
6a60: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74     ** table in t
6a70: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
6a80: 20 61 20 73 65 6c 65 63 74 2e 20 20 57 65 20 64   a select.  We d
6a90: 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 67 6f 6f  o not have a goo
6aa0: 64 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a  d way.        **
6ab0: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61 63 74   to find the act
6ac0: 75 61 6c 20 74 61 62 6c 65 20 74 79 70 65 2c 20  ual table type, 
6ad0: 73 6f 20 63 61 6c 6c 20 69 74 20 22 54 45 58 54  so call it "TEXT
6ae0: 22 2e 20 20 54 68 69 73 20 69 73 20 72 65 61 6c  ".  This is real
6af0: 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  ly.        ** so
6b00: 6d 65 74 68 69 6e 67 20 6f 66 20 61 20 62 75 67  mething of a bug
6b10: 2c 20 62 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b  , but I do not k
6b20: 6e 6f 77 20 68 6f 77 20 74 6f 20 66 69 78 20 69  now how to fix i
6b30: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t..        **.  
6b40: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
6b50: 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64  de does not prod
6b60: 75 63 65 20 74 68 65 20 63 6f 72 72 65 63 74 20  uce the correct 
6b70: 61 6e 73 77 65 72 20 2d 20 69 74 20 6a 75 73 74  answer - it just
6b80: 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20 20 20   prevents.      
6b90: 20 20 2a 2a 20 61 20 73 65 67 66 61 75 6c 74 2e    ** a segfault.
6ba0: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 31 32    See ticket #12
6bb0: 32 39 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  29..        */. 
6bc0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
6bd0: 54 45 58 54 22 3b 0a 20 20 20 20 20 20 20 20 62  TEXT";.        b
6be0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
6bf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
6c00: 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b );.      if( p
6c10: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  S ){.        /* 
6c20: 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61  The "table" is a
6c30: 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65  ctually a sub-se
6c40: 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69  lect or a view i
6c50: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
6c60: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
6c70: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
6c80: 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65  ment. Return the
6c90: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
6ca0: 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20  e and origin.   
6cb0: 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72       ** data for
6cc0: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
6cd0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75  column of the su
6ce0: 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20  b-select..      
6cf0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
6d00: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
6d10: 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <pS->pEList->nEx
6d20: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
6d30: 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65  /* If iCol is le
6d40: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
6d50: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
6d60: 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20  n requests the. 
6d70: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
6d80: 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  d of the sub-sel
6d90: 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69  ect or view. Thi
6da0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
6db0: 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20  legal (see .    
6dc0: 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61        ** test ca
6dd0: 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20  se misc2.2.2) - 
6de0: 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  it always evalua
6df0: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20  tes to NULL..   
6e00: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
6e10: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
6e20: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45  sNC;.          E
6e30: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
6e40: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
6e50: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  pr;.          sN
6e60: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
6e70: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20  >pSrc;.         
6e80: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a   sNC.pNext = 0;.
6e90: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50            sNC.pP
6ea0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
6eb0: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se;.          zT
6ec0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
6ed0: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
6ee0: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
6ef0: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
6f00: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
6f10: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
6f20: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
6f30: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
6f40: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
6f50: 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20  assert( !pS );. 
6f60: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
6f70: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
6f80: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
6f90: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
6fa0: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
6fb0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
6fc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
6fd0: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
6fe0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
6ff0: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20  EGER";.         
7000: 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72   zOriginCol = "r
7010: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d  owid";.        }
7020: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7030: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
7040: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
7050: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
7060: 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  nCol = pTab->aCo
7070: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
7080: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7090: 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 70 54   zOriginTab = pT
70a0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
70b0: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
70c0: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
70d0: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
70e0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
70f0: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  NC->pParse->db, 
7100: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
7110: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
7120: 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  nDb = pNC->pPars
7130: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
7140: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
7150: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7160: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
7170: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7180: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
7190: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
71a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
71b0: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
71c0: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
71d0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
71e0: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
71f0: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
7200: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
7210: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
7220: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
7230: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
7240: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
7250: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
7260: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
7270: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
7280: 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
7290: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
72a0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
72b0: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63  ;.      sNC.pSrc
72c0: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
72d0: 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  .      sNC.pNext
72e0: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e   = pNC;.      sN
72f0: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
7300: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54  pParse;.      zT
7310: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
7320: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
7330: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
7340: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
7350: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
7360: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
7370: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69    .  if( pzOrigi
7380: 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nDb ){.    asser
7390: 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26  t( pzOriginTab &
73a0: 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b  & pzOriginCol );
73b0: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62  .    *pzOriginDb
73c0: 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20   = zOriginDb;.  
73d0: 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d    *pzOriginTab =
73e0: 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20   zOriginTab;.   
73f0: 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20   *pzOriginCol = 
7400: 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a  zOriginCol;.  }.
7410: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
7420: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
7430: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
7440: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
7450: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
7460: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
7470: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
7480: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
7490: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
74a0: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
74b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
74c0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
74d0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
74e0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
74f0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
7500: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
7510: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
7520: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
7530: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
7540: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
7550: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
7560: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
7570: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
7580: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
7590: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
75a0: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f  e = pParse;.  fo
75b0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
75c0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
75d0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
75e0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
75f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
7600: 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20  zOrigDb = 0;.   
7610: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
7620: 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63  igTab = 0;.    c
7630: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
7640: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  Col = 0;.    con
7650: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  st char *zType =
7660: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
7670: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
7680: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
7690: 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  Col);..    /* Th
76a0: 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65  e vdbe must make
76b0: 20 69 74 27 73 20 6f 77 6e 20 63 6f 70 79 20 6f   it's own copy o
76c0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
76d0: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
76e0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
76f0: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
7700: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
7710: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
7720: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
7730: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
7740: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
7750: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
7760: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
7770: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
7780: 20 7a 54 79 70 65 2c 20 50 33 5f 54 52 41 4e 53   zType, P3_TRANS
7790: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
77a0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
77b0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
77c0: 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62  ATABASE, zOrigDb
77d0: 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b  , P3_TRANSIENT);
77e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
77f0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
7800: 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20   COLNAME_TABLE, 
7810: 7a 4f 72 69 67 54 61 62 2c 20 50 33 5f 54 52 41  zOrigTab, P3_TRA
7820: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
7830: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
7840: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
7850: 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f  _COLUMN, zOrigCo
7860: 6c 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e 54 29  l, P3_TRANSIENT)
7870: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
7880: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
7890: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
78a0: 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f  VDBE the names o
78b0: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
78c0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
78d0: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
78e0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  n is used to pro
78f0: 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f  vide the.** azCo
7900: 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68  l[] values in th
7910: 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  e callback..*/.s
7920: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
7930: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
7940: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
7950: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
7960: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
7970: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
7980: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
7990: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
79a0: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
79b0: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
79c0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
79d0: 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  et */.){.  Vdbe 
79e0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
79f0: 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  be;.  int i, j;.
7a00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
7a10: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
7a20: 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f  t fullNames, sho
7a30: 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65  rtNames;..#ifnde
7a40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
7a50: 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68  PLAIN.  /* If th
7a60: 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  is is an EXPLAIN
7a70: 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70  , skip this step
7a80: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
7a90: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
7aa0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
7ab0: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 76  dif..  assert( v
7ac0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
7ad0: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
7ae0: 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69   || v==0 || sqli
7af0: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
7b00: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50  ) ) return;.  pP
7b10: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
7b20: 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d  t = 1;.  fullNam
7b30: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
7b40: 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
7b50: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f  Names)!=0;.  sho
7b60: 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  rtNames = (db->f
7b70: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
7b80: 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ortColNames)!=0;
7b90: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
7ba0: 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69  tNumCols(v, pELi
7bb0: 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f  st->nExpr);.  fo
7bc0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
7bd0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
7be0: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70    Expr *p;.    p
7bf0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
7c00: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
7c10: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
7c20: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
7c30: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20  a[i].zName ){.  
7c40: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
7c50: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
7c60: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Name;.      sqli
7c70: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
7c80: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
7c90: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  NAME, zName, str
7ca0: 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  len(zName));.   
7cb0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
7cc0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70   }.    if( p->op
7cd0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
7ce0: 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  TabList ){.     
7cf0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
7d00: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
7d10: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
7d20: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
7d30: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
7d40: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20  abList->nSrc && 
7d50: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
7d60: 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c  Cursor!=p->iTabl
7d70: 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  e; j++){}.      
7d80: 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69  assert( j<pTabLi
7d90: 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  st->nSrc );.    
7da0: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
7db0: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
7dc0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
7dd0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
7de0: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
7df0: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
7e00: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
7e10: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
7e20: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
7e30: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
7e40: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
7e50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7e60: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
7e70: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
7e80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7e90: 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20   !shortNames && 
7ea0: 21 66 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d  !fullNames && p-
7eb0: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
7ec0: 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  an.z[0] ){.     
7ed0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
7ee0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
7ef0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68  OLNAME_NAME, (ch
7f00: 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70  ar*)p->span.z, p
7f10: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20  ->span.n);.     
7f20: 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e   }else if( fullN
7f30: 61 6d 65 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e  ames || (!shortN
7f40: 61 6d 65 73 20 26 26 20 70 54 61 62 4c 69 73 74  ames && pTabList
7f50: 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20  ->nSrc>1) ){.   
7f60: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
7f70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
7f80: 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20  ar *zTab;. .    
7f90: 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c      zTab = pTabL
7fa0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73  ist->a[j].zAlias
7fb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 75  ;.        if( fu
7fc0: 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d  llNames || zTab=
7fd0: 3d 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62  =0 ) zTab = pTab
7fe0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
7ff0: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
8000: 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20  g(&zName, zTab, 
8010: 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72  ".", zCol, (char
8020: 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  *)0);.        sq
8030: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8040: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8050: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 50  E_NAME, zName, P
8060: 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  3_DYNAMIC);.    
8070: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8080: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8090: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
80a0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c  NAME_NAME, zCol,
80b0: 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a   strlen(zCol));.
80c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
80d0: 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20  e if( p->span.z 
80e0: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
80f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8100: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8110: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
8120: 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61  E, (char*)p->spa
8130: 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b  n.z, p->span.n);
8140: 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  .      /* sqlite
8150: 33 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61  3VdbeCompressSpa
8160: 63 65 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a  ce(v, addr); */.
8170: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8180: 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b   char zName[30];
8190: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
81a0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
81b0: 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29  || pTabList==0 )
81c0: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
81d0: 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64  zName, "column%d
81e0: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73  ", i+1);.      s
81f0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8200: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8210: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
8220: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
8230: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
8240: 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  pes(pParse, pTab
8250: 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  List, pEList);.}
8260: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8270: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
8280: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  ELECT./*.** Name
8290: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
82a0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
82b0: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
82c0: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
82d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
82e0: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
82f0: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
8300: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
8310: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
8320: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
8330: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
8340: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
8350: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
8360: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
8370: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
8380: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
8390: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
83a0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
83b0: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
83c0: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
83d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
83e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
83f0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
8400: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
8410: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
8420: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
8430: 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53   int prepSelectS
8440: 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65  tmt(Parse*, Sele
8450: 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ct*);../*.** Giv
8460: 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
8470: 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
8480: 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
8490: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
84a0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
84b0: 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
84c0: 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
84d0: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
84e0: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
84f0: 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e  rse, char *zTabN
8500: 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ame, Select *pSe
8510: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
8520: 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  pTab;.  int i, j
8530: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
8540: 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  List;.  Column *
8550: 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20 20  aCol, *pCol;..  
8560: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e  while( pSelect->
8570: 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74  pPrior ) pSelect
8580: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69   = pSelect->pPri
8590: 6f 72 3b 0a 20 20 69 66 28 20 70 72 65 70 53 65  or;.  if( prepSe
85a0: 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c  lectStmt(pParse,
85b0: 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20   pSelect) ){.   
85c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
85d0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
85e0: 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
85f0: 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 20 29 7b  , pSelect, 0) ){
8600: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8610: 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69   }.  pTab = sqli
8620: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
8630: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
8640: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
8650: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
8660: 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
8670: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
8680: 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74  zTabName ? sqlit
8690: 65 53 74 72 44 75 70 28 7a 54 61 62 4e 61 6d 65  eStrDup(zTabName
86a0: 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20  ) : 0;.  pEList 
86b0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
86c0: 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  t;.  pTab->nCol 
86d0: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
86e0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
86f0: 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61  >nCol>0 );.  pTa
8700: 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d  b->aCol = aCol =
8710: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
8720: 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c  izeof(pTab->aCol
8730: 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20  [0])*pTab->nCol 
8740: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  );.  for(i=0, pC
8750: 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d  ol=aCol; i<pTab-
8760: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
8770: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
8780: 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68 61 72 20  , *pR;.    char 
8790: 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63 68 61 72  *zType;.    char
87a0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74   *zName;.    int
87b0: 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 6c   nName;.    Coll
87c0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
87d0: 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61 6d  int cnt;.    Nam
87e0: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
87f0: 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e    .    /* Get an
8800: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d   appropriate nam
8810: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
8820: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20  .    */.    p = 
8830: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
8840: 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
8850: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  p->pRight==0 || 
8860: 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  p->pRight->token
8870: 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  .z==0 || p->pRig
8880: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d  ht->token.z[0]!=
8890: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e  0 );.    if( (zN
88a0: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
88b0: 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  i].zName)!=0 ){.
88c0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
88d0: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
88e0: 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70  an "AS <name>" p
88f0: 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65  hrase, use <name
8900: 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  > as the name */
8910: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
8920: 71 6c 69 74 65 53 74 72 44 75 70 28 7a 4e 61 6d  qliteStrDup(zNam
8930: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  e);.    }else if
8940: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  ( p->op==TK_DOT 
8950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
8960: 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74 29  & (pR=p->pRight)
8970: 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e  !=0 && pR->token
8980: 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e  .z && pR->token.
8990: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  z[0] ){.      /*
89a0: 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   For columns of 
89b0: 74 68 65 20 66 72 6f 6d 20 41 2e 42 20 75 73 65  the from A.B use
89c0: 20 42 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a   B as the name *
89d0: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
89e0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
89f0: 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e 29  %T", &pR->token)
8a00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8a10: 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  p->span.z && p->
8a20: 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  span.z[0] ){.   
8a30: 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72     /* Use the or
8a40: 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74  iginal text of t
8a50: 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  he column expres
8a60: 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65  sion as its name
8a70: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
8a80: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
8a90: 28 22 25 54 22 2c 20 26 70 2d 3e 73 70 61 6e 29  ("%T", &p->span)
8aa0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8ab0: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65 6c 73     /* If all els
8ac0: 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20 75 70  e fails, make up
8ad0: 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20   a name */.     
8ae0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
8af0: 4d 50 72 69 6e 74 66 28 22 63 6f 6c 75 6d 6e 25  MPrintf("column%
8b00: 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 7d 0a  d", i+1);.    }.
8b10: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
8b20: 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  te(zName);.    i
8b30: 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  f( sqlite3Malloc
8b40: 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20  Failed() ){.    
8b50: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
8b60: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
8b70: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
8b80: 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 72 65   pTab);.      re
8b90: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  turn 0;.    }.. 
8ba0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
8bb0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
8bc0: 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74  is unique.  If t
8bd0: 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75  he name is not u
8be0: 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70  nique,.    ** ap
8bf0: 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74  pend a integer t
8c00: 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
8c10: 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
8c20: 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
8c30: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
8c40: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28  zName);.    for(
8c50: 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  j=cnt=0; j<i; j+
8c60: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
8c70: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f  lite3StrICmp(aCo
8c80: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  l[j].zName, zNam
8c90: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
8ca0: 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20   zName[nName] = 
8cb0: 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  0;.        zName
8cc0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
8cd0: 66 28 22 25 7a 3a 25 64 22 2c 20 7a 4e 61 6d 65  f("%z:%d", zName
8ce0: 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20  , ++cnt);.      
8cf0: 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    j = -1;.      
8d00: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
8d10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
8d20: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e      }.    pCol->
8d30: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a  zName = zName;..
8d40: 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 74      /* Get the t
8d50: 79 70 65 6e 61 6d 65 2c 20 74 79 70 65 20 61 66  ypename, type af
8d60: 66 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c  finity, and coll
8d70: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
8d80: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  or the.    ** co
8d90: 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lumn..    */.   
8da0: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
8db0: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
8dc0: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
8dd0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
8de0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c  .    zType = sql
8df0: 69 74 65 53 74 72 44 75 70 28 63 6f 6c 75 6d 6e  iteStrDup(column
8e00: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
8e10: 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70 43 6f   0, 0));.    pCo
8e20: 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a 54 79 70 65  l->zType = zType
8e30: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
8e40: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
8e50: 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20  prAffinity(p);. 
8e60: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
8e70: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
8e80: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
8e90: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
8ea0: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73   pCol->zColl = s
8eb0: 71 6c 69 74 65 53 74 72 44 75 70 28 70 43 6f 6c  qliteStrDup(pCol
8ec0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
8ed0: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b  .  }.  pTab->iPK
8ee0: 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  ey = -1;.  retur
8ef0: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
8f00: 20 50 72 65 70 61 72 65 20 61 20 53 45 4c 45 43   Prepare a SELEC
8f10: 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  T statement for 
8f20: 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20 64 6f  processing by do
8f30: 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
8f40: 67 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a  g.** things:.**.
8f50: 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20  **    (1)  Make 
8f60: 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72  sure VDBE cursor
8f70: 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
8f80: 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  en assigned to e
8f90: 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  very.**         
8fa0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46  element of the F
8fb0: 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
8fc0: 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69  *    (2)  Fill i
8fd0: 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e  n the pTabList->
8fe0: 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20  a[].pTab fields 
8ff0: 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  in the SrcList t
9000: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  hat .**         
9010: 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61  defines FROM cla
9020: 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73  use.  When views
9030: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
9040: 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20  ROM clause,.**  
9050: 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62         fill pTab
9060: 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63  List->a[].pSelec
9070: 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  t with a copy of
9080: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
9090: 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
90a0: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
90b0: 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f   the view.  A co
90c0: 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
90d0: 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a  e view's SELECT.
90e0: 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65  **         state
90f0: 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20  ment so that we 
9100: 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66  can freely modif
9110: 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74  y or delete that
9120: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
9130: 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f        without wo
9140: 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73  rrying about mes
9150: 73 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 73  sing up the pres
9160: 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74  istent represent
9170: 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20  ation.**        
9180: 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a   of the view..**
9190: 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20  .**    (3)  Add 
91a0: 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45  terms to the WHE
91b0: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63  RE clause to acc
91c0: 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  omodate the NATU
91d0: 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
91e0: 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
91f0: 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
9200: 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
9210: 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
9220: 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  4)  Scan the lis
9230: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
9240: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
9250: 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
9260: 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
9270: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
9280: 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
9290: 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
92a0: 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
92b0: 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
92c0: 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
92d0: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
92e0: 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
92f0: 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
9300: 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
9310: 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
9320: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
9330: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
9340: 74 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65  there are proble
9350: 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ms, leave an err
9360: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e  or message.** in
9370: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
9380: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  rn non-zero..*/.
9390: 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 53  static int prepS
93a0: 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65 20  electStmt(Parse 
93b0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
93c0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  *p){.  int i, j,
93d0: 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69 73   k, rc;.  SrcLis
93e0: 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45  t *pTabList;.  E
93f0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
9400: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
9410: 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a  t_item *pFrom;..
9420: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d    if( p==0 || p-
9430: 3e 70 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69  >pSrc==0 || sqli
9440: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
9450: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
9460: 31 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73  1;.  }.  pTabLis
9470: 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
9480: 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
9490: 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  t;..  /* Make su
94a0: 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  re cursor number
94b0: 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
94c0: 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72  gned to all entr
94d0: 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  ies in.  ** the 
94e0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
94f0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
9500: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ent..  */.  sqli
9510: 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
9520: 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
9530: 70 2d 3e 70 53 72 63 29 3b 0a 0a 20 20 2f 2a 20  p->pSrc);..  /* 
9540: 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61  Look up every ta
9550: 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65  ble named in the
9560: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
9570: 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a  the select.  If.
9580: 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66    ** an entry of
9590: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
95a0: 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69   is a subquery i
95b0: 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c  nstead of a tabl
95c0: 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20  e or view,.  ** 
95d0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72  then create a tr
95e0: 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74  ansient table st
95f0: 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72  ructure to descr
9600: 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ibe the subquery
9610: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
9620: 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
9630: 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
9640: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
9650: 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
9660: 2a 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  *pTab;.    if( p
9670: 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b  From->pTab!=0 ){
9680: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
9690: 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72  tatement has alr
96a0: 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72  eady been prepar
96b0: 65 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ed.  There is no
96c0: 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74   need.      ** t
96d0: 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f  o go further. */
96e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
96f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  ==0 );.      ret
9700: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
9710: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d   if( pFrom->zNam
9720: 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  e==0 ){.#ifndef 
9730: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
9740: 55 45 52 59 0a 20 20 20 20 20 20 2f 2a 20 41 20  UERY.      /* A 
9750: 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
9760: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
9770: 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
9780: 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
9790: 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20  >pSelect!=0 );. 
97a0: 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e       if( pFrom->
97b0: 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20  zAlias==0 ){.   
97c0: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69       pFrom->zAli
97d0: 61 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73  as =.          s
97e0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 73  qlite3MPrintf("s
97f0: 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25  qlite_subquery_%
9800: 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 46 72 6f  p_", (void*)pFro
9810: 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
9820: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
9830: 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
9840: 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
9850: 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
9860: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9870: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
9880: 74 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 2d  t(pParse, pFrom-
9890: 3e 7a 41 6c 69 61 73 2c 20 70 46 72 6f 6d 2d 3e  >zAlias, pFrom->
98a0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
98b0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
98c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
98d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
98e0: 2a 20 54 68 65 20 69 73 45 70 68 65 6d 20 66 6c  * The isEphem fl
98f0: 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
9900: 74 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  t the Table stru
9910: 63 74 75 72 65 20 68 61 73 20 62 65 65 6e 0a 20  cture has been. 
9920: 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61       ** dynamica
9930: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  lly allocated an
9940: 64 20 6d 61 79 20 62 65 20 66 72 65 65 64 20 61  d may be freed a
9950: 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20  t any time.  In 
9960: 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20  other words,.   
9970: 20 20 20 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f     ** pTab is no
9980: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  t pointing to a 
9990: 70 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65  persistent table
99a0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
99b0: 64 65 66 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a  defines.      **
99c0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 63 68   part of the sch
99d0: 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54  ema. */.      pT
99e0: 61 62 2d 3e 69 73 45 70 68 65 6d 20 3d 20 31 3b  ab->isEphem = 1;
99f0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
9a00: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
9a10: 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
9a20: 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
9a30: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
9a40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9a50: 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
9a60: 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
9a70: 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20  ab = pTab = .   
9a80: 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
9a90: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 70  teTable(pParse,p
9aa0: 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f  From->zName,pFro
9ab0: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
9ac0: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
9ad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
9ae0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
9af0: 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
9b00: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
9b10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
9b20: 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51   || !defined (SQ
9b30: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
9b40: 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66  LTABLE).      if
9b50: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
9b60: 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  || IsVirtual(pTa
9b70: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  b) ){.        /*
9b80: 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69   We reach here i
9b90: 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
9ba0: 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20  e is a really a 
9bb0: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20  view */.        
9bc0: 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
9bd0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
9be0: 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
9bf0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9c00: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
9c10: 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d       /* If pFrom
9c20: 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 69 74 20  ->pSelect!=0 it 
9c30: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
9c40: 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20 20  ling with a.    
9c50: 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74 68      ** view with
9c60: 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65 20  in a view.  The 
9c70: 53 45 4c 45 43 54 20 73 74 72 75 63 74 75 72 65  SELECT structure
9c80: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
9c90: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70  n.        ** cop
9ca0: 69 65 64 20 62 79 20 74 68 65 20 6f 75 74 65 72  ied by the outer
9cb0: 20 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e 20   view so we can 
9cc0: 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73 74  skip the copy st
9cd0: 65 70 20 68 65 72 65 0a 20 20 20 20 20 20 20 20  ep here.        
9ce0: 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ** in the inner 
9cf0: 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  view..        */
9d00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72  .        if( pFr
9d10: 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
9d20: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f  {.          pFro
9d30: 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
9d40: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 54  ite3SelectDup(pT
9d50: 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ab->pSelect);.  
9d60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9d70: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
9d80: 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
9d90: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
9da0: 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
9db0: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
9dc0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ns..  */.  if( s
9dd0: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
9de0: 28 70 50 61 72 73 65 2c 20 70 29 20 29 20 72 65  (pParse, p) ) re
9df0: 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f  turn 1;..  /* Fo
9e00: 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
9e10: 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
9e20: 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
9e30: 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
9e40: 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
9e50: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
9e60: 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
9e70: 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
9e80: 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
9e90: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
9ea0: 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
9eb0: 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
9ec0: 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
9ed0: 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
9ee0: 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f  _ALL operator fo
9ef0: 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20  r each "*" that 
9f00: 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  it found in the 
9f10: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a  column list..  *
9f20: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
9f30: 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f  code just has to
9f40: 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41   locate the TK_A
9f50: 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  LL expressions a
9f60: 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65  nd expand.  ** e
9f70: 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c  ach one to the l
9f80: 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d  ist of all colum
9f90: 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
9fa0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
9fb0: 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
9fc0: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
9fd0: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
9fe0: 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
9ff0: 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
a000: 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
a010: 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
a020: 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
a030: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c    Expr *pE = pEL
a040: 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
a050: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
a060: 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
a070: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
a080: 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
a090: 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69  Right && pE->pRi
a0a0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a  ght->op==TK_ALL.
a0b0: 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e           && pE->
a0c0: 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65  pLeft && pE->pLe
a0d0: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20  ft->op==TK_ID ) 
a0e0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20  break;.  }.  rc 
a0f0: 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c  = 0;.  if( k<pEL
a100: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
a110: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
a120: 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65  e get here it me
a130: 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  ans the result s
a140: 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  et contains one 
a150: 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20  or more "*".    
a160: 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
a170: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
a180: 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72  anded.  Loop thr
a190: 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
a1a0: 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  sion.    ** in t
a1b0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
a1c0: 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e  d expand them on
a1d0: 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  e by one..    */
a1e0: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
a1f0: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70  List_item *a = p
a200: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78  EList->a;.    Ex
a210: 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30  prList *pNew = 0
a220: 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  ;.    int flags 
a230: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  = pParse->db->fl
a240: 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e  ags;.    int lon
a250: 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20  gNames = (flags 
a260: 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
a270: 4e 61 6d 65 73 29 21 3d 30 20 26 26 0a 20 20 20  Names)!=0 &&.   
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a290: 20 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49     (flags & SQLI
a2a0: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
a2b0: 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b  )==0;..    for(k
a2c0: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
a2d0: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  xpr; k++){.     
a2e0: 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d   Expr *pE = a[k]
a2f0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
a300: 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ( pE->op!=TK_ALL
a310: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28   &&.           (
a320: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
a330: 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20  | pE->pRight==0 
a340: 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  || pE->pRight->o
a350: 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20  p!=TK_ALL) ){.  
a360: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
a370: 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
a380: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
a390: 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
a3a0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a3b0: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
a3c0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
a3d0: 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  d(pNew, a[k].pEx
a3e0: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
a3f0: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
a400: 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
a410: 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
a420: 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
a430: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
a440: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
a450: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a460: 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
a470: 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d   0;.        a[k]
a480: 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
a490: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a4a0: 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
a4b0: 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
a4c0: 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
a4d0: 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
a4e0: 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
a4f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
a500: 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
a510: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
a520: 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
a530: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
a540: 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20  ar *zTName;     
a550: 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
a560: 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
a570: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
a580: 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
a590: 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20   pE->pLeft ){.  
a5a0: 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
a5b0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
a5c0: 54 6f 6b 65 6e 28 26 70 45 2d 3e 70 4c 65 66 74  Token(&pE->pLeft
a5d0: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
a5e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a5f0: 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20     zTName = 0;. 
a600: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a610: 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
a620: 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
a630: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
a640: 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
a650: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
a660: 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
a670: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  b;.          cha
a680: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46  r *zTabName = pF
a690: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  rom->zAlias;.   
a6a0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
a6b0: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61  ame==0 || zTabNa
a6c0: 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20  me[0]==0 ){ .   
a6d0: 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d           zTabNam
a6e0: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
a6f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
a700: 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
a710: 65 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d  e && (zTabName==
a720: 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  0 || zTabName[0]
a730: 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ==0 || .        
a740: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a750: 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
a760: 7a 54 61 62 4e 61 6d 65 29 21 3d 30 29 20 29 7b  zTabName)!=0) ){
a770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
a780: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
a790: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61 62   }.          tab
a7a0: 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  leSeen = 1;.    
a7b0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
a7c0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
a7d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  ){.            E
a7e0: 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 52 69  xpr *pExpr, *pRi
a7f0: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
a800: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
a810: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
a820: 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  me;..           
a830: 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
a840: 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
a850: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
a860: 4c 65 66 74 20 3d 20 26 70 54 61 62 4c 69 73 74  Left = &pTabList
a870: 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20  ->a[i-1];.      
a880: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 65          if( (pLe
a890: 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  ft[1].jointype &
a8a0: 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20   JT_NATURAL)!=0 
a8b0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
a8c0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d             colum
a8d0: 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 54  nIndex(pLeft->pT
a8e0: 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ab, zName)>=0 ){
a8f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a900: 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c   /* In a NATURAL
a910: 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20   join, omit the 
a920: 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  join columns fro
a930: 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  m the .         
a940: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
a950: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a970: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
a980: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a990: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
a9a0: 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
a9b0: 4c 65 66 74 5b 31 5d 2e 70 55 73 69 6e 67 2c 20  Left[1].pUsing, 
a9c0: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a9e0: 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61  In a join with a
a9f0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f   USING clause, o
aa00: 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  mit columns in t
aa10: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
aa20: 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75     ** using clau
aa30: 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  se from the tabl
aa40: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  e on the right. 
aa50: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
aa60: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
aa70: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
aa80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
aa90: 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
aaa0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
aab0: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
aac0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69           if( pRi
aad0: 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ght==0 ) break;.
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54              setT
aaf0: 6f 6b 65 6e 28 26 70 52 69 67 68 74 2d 3e 74 6f  oken(&pRight->to
ab00: 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ken, zName);.   
ab10: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
ab20: 62 4e 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e 61  bName && (longNa
ab30: 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d  mes || pTabList-
ab40: 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20  >nSrc>1) ){.    
ab50: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
ab60: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
ab70: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
ab80: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
ab90: 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
aba0: 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70  e3Expr(TK_DOT, p
abb0: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29  Left, pRight, 0)
abc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
abd0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62  if( pExpr==0 ) b
abe0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
abf0: 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 4c      setToken(&pL
ac00: 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62  eft->token, zTab
ac10: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
ac20: 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70       setToken(&p
ac30: 45 78 70 72 2d 3e 73 70 61 6e 2c 20 73 71 6c 69  Expr->span, sqli
ac40: 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73 2e 25  te3MPrintf("%s.%
ac50: 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
ac60: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ame));.         
ac70: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
ac80: 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  .dyn = 1;.      
ac90: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
aca0: 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20  oken.z = 0;.    
acb0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
acc0: 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20  >token.n = 0;.  
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
ace0: 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30  r->token.dyn = 0
acf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
ad00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
ad10: 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
ad20: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
ad30: 20 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70   pExpr->span = p
ad40: 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Expr->token;.   
ad50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ad60: 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
ad70: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
ad80: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
ad90: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
ada0: 6e 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20  nd(pNew, pExpr, 
adb0: 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20  &pExpr->span);. 
adc0: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
add0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
ade0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
adf0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65  prListAppend(pNe
ae00: 77 2c 20 70 45 78 70 72 2c 20 26 70 52 69 67 68  w, pExpr, &pRigh
ae10: 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  t->token);.     
ae20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ae30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
ae40: 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
ae50: 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
ae60: 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
ae70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
ae80: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ae90: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
aea0: 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
aeb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
aec0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
aed0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
aee0: 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
aef0: 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
af00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
af10: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
af20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
af30: 73 71 6c 69 74 65 46 72 65 65 28 7a 54 4e 61 6d  sqliteFree(zTNam
af40: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
af50: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
af60: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69  rListDelete(pELi
af70: 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69  st);.    p->pELi
af80: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
af90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
afa0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
afb0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
afc0: 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CT./*.** This ro
afd0: 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65 73  utine associates
afe0: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20 4f   entries in an O
aff0: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
b000: 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20  on list with.** 
b010: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65 73  columns in a res
b020: 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20 4f  ult.  For each O
b030: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
b040: 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20 6f  on, the opcode o
b050: 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76  f.** the top-lev
b060: 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e 67  el node is chang
b070: 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20  ed to TK_COLUMN 
b080: 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20  and the iColumn 
b090: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
b0a0: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
b0b0: 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68  s filled in with
b0c0: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61   column number a
b0d0: 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a  nd the iTable.**
b0e0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 6f   value of the to
b0f0: 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20  p-level node is 
b100: 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61 62  filled with iTab
b110: 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  le parameter..**
b120: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
b130: 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63 6c   prior SELECT cl
b140: 61 75 73 65 73 2c 20 74 68 65 79 20 61 72 65 20  auses, they are 
b150: 70 72 6f 63 65 73 73 65 64 20 66 69 72 73 74 2e  processed first.
b160: 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20    A match.** in 
b170: 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45 43  an earlier SELEC
b180: 54 20 74 61 6b 65 73 20 70 72 65 63 65 64 65 6e  T takes preceden
b190: 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72 20  ce over a later 
b1a0: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e  SELECT..**.** An
b1b0: 79 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f 65  y entry that doe
b1c0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20 66  s not match is f
b1d0: 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65 72 72  lagged as an err
b1e0: 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  or.  The number.
b1f0: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73 20  ** of errors is 
b200: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
b210: 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64  tic int matchOrd
b220: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20  erbyToColumn(.  
b230: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b240: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c 61          /* A pla
b250: 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72 6f  ce to leave erro
b260: 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20  r messages */.  
b270: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
b280: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68          /* Match
b290: 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   to result colum
b2a0: 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43  ns of this SELEC
b2b0: 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  T */.  ExprList 
b2c0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
b2d0: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 76  * The ORDER BY v
b2e0: 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20 61  alues to match a
b2f0: 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a  gainst columns *
b300: 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
b310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
b320: 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c 75 65  nsert this value
b330: 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20   in iTable */.  
b340: 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65  int mustComplete
b350: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52          /* If TR
b360: 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73  UE all ORDER BYs
b370: 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29   must match */.)
b380: 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  {.  int nErr = 0
b390: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
b3a0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
b3b0: 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  ;..  if( pSelect
b3c0: 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d  ==0 || pOrderBy=
b3d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
b3e0: 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74   if( mustComplet
b3f0: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
b400: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
b410: 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65  xpr; i++){ pOrde
b420: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
b430: 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20   0; }.  }.  if( 
b440: 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70  prepSelectStmt(p
b450: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20  Parse, pSelect) 
b460: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
b470: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65  .  }.  if( pSele
b480: 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ct->pPrior ){.  
b490: 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65 72    if( matchOrder
b4a0: 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  byToColumn(pPars
b4b0: 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e, pSelect->pPri
b4c0: 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69 54  or, pOrderBy, iT
b4d0: 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  able, 0) ){.    
b4e0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b4f0: 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d  }.  }.  pEList =
b500: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
b510: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
b520: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
b530: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
b540: 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
b550: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
b560: 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  nt iCol = -1;.  
b570: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e    if( pOrderBy->
b580: 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74  a[i].done ) cont
b590: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71  inue;.    if( sq
b5a0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
b5b0: 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b  er(pE, &iCol) ){
b5c0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
b5d0: 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73  =0 || iCol>pELis
b5e0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
b5f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b600: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
b610: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
b620: 70 6f 73 69 74 69 6f 6e 20 25 64 20 73 68 6f 75  position %d shou
b630: 6c 64 20 62 65 20 62 65 74 77 65 65 6e 20 31 20  ld be between 1 
b640: 61 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20  and %d",.       
b650: 20 20 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d     iCol, pEList-
b660: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >nExpr);.       
b670: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20   nErr++;.       
b680: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
b690: 20 20 20 20 20 20 69 66 28 20 21 6d 75 73 74 43        if( !mustC
b6a0: 6f 6d 70 6c 65 74 65 20 29 20 63 6f 6e 74 69 6e  omplete ) contin
b6b0: 75 65 3b 0a 20 20 20 20 20 20 69 43 6f 6c 2d 2d  ue;.      iCol--
b6c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
b6d0: 6a 3d 30 3b 20 69 43 6f 6c 3c 30 20 26 26 20 6a  j=0; iCol<0 && j
b6e0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
b6f0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
b700: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61  pEList->a[j].zNa
b710: 6d 65 20 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54  me && (pE->op==T
b720: 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d  K_ID || pE->op==
b730: 54 4b 5f 53 54 52 49 4e 47 29 20 29 7b 0a 20 20  TK_STRING) ){.  
b740: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
b750: 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20 20  e, *zLabel;.    
b760: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69      zName = pELi
b770: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
b780: 20 20 20 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d          zLabel =
b790: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
b7a0: 54 6f 6b 65 6e 28 26 70 45 2d 3e 74 6f 6b 65 6e  Token(&pE->token
b7b0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
b7c0: 74 28 20 7a 4c 61 62 65 6c 21 3d 30 20 29 3b 0a  t( zLabel!=0 );.
b7d0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
b7e0: 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  te3StrICmp(zName
b7f0: 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20  , zLabel)==0 ){ 
b800: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20  .          iCol 
b810: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = j;.        }. 
b820: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
b830: 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  e(zLabel);.     
b840: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f   }.      if( iCo
b850: 6c 3c 30 20 26 26 20 73 71 6c 69 74 65 33 45 78  l<0 && sqlite3Ex
b860: 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 45  prCompare(pE, pE
b870: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  List->a[j].pExpr
b880: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  ) ){.        iCo
b890: 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20  l = j;.      }. 
b8a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
b8b0: 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45  l>=0 ){.      pE
b8c0: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
b8d0: 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c  ;.      pE->iCol
b8e0: 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  umn = iCol;.    
b8f0: 20 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69    pE->iTable = i
b900: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 2d  Table;.      pE-
b910: 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20  >iAgg = -1;.    
b920: 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
b930: 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d  .done = 1;.    }
b940: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  .    if( iCol<0 
b950: 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  && mustComplete 
b960: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b970: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
b980: 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20  .        "ORDER 
b990: 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72 20 25  BY term number %
b9a0: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
b9b0: 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75   any result colu
b9c0: 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  mn", i+1);.     
b9d0: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62   nErr++;.      b
b9e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
b9f0: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
ba00: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66  .}.#endif /* #if
ba10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ba20: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
ba30: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61   */../*.** Get a
ba40: 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69   VDBE for the gi
ba50: 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65  ven parser conte
ba60: 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  xt.  Create a ne
ba70: 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
ba80: 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  ry..** If an err
ba90: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
baa0: 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
bab0: 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50   a message in pP
bac0: 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  arse..*/.Vdbe *s
bad0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61  qlite3GetVdbe(Pa
bae0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
baf0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
bb00: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76  ->pVdbe;.  if( v
bb10: 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70  ==0 ){.    v = p
bb20: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73  Parse->pVdbe = s
bb30: 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
bb40: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
bb50: 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a  }.  return v;.}.
bb60: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
bb70: 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  the iLimit and i
bb80: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66  Offset fields of
bb90: 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65   the SELECT base
bba0: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d  d on the.** pLim
bbb0: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65  it and pOffset e
bbc0: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69  xpressions.  pLi
bbd0: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
bbe0: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
bbf0: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70  ions.** that app
bc00: 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69  ear in the origi
bc10: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
bc20: 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49  t after the LIMI
bc30: 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20  T and OFFSET.** 
bc40: 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55  keywords.  Or NU
bc50: 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77  LL if those keyw
bc60: 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64  ords are omitted
bc70: 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  . iLimit and iOf
bc80: 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65  fset .** are the
bc90: 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20   integer memory 
bca0: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
bcb0: 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73   for counters us
bcc0: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a  ed to compute .*
bcd0: 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20  * the limit and 
bce0: 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72  offset.  If ther
bcf0: 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e  e is no limit an
bd00: 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65  d/or offset, the
bd10: 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64  n .** iLimit and
bd20: 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67   iOffset are neg
bd30: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ative..**.** Thi
bd40: 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
bd50: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  s the values of 
bd60: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
bd70: 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20  et only if.** a 
bd80: 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20  limit or offset 
bd90: 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c  is defined by pL
bda0: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
bdb0: 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a  .  iLimit and.**
bdc0: 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20   iOffset should 
bdd0: 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74  have been preset
bde0: 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   to appropriate 
bdf0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a  default values.*
be00: 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e  * (usually but n
be10: 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72  ot always -1) pr
be20: 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
be30: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20  his routine..** 
be40: 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d  Only if pLimit!=
be50: 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20  0 or pOffset!=0 
be60: 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  do the limit reg
be70: 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65  isters get.** re
be80: 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e  defined.  The UN
be90: 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
bea0: 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65   uses this prope
beb0: 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20  rty to force.** 
bec0: 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65  the reuse of the
bed0: 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20   same limit and 
bee0: 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73  offset registers
bef0: 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65   across multiple
bf00: 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
bf10: 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
bf20: 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d   void computeLim
bf30: 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73  itRegisters(Pars
bf40: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
bf50: 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b  t *p, int iBreak
bf60: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30  ){.  Vdbe *v = 0
bf70: 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d  ;.  int iLimit =
bf80: 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   0;.  int iOffse
bf90: 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20  t;.  int addr1, 
bfa0: 61 64 64 72 32 3b 0a 0a 20 20 2f 2a 20 0a 20 20  addr2;..  /* .  
bfb0: 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c  ** "LIMIT -1" al
bfc0: 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72  ways shows all r
bfd0: 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73  ows.  There is s
bfe0: 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76  ome.  ** contrav
bff0: 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20  ersy about what 
c000: 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
c010: 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a  vior should be..
c020: 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74    ** The current
c030: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
c040: 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49  interprets "LIMI
c050: 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a  T 0" to mean.  *
c060: 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a  * no rows..  */.
c070: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
c080: 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  ){.    p->iLimit
c090: 20 3d 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 72   = iLimit = pPar
c0a0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 50  se->nMem;.    pP
c0b0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b  arse->nMem += 2;
c0c0: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
c0d0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
c0e0: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
c0f0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
c100: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
c110: 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  se, p->pLimit);.
c120: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c130: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42  ddOp(v, OP_MustB
c140: 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eInt, 0, 0);.   
c150: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c160: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
c170: 2c 20 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20  , iLimit, 0);.  
c180: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
c190: 2c 20 22 23 20 4c 49 4d 49 54 20 63 6f 75 6e 74  , "# LIMIT count
c1a0: 65 72 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  er"));.    sqlit
c1b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c1c0: 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 69 4c 69  P_IfMemZero, iLi
c1d0: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
c1e0: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73  }.  if( p->pOffs
c1f0: 65 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4f 66  et ){.    p->iOf
c200: 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d  fset = iOffset =
c210: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
c220: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
c230: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
c240: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
c250: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
c260: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
c270: 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  se, p->pOffset);
c280: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c290: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74  AddOp(v, OP_Must
c2a0: 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20  BeInt, 0, 0);.  
c2b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c2c0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
c2d0: 65 2c 20 69 4f 66 66 73 65 74 2c 20 70 2d 3e 70  e, iOffset, p->p
c2e0: 4c 69 6d 69 74 3d 3d 30 29 3b 0a 20 20 20 20 56  Limit==0);.    V
c2f0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
c300: 23 20 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72  # OFFSET counter
c310: 22 29 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d  "));.    addr1 =
c320: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c330: 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73  p(v, OP_IfMemPos
c340: 2c 20 69 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20  , iOffset, 0);. 
c350: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c360: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
c370: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
c380: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c390: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
c3a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c3b0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
c3c0: 31 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  1);.    if( p->p
c3d0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73  Limit ){.      s
c3e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c3f0: 76 2c 20 4f 50 5f 41 64 64 2c 20 30 2c 20 30 29  v, OP_Add, 0, 0)
c400: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
c410: 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ( p->pLimit ){. 
c420: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
c430: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c440: 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 4c 69 6d  P_IfMemPos, iLim
c450: 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  it, 0);.    sqli
c460: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c470: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
c480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c490: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74  dOp(v, OP_MemInt
c4a0: 2c 20 2d 31 2c 20 69 4c 69 6d 69 74 2b 31 29 3b  , -1, iLimit+1);
c4b0: 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
c4c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c4d0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b   OP_Goto, 0, 0);
c4e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c4f0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
c500: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
c510: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
c520: 65 6d 53 74 6f 72 65 2c 20 69 4c 69 6d 69 74 2b  emStore, iLimit+
c530: 31 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43  1, 1);.    VdbeC
c540: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4c 49  omment((v, "# LI
c550: 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20  MIT+OFFSET"));. 
c560: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
c570: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29  mpHere(v, addr2)
c580: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
c590: 6c 6c 6f 63 61 74 65 20 61 20 76 69 72 74 75 61  llocate a virtua
c5a0: 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
c5b0: 6f 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2f 0a 73  or sorting..*/.s
c5c0: 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74  tatic void creat
c5d0: 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 50 61  eSortingIndex(Pa
c5e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
c5f0: 65 63 74 20 2a 70 2c 20 45 78 70 72 4c 69 73 74  ect *p, ExprList
c600: 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20 69   *pOrderBy){.  i
c610: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
c620: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
c630: 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
c640: 79 2d 3e 69 45 43 75 72 73 6f 72 3d 3d 30 20 29  y->iECursor==0 )
c650: 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e  ;.    pOrderBy->
c660: 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  iECursor = pPars
c670: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 61  e->nTab++;.    a
c680: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
c690: 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d 3e 70  eAddOp(pParse->p
c6a0: 56 64 62 65 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  Vdbe, OP_OpenEph
c6b0: 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6d0: 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45      pOrderBy->iE
c6e0: 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79  Cursor, pOrderBy
c6f0: 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20 20  ->nExpr+1);.    
c700: 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
c710: 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 3d 20 2d 31  penEphm[2] == -1
c720: 20 29 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f   );.    p->addrO
c730: 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64  penEphm[2] = add
c740: 72 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  r;.  }.}..#ifnde
c750: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
c760: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
c770: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
c780: 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61  ppropriate colla
c790: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
c7a0: 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  r the iCol-th co
c7b0: 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72  lumn of.** the r
c7c0: 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68  esult set for th
c7d0: 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  e compound-selec
c7e0: 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e  t statement "p".
c7f0: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
c800: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68  .** the column h
c810: 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  as no default co
c820: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
c830: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ..**.** The coll
c840: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
c850: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  or the compound 
c860: 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20  select is taken 
c870: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74  from the.** left
c880: 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68  -most term of th
c890: 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61  e select that ha
c8a0: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  s a collating se
c8b0: 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  quence..*/.stati
c8c0: 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69  c CollSeq *multi
c8d0: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61  SelectCollSeq(Pa
c8e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
c8f0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c  ect *p, int iCol
c900: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52  ){.  CollSeq *pR
c910: 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  et;.  if( p->pPr
c920: 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20  ior ){.    pRet 
c930: 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
c940: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
c950: 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20  pPrior, iCol);. 
c960: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74   }else{.    pRet
c970: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
c980: 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pRet==0 ){.    p
c990: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
c9a0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
c9b0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43   p->pEList->a[iC
c9c0: 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  ol].pExpr);.  }.
c9d0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
c9e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
c9f0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
ca00: 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64  SELECT */..#ifnd
ca10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
ca20: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
ca30: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ca40: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70  e is called to p
ca50: 72 6f 63 65 73 73 20 61 20 71 75 65 72 79 20 74  rocess a query t
ca60: 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68  hat is really th
ca70: 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e  e union.** or in
ca80: 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77  tersection of tw
ca90: 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
caa0: 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a  te queries..**.*
cab0: 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20  * "p" points to 
cac0: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  the right-most o
cad0: 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65  f the two querie
cae0: 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e  s.  the query on
caf0: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20   the.** left is 
cb00: 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20  p->pPrior.  The 
cb10: 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64  left query could
cb20: 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f   also be a compo
cb30: 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20  und query.** in 
cb40: 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20  which case this 
cb50: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
cb60: 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
cb70: 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ly. .**.** The r
cb80: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f  esults of the to
cb90: 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f  tal query are to
cba0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
cbb0: 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a   a destination.*
cbc0: 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20  * of type eDest 
cbd0: 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  with parameter i
cbe0: 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  Parm..**.** Exam
cbf0: 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72  ple 1:  Consider
cc00: 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d   a three-way com
cc10: 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d  pound SQL statem
cc20: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ent..**.**     S
cc30: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
cc40: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46  UNION SELECT b F
cc50: 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c  ROM t2 UNION SEL
cc60: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
cc70: 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65  .** This stateme
cc80: 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20  nt is parsed up 
cc90: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
cca0: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46  *     SELECT c F
ccb0: 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c  ROM t3.**      |
ccc0: 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e  .**      `----->
ccd0: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
cce0: 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t2.**           
ccf0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
cd00: 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d           `------
cd10: 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  >  SELECT a FROM
cd20: 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72   t1.**.** The ar
cd30: 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67  rows in the diag
cd40: 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73  ram above repres
cd50: 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70  ent the Select.p
cd60: 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a  Prior pointer..*
cd70: 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75  * So if this rou
cd80: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
cd90: 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74  ith p equal to t
cda0: 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65  he t3 query, the
cdb0: 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c  n.** pPrior will
cdc0: 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79   be the t2 query
cdd0: 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65  .  p->op will be
cde0: 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69   TK_UNION in thi
cdf0: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  s case..**.** No
ce00: 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73  tice that becaus
ce10: 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c  e of the way SQL
ce20: 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f  ite parses compo
ce30: 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65  und SELECTs, the
ce40: 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73  .** individual s
ce50: 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72  elects always gr
ce60: 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  oup from left to
ce70: 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69   right..*/.stati
ce80: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
ce90: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
cea0: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
ceb0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
cec0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
ced0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
cee0: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
cef0: 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
cf00: 64 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  d */.  int eDest
cf10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
cf20: 5c 5f 5f 5f 20 20 53 74 6f 72 65 20 71 75 65 72  \___  Store quer
cf30: 79 20 72 65 73 75 6c 74 73 20 61 73 20 73 70 65  y results as spe
cf40: 63 69 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20  cified */.  int 
cf50: 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iParm,          
cf60: 20 20 2f 2a 20 2f 20 20 20 20 20 62 79 20 74 68    /* /     by th
cf70: 65 73 65 20 74 77 6f 20 70 61 72 61 6d 65 74 65  ese two paramete
cf80: 72 73 2e 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  rs.         */. 
cf90: 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20   char *aff      
cfa0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65         /* If eDe
cfb0: 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c  st is SRT_Union,
cfc0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
cfd0: 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ring */.){.  int
cfe0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
cff0: 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f     /* Success co
d000: 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75  de from a subrou
d010: 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tine */.  Select
d020: 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
d030: 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
d040: 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
d050: 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
d060: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
d070: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
d080: 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
d090: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  BE */.  int nCol
d0a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
d0b0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
d0c0: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
d0d0: 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69   set */.  ExprLi
d0e0: 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
d0f0: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
d100: 63 6c 61 75 73 65 20 6f 6e 20 70 20 2a 2f 0a 20  clause on p */. 
d110: 20 69 6e 74 20 61 53 65 74 50 32 5b 32 5d 3b 20   int aSetP2[2]; 
d120: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 50 32         /* Set P2
d130: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 73 65 20   value of these 
d140: 6f 70 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20  op to number of 
d150: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
d160: 20 6e 53 65 74 50 32 20 3d 20 30 3b 20 20 20 20   nSetP2 = 0;    
d170: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d180: 73 6c 6f 74 73 20 69 6e 20 61 53 65 74 50 32 5b  slots in aSetP2[
d190: 5d 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  ] used */..  /* 
d1a0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
d1b0: 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f  is no ORDER BY o
d1c0: 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  r LIMIT clause o
d1d0: 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e  n prior SELECTs.
d1e0: 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20    Only.  ** the 
d1f0: 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74  last (right-most
d200: 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20  ) SELECT in the 
d210: 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20  series may have 
d220: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  an ORDER BY or L
d230: 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  IMIT..  */.  if(
d240: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69   p==0 || p->pPri
d250: 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  or==0 ){.    rc 
d260: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
d270: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
d280: 20 20 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20 70    }.  pPrior = p
d290: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
d2a0: 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67  rt( pPrior->pRig
d2b0: 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29  htmost!=pPrior )
d2c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
d2d0: 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d  or->pRightmost==
d2e0: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b  p->pRightmost );
d2f0: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
d300: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
d310: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d320: 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20  Parse,"ORDER BY 
d330: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
d340: 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
d350: 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
d360: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
d370: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
d380: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
d390: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
d3a0: 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
d3b0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
d3c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d3d0: 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65  se,"LIMIT clause
d3e0: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
d3f0: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
d400: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
d410: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
d420: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
d430: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
d440: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
d450: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
d460: 65 20 61 20 76 61 6c 69 64 20 71 75 65 72 79 20  e a valid query 
d470: 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c  engine.  If not,
d480: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
d490: 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
d4a0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
d4b0: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
d4c0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
d4d0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
d4e0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
d4f0: 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
d500: 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70  destination temp
d510: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e  orary table if n
d520: 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20  ecessary.  */.  
d530: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  if( eDest==SRT_E
d540: 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61  phemTab ){.    a
d550: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
d560: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d570: 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28 61 53  nSetP2<sizeof(aS
d580: 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61 53 65  etP2)/sizeof(aSe
d590: 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20 61  tP2[0]) );.    a
d5a0: 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20  SetP2[nSetP2++] 
d5b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d5c0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  Op(v, OP_OpenEph
d5d0: 65 6d 65 72 61 6c 2c 20 69 50 61 72 6d 2c 20 30  emeral, iParm, 0
d5e0: 29 3b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 53  );.    eDest = S
d5f0: 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  RT_Table;.  }.. 
d600: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
d610: 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61  e for the left a
d620: 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  nd right SELECT 
d630: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
d640: 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
d650: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 73 77 69  >pOrderBy;.  swi
d660: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
d670: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b    case TK_ALL: {
d680: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
d690: 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
d6a0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a    int addr = 0;.
d6b0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d6c0: 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20  !pPrior->pLimit 
d6d0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f  );.        pPrio
d6e0: 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r->pLimit = p->p
d6f0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
d700: 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d  Prior->pOffset =
d710: 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
d720: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d730: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
d740: 70 50 72 69 6f 72 2c 20 65 44 65 73 74 2c 20 69  pPrior, eDest, i
d750: 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61  Parm, 0, 0, 0, a
d760: 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ff);.        p->
d770: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
d780: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
d790: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
d7a0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
d7b0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d7c0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
d7d0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69  .        p->pPri
d7e0: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  or = 0;.        
d7f0: 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69  p->iLimit = pPri
d800: 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  or->iLimit;.    
d810: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
d820: 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
d830: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
d840: 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20  >iLimit>=0 ){.  
d850: 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
d860: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d870: 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c  v, OP_IfMemZero,
d880: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 30 29 3b 0a   p->iLimit, 0);.
d890: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
d8a0: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4a 75 6d  mment((v, "# Jum
d8b0: 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54  p ahead if LIMIT
d8c0: 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20   reached"));.   
d8d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
d8e0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
d8f0: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65  t(pParse, p, eDe
d900: 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c  st, iParm, 0, 0,
d910: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
d920: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
d930: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66  rior;.        if
d940: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
d950: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
d960: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
d970: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61   }.        if( a
d980: 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ddr ){.         
d990: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
d9a0: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
d9b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d9c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
d9d0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49        /* For UNI
d9e0: 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52  ON ALL ... ORDER
d9f0: 20 42 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   BY fall through
da00: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73   to the next cas
da10: 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
da20: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20  ase TK_EXCEPT:. 
da30: 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
da40: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e  : {.      int un
da50: 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75  ionTab;    /* Cu
da60: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
da70: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
da80: 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  le holding resul
da90: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f  t */.      int o
daa0: 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f  p = 0;      /* O
dab0: 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f  ne of the SRT_ o
dac0: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70  perations to app
dad0: 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20  ly to self */.  
dae0: 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b      int priorOp;
daf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f       /* The SRT_
db00: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70   operation to ap
db10: 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c  ply to prior sel
db20: 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  ects */.      Ex
db30: 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
db40: 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76  fset; /* Saved v
db50: 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d  alues of p->nLim
db60: 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65  it and p->nOffse
db70: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
db80: 64 64 72 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f  ddr;..      prio
db90: 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  rOp = p->op==TK_
dba0: 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65 20  ALL ? SRT_Table 
dbb0: 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  : SRT_Union;.   
dbc0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70 72     if( eDest==pr
dbd0: 69 6f 72 4f 70 20 26 26 20 70 4f 72 64 65 72 42  iorOp && pOrderB
dbe0: 79 3d 3d 30 20 26 26 20 21 70 2d 3e 70 4c 69 6d  y==0 && !p->pLim
dbf0: 69 74 20 26 26 20 21 70 2d 3e 70 4f 66 66 73 65  it && !p->pOffse
dc00: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
dc10: 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74  We can reuse a t
dc20: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67  emporary table g
dc30: 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45  enerated by a SE
dc40: 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20  LECT to our.    
dc50: 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20      ** right..  
dc60: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
dc70: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61 72   unionTab = iPar
dc80: 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
dc90: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69          /* We wi
dca0: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  ll need to creat
dcb0: 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72  e our own tempor
dcc0: 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c  ary table to hol
dcd0: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
dce0: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
dcf0: 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  sults..        *
dd00: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
dd10: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
dd20: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b++;.        if(
dd30: 20 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74   pOrderBy && mat
dd40: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
dd50: 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 72  n(pParse, p, pOr
dd60: 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c  derBy, unionTab,
dd70: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
dd80: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
dd90: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
dda0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
ddb0: 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72 20   }.        addr 
ddc0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ddd0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  Op(v, OP_OpenEph
dde0: 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62  emeral, unionTab
ddf0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
de00: 28 20 70 72 69 6f 72 4f 70 3d 3d 53 52 54 5f 54  ( priorOp==SRT_T
de10: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
de20: 20 20 61 73 73 65 72 74 28 20 6e 53 65 74 50 32    assert( nSetP2
de30: 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29 2f  <sizeof(aSetP2)/
de40: 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30 5d  sizeof(aSetP2[0]
de50: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ) );.          a
de60: 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20  SetP2[nSetP2++] 
de70: 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  = addr;.        
de80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
de90: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
dea0: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
deb0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  1 );.          p
dec0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
ded0: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
dee0: 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
def0: 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20 31 3b  t->usesEphm = 1;
df00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
df10: 20 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67     createSorting
df20: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c  Index(pParse, p,
df30: 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
df40: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
df50: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d  EList );.      }
df60: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
df70: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
df80: 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66  ments to our lef
df90: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
dfa0: 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
dfb0: 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ->pOrderBy );.  
dfc0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
dfd0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
dfe0: 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20  Prior, priorOp, 
dff0: 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20  unionTab, 0, 0, 
e000: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69  0, aff);.      i
e010: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
e020: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
e030: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
e040: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
e050: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
e060: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  T statement.    
e070: 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63    */.      switc
e080: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
e090: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43       case TK_EXC
e0a0: 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45  EPT:  op = SRT_E
e0b0: 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a  xcept;   break;.
e0c0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
e0d0: 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53  _UNION:   op = S
e0e0: 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65  RT_Union;    bre
e0f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
e100: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70  e TK_ALL:     op
e110: 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20   = SRT_Table;   
e120: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
e130: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
e140: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  = 0;.      p->pO
e150: 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
e160: 20 20 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64    p->disallowOrd
e170: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 21  erBy = pOrderBy!
e180: 3d 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74  =0;.      pLimit
e190: 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
e1a0: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
e1b0: 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
e1c0: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
e1d0: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
e1e0: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
e1f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
e200: 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69  arse, p, op, uni
e210: 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20  onTab, 0, 0, 0, 
e220: 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  aff);.      p->p
e230: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
e240: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
e250: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
e260: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
e270: 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29  elete(p->pLimit)
e280: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
e290: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
e2a0: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
e2b0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
e2c0: 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >iLimit = -1;.  
e2d0: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
e2e0: 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 72   -1;.      if( r
e2f0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
e300: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
e310: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20  nd;.      }...  
e320: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
e330: 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
e340: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
e350: 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
e360: 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  m.      ** it is
e370: 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74   that we current
e380: 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ly need..      *
e390: 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  /      .      if
e3a0: 28 20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  ( eDest!=priorOp
e3b0: 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50   || unionTab!=iP
e3c0: 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  arm ){.        i
e3d0: 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
e3e0: 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
e3f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
e400: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
e410: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
e420: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
e430: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
e440: 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
e450: 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
e460: 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
e470: 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
e480: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  r;.          gen
e490: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
e4a0: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
e4b0: 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
e4c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
e4d0: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
e4e0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
e4f0: 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  .        iCont =
e500: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
e510: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
e520: 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
e530: 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
e540: 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
e550: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e560: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
e570: 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
e580: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53  eak);.        iS
e590: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
e5a0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
e5b0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
e5c0: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
e5d0: 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
e5e0: 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70  ist, unionTab, p
e5f0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
e600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
e620: 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73  rderBy, -1, eDes
e630: 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20  t, iParm, .     
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e650: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69          iCont, i
e660: 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Break, 0);.     
e670: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
e680: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
e690: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
e6a0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
e6b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e6c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
e6d0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
e6e0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
e6f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
e700: 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54   OP_Next, unionT
e710: 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  ab, iStart);.   
e720: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e730: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
e740: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
e750: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e760: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  p(v, OP_Close, u
e770: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
e780: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
e790: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e7a0: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b   TK_INTERSECT: {
e7b0: 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c  .      int tab1,
e7c0: 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74   tab2;.      int
e7d0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
e7e0: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78  iStart;.      Ex
e7f0: 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
e800: 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  fset;.      int 
e810: 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  addr;..      /* 
e820: 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66  INTERSECT is dif
e830: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
e840: 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20  others since it 
e850: 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
e860: 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
e870: 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
e880: 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
e890: 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
e8a0: 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e   ** by allocatin
e8b0: 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20  g the tables we 
e8c0: 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20  will need..     
e8d0: 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d   */.      tab1 =
e8e0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
e8f0: 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50  .      tab2 = pP
e900: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
e910: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
e920: 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79   && matchOrderby
e930: 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  ToColumn(pParse,
e940: 70 2c 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c  p,pOrderBy,tab1,
e950: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
e960: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
e970: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
e980: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
e990: 20 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67     createSorting
e9a0: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c  Index(pParse, p,
e9b0: 20 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20 20   pOrderBy);..   
e9c0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
e9d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e9e0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
e9f0: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
ea00: 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
ea10: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
ea20: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
ea30: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61  rOpenEphm[0] = a
ea40: 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52  ddr;.      p->pR
ea50: 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70  ightmost->usesEp
ea60: 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73  hm = 1;.      as
ea70: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
ea80: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
ea90: 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
eaa0: 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
eab0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
eac0: 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  tab1"..      */.
ead0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
eae0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
eaf0: 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69   pPrior, SRT_Uni
eb00: 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c 20  on, tab1, 0, 0, 
eb10: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69  0, aff);.      i
eb20: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
eb30: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
eb40: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
eb50: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
eb60: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
eb70: 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  T into temporary
eb80: 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20   table "tab2".  
eb90: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
eba0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
ebb0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  ddOp(v, OP_OpenE
ebc0: 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
ebd0: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
ebe0: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
ebf0: 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[1] == -1 );.  
ec00: 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
ec10: 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
ec20: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
ec30: 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
ec40: 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
ec50: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
ec60: 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
ec70: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
ec80: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
ec90: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
eca0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
ecb0: 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69  arse, p, SRT_Uni
ecc0: 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c 20  on, tab2, 0, 0, 
ecd0: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70  0, aff);.      p
ece0: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
ecf0: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
ed00: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
ed10: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
ed20: 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
ed30: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
ed40: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
ed50: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
ed60: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
ed70: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
ed80: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
ed90: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
eda0: 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
edb0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
edc0: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
edd0: 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
ede0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
edf0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
ee00: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
ee10: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
ee20: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
ee30: 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
ee40: 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
ee50: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
ee60: 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
ee70: 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e  ior;.        gen
ee80: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
ee90: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
eea0: 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
eeb0: 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61     }.      iBrea
eec0: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
eed0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
eee0: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
eef0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
ef00: 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74  v);.      comput
ef10: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
ef20: 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
ef30: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
ef40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ef50: 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
ef60: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 69 53  Break);.      iS
ef70: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
ef80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
ef90: 77 4b 65 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a  wKey, tab1, 0);.
efa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
efb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
efc0: 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f  Found, tab2, iCo
efd0: 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  nt);.      rc = 
efe0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
eff0: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
f000: 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70  List, tab1, p->p
f010: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f030: 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
f040: 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  rBy, -1, eDest, 
f050: 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20  iParm, .        
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f070: 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65       iCont, iBre
f080: 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ak, 0);.      if
f090: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
f0a0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
f0b0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
f0c0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
f0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f0e0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
f0f0: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  iCont);.      sq
f100: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f110: 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c  , OP_Next, tab1,
f120: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
f130: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
f140: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
f150: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
f160: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f170: 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
f180: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f190: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
f1a0: 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
f1b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f1c0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
f1d0: 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43  e sure all SELEC
f1e0: 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  Ts in the statem
f1f0: 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ent have the sam
f200: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
f210: 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ents.  ** in the
f220: 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ir result sets..
f230: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
f240: 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69  ->pEList && pPri
f250: 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20  or->pEList );.  
f260: 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
f270: 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45  Expr!=pPrior->pE
f280: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
f290: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f2a0: 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
f2b0: 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
f2c0: 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
f2d0: 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20  .      " do not 
f2e0: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
f2f0: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
f300: 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f  olumns", selectO
f310: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
f320: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
f330: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
f340: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
f350: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
f360: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 65 6d  f columns in tem
f370: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 0a 20 20  porary tables.  
f380: 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70  */.  nCol = p->p
f390: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
f3a0: 77 68 69 6c 65 28 20 6e 53 65 74 50 32 20 29 7b  while( nSetP2 ){
f3b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f3c0: 43 68 61 6e 67 65 50 32 28 76 2c 20 61 53 65 74  ChangeP2(v, aSet
f3d0: 50 32 5b 2d 2d 6e 53 65 74 50 32 5d 2c 20 6e 43  P2[--nSetP2], nC
f3e0: 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ol);.  }..  /* C
f3f0: 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67  ompute collating
f400: 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20   sequences used 
f410: 62 79 20 65 69 74 68 65 72 20 74 68 65 20 4f 52  by either the OR
f420: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
f430: 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20 74 65 6d  .  ** by any tem
f440: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
f450: 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
f460: 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
f470: 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
f480: 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
f490: 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
f4a0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
f4b0: 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 0a 20 20  .  Invoke the.  
f4c0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 70 72 6f 63  ** ORDER BY proc
f4d0: 65 73 73 69 6e 67 20 69 66 20 74 68 65 72 65 20  essing if there 
f4e0: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
f4f0: 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
f500: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
f510: 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68   run by the righ
f520: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
f530: 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20  atement only..  
f540: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
f550: 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ents to the left
f560: 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69   always skip thi
f570: 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67  s part.  The rig
f580: 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c  ht-most.  ** SEL
f590: 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73  ECT might also s
f5a0: 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66  kip this part if
f5b0: 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52   it has no ORDER
f5c0: 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20   BY clause and. 
f5d0: 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c   ** no temp tabl
f5e0: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  es are required.
f5f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
f600: 65 72 42 79 20 7c 7c 20 70 2d 3e 75 73 65 73 45  erBy || p->usesE
f610: 70 68 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  phm ){.    int i
f620: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f630: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
f640: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
f650: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
f660: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
f670: 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
f680: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75  nce for the resu
f690: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65  lt set */.    Se
f6a0: 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  lect *pLoop;    
f6b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
f6c0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
f6d0: 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  gh SELECT statem
f6e0: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ents */.    int 
f6f0: 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20  nKeyCol;        
f700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
f710: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
f720: 6e 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  n pKeyInfo->aCol
f730: 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65  [] */.    CollSe
f740: 71 20 2a 2a 61 70 43 6f 6c 6c 3b 0a 20 20 20 20  q **apColl;.    
f750: 43 6f 6c 6c 53 65 71 20 2a 2a 61 43 6f 70 79 3b  CollSeq **aCopy;
f760: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
f770: 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29  >pRightmost==p )
f780: 3b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20  ;.    nKeyCol = 
f790: 6e 43 6f 6c 20 2b 20 28 70 4f 72 64 65 72 42 79  nCol + (pOrderBy
f7a0: 20 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   ? pOrderBy->nEx
f7b0: 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 70 4b 65  pr : 0);.    pKe
f7c0: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61  yInfo = sqliteMa
f7d0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4b 65  lloc(sizeof(*pKe
f7e0: 79 49 6e 66 6f 29 2b 6e 4b 65 79 43 6f 6c 2a 28  yInfo)+nKeyCol*(
f7f0: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
f800: 20 2b 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20   + 1));.    if( 
f810: 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20  !pKeyInfo ){.   
f820: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
f830: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
f840: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
f850: 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b  d;.    }..    pK
f860: 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e  eyInfo->enc = EN
f870: 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  C(pParse->db);. 
f880: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69     pKeyInfo->nFi
f890: 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20  eld = nCol;..   
f8a0: 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c   for(i=0, apColl
f8b0: 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  =pKeyInfo->aColl
f8c0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61  ; i<nCol; i++, a
f8d0: 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  pColl++){.      
f8e0: 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53  *apColl = multiS
f8f0: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
f900: 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
f910: 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c    if( 0==*apColl
f920: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43   ){.        *apC
f930: 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
f940: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
f950: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
f960: 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f  for(pLoop=p; pLo
f970: 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
f980: 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
f990: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
f9a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
f9b0: 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64  addr = pLoop->ad
f9c0: 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20  drOpenEphm[i];. 
f9d0: 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72 3c         if( addr<
f9e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
f9f0: 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73  * If [0] is unus
fa00: 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61  ed then [1] is a
fa10: 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20  lso unused.  So 
fa20: 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20  we can.         
fa30: 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c   ** always safel
fa40: 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20  y abort as soon 
fa50: 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e 75  as the first unu
fa60: 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e  sed slot is foun
fa70: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  d */.          a
fa80: 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64  ssert( pLoop->ad
fa90: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20  drOpenEphm[1]<0 
faa0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
fab0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
fac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fad0: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
fae0: 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  r, nCol);.      
faf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
fb00: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28  ngeP3(v, addr, (
fb10: 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
fb20: 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P3_KEYINFO);.   
fb30: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
fb40: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
fb50: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
fb60: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 54 65  rList_item *pOTe
fb70: 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  rm = pOrderBy->a
fb80: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64  ;.      int nOrd
fb90: 65 72 42 79 45 78 70 72 20 3d 20 70 4f 72 64 65  erByExpr = pOrde
fba0: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
fbb0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
fbc0: 20 20 75 38 20 2a 70 53 6f 72 74 4f 72 64 65 72    u8 *pSortOrder
fbd0: 3b 0a 0a 20 20 20 20 20 20 61 43 6f 70 79 20 3d  ;..      aCopy =
fbe0: 20 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c   &pKeyInfo->aCol
fbf0: 6c 5b 6e 4f 72 64 65 72 42 79 45 78 70 72 5d 3b  l[nOrderByExpr];
fc00: 0a 20 20 20 20 20 20 70 53 6f 72 74 4f 72 64 65  .      pSortOrde
fc10: 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  r = pKeyInfo->aS
fc20: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
fc30: 26 61 43 6f 70 79 5b 6e 43 6f 6c 5d 3b 0a 20 20  &aCopy[nCol];.  
fc40: 20 20 20 20 6d 65 6d 63 70 79 28 61 43 6f 70 79      memcpy(aCopy
fc50: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  , pKeyInfo->aCol
fc60: 6c 2c 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43  l, nCol*sizeof(C
fc70: 6f 6c 6c 53 65 71 2a 29 29 3b 0a 20 20 20 20 20  ollSeq*));.     
fc80: 20 61 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   apColl = pKeyIn
fc90: 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a 20 20 20 20 20  fo->aColl;.     
fca0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
fcb0: 65 72 42 79 45 78 70 72 3b 20 69 2b 2b 2c 20 70  erByExpr; i++, p
fcc0: 4f 54 65 72 6d 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  OTerm++, apColl+
fcd0: 2b 2c 20 70 53 6f 72 74 4f 72 64 65 72 2b 2b 29  +, pSortOrder++)
fce0: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
fcf0: 70 45 78 70 72 20 3d 20 70 4f 54 65 72 6d 2d 3e  pExpr = pOTerm->
fd00: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 63  pExpr;.        c
fd10: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4f 54  har *zName = pOT
fd20: 65 72 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  erm->zName;.    
fd30: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
fd40: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
fd50: 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
fd60: 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  mn<nCol );.     
fd70: 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a     if( zName ){.
fd80: 20 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c            *apCol
fd90: 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  l = sqlite3Locat
fda0: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
fdb0: 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20   zName, -1);.   
fdc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fdd0: 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
fde0: 61 43 6f 70 79 5b 70 45 78 70 72 2d 3e 69 43 6f  aCopy[pExpr->iCo
fdf0: 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20 20 20 20 7d  lumn];.        }
fe00: 0a 20 20 20 20 20 20 20 20 2a 70 53 6f 72 74 4f  .        *pSortO
fe10: 72 64 65 72 20 3d 20 70 4f 54 65 72 6d 2d 3e 73  rder = pOTerm->s
fe20: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
fe30: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
fe40: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70  p->pRightmost==p
fe50: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
fe60: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
fe70: 6d 5b 32 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20  m[2]>=0 );.     
fe80: 20 61 64 64 72 20 3d 20 70 2d 3e 61 64 64 72 4f   addr = p->addrO
fe90: 70 65 6e 45 70 68 6d 5b 32 5d 3b 0a 20 20 20 20  penEphm[2];.    
fea0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
feb0: 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 70  ngeP2(v, addr, p
fec0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  ->pEList->nExpr+
fed0: 32 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  2);.      pKeyIn
fee0: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4f 72  fo->nField = nOr
fef0: 64 65 72 42 79 45 78 70 72 3b 0a 20 20 20 20 20  derByExpr;.     
ff00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ff10: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63  geP3(v, addr, (c
ff20: 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
ff30: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
ff40: 46 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  F);.      pKeyIn
ff50: 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 65  fo = 0;.      ge
ff60: 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70  nerateSortTail(p
ff70: 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e  Parse, p, v, p->
ff80: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65  pEList->nExpr, e
ff90: 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20  Dest, iParm);.  
ffa0: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 46    }..    sqliteF
ffb0: 72 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ree(pKeyInfo);. 
ffc0: 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74   }..multi_select
ffd0: 5f 65 6e 64 3a 0a 20 20 72 65 74 75 72 6e 20 72  _end:.  return r
ffe0: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
fff0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
10000 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23  UND_SELECT */..#
10010 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10020 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 53 63  IT_VIEW./*.** Sc
10030 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  an through the e
10040 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
10050 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20    Replace every 
10060 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20  reference to.** 
10070 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
10080 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20  e number iTable 
10090 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
100a0 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a  he iColumn-th.**
100b0 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
100c0 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
100d0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
100e0 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
100f0 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a   unchanged.).**.
10100 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10110 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
10120 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64  lattening proced
10130 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79  ure.  A subquery
10140 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74  .** whose result
10150 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20   set is defined 
10160 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72  by pEList appear
10170 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68  s as entry in th
10180 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65  e.** FROM clause
10190 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63   of a SELECT suc
101a0 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  h that the VDBE 
101b0 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20  cursor assigned 
101c0 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20  to that.** FORM 
101d0 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20  clause entry is 
101e0 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f  iTable.  This ro
101f0 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e  utine make the n
10200 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61  ecessary .** cha
10210 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f  nges to pExpr so
10220 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20   that it refers 
10230 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
10240 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20  source table.** 
10250 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
10260 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c  rather the resul
10270 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62  t set of the sub
10280 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
10290 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
102a0 69 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e  ist(ExprList*,in
102b0 74 2c 45 78 70 72 4c 69 73 74 2a 29 3b 20 20 2f  t,ExprList*);  /
102c0 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20 2a  * Forward Decl *
102d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
102e0 62 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74  bstSelect(Select
102f0 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73   *, int, ExprLis
10300 74 20 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72  t *);  /* Forwar
10310 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63  d Decl */.static
10320 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 28   void substExpr(
10330 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
10340 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73   iTable, ExprLis
10350 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66  t *pEList){.  if
10360 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
10370 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  urn;.  if( pExpr
10380 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
10390 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
103a0 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ==iTable ){.    
103b0 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
103c0 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45  mn<0 ){.      pE
103d0 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
103e0 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
103f0 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a      Expr *pNew;.
10400 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
10410 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72  List!=0 && pExpr
10420 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74  ->iColumn<pEList
10430 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
10440 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
10450 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
10460 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20  r->pRight==0 && 
10470 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20  pExpr->pList==0 
10480 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
10490 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d  pEList->a[pExpr-
104a0 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b  >iColumn].pExpr;
104b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
104c0 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  New!=0 );.      
104d0 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77  pExpr->op = pNew
104e0 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65  ->op;.      asse
104f0 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
10500 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
10510 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  pr->pLeft = sqli
10520 74 65 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d  te3ExprDup(pNew-
10530 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61  >pLeft);.      a
10540 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52  ssert( pExpr->pR
10550 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
10560 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
10570 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
10580 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20  pNew->pRight);. 
10590 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
105a0 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  pr->pList==0 );.
105b0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69        pExpr->pLi
105c0 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
105d0 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c  ListDup(pNew->pL
105e0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70  ist);.      pExp
105f0 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77  r->iTable = pNew
10600 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
10610 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 4e  pExpr->pTab = pN
10620 65 77 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  ew->pTab;.      
10630 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
10640 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a   pNew->iColumn;.
10650 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
10660 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a  g = pNew->iAgg;.
10670 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
10680 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 74  enCopy(&pExpr->t
10690 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b  oken, &pNew->tok
106a0 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  en);.      sqlit
106b0 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78  e3TokenCopy(&pEx
106c0 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d  pr->span, &pNew-
106d0 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 70 45  >span);.      pE
106e0 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  xpr->pSelect = s
106f0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
10700 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  pNew->pSelect);.
10710 20 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61        pExpr->fla
10720 67 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73  gs = pNew->flags
10730 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
10740 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
10750 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61  Expr->pLeft, iTa
10760 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
10770 20 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70    substExpr(pExp
10780 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c  r->pRight, iTabl
10790 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
107a0 73 75 62 73 74 53 65 6c 65 63 74 28 70 45 78 70  substSelect(pExp
107b0 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  r->pSelect, iTab
107c0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
107d0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
107e0 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61  Expr->pList, iTa
107f0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
10800 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
10810 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78  substExprList(Ex
10820 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69  prList *pList, i
10830 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c  nt iTable, ExprL
10840 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20  ist *pEList){.  
10850 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
10860 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
10870 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
10880 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
10890 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
108a0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
108b0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
108c0 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
108d0 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
108e0 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
108f0 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74  iTable, ExprList
10900 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66 28   *pEList){.  if(
10910 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
10920 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
10930 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  >pEList, iTable,
10940 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
10950 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  tExprList(p->pGr
10960 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  oupBy, iTable, p
10970 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
10980 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65  xprList(p->pOrde
10990 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  rBy, iTable, pEL
109a0 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
109b0 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54  r(p->pHaving, iT
109c0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
109d0 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 57   substExpr(p->pW
109e0 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45  here, iTable, pE
109f0 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  List);.}.#endif 
10a00 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
10a10 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
10a20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10a30 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
10a40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
10a50 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
10a60 6e 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  n subqueries in 
10a70 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a  order to speed.*
10a80 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74  * execution.  It
10a90 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74   returns 1 if it
10aa0 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61   makes changes a
10ab0 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74  nd 0 if no flatt
10ac0 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e  ening.** occurs.
10ad0 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73  .**.** To unders
10ae0 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74  tand the concept
10af0 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20   of flattening, 
10b00 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c  consider the fol
10b10 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a  lowing.** query:
10b20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
10b30 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T a FROM (SELECT
10b40 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
10b50 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57  1 WHERE z<100) W
10b60 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54  HERE a>5.**.** T
10b70 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f  he default way o
10b80 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  f implementing t
10b90 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20  his query is to 
10ba0 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73  execute the.** s
10bb0 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e  ubquery first an
10bc0 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
10bd0 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61  lts in a tempora
10be0 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a  ry table, then.*
10bf0 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20  * run the outer 
10c00 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65  query on that te
10c10 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20  mporary table.  
10c20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77  This requires tw
10c30 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72  o.** passes over
10c40 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74   the data.  Furt
10c50 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65  hermore, because
10c60 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
10c70 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69  able.** has no i
10c80 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52  ndices, the WHER
10c90 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  E clause on the 
10ca0 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e  outer query cann
10cb0 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a  ot be.** optimiz
10cc0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
10cd0 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
10ce0 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69  to rewrite queri
10cf0 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61  es such as the a
10d00 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  bove into.** a s
10d10 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63  ingle flat selec
10d20 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  t, like this:.**
10d30 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78  .**     SELECT x
10d40 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
10d50 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20  WHERE z<100 AND 
10d60 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  a>5.**.** The co
10d70 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  de generated for
10d80 20 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74   this simpificat
10d90 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61  ion gives the sa
10da0 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74  me result.** but
10db0 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61   only has to sca
10dc0 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e  n the data once.
10dd0 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e    And because in
10de0 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20  dices might .** 
10df0 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62  exist on the tab
10e00 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74  le t1, a complet
10e10 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61  e scan of the da
10e20 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  ta might be.** a
10e30 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c  voided..**.** Fl
10e40 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79  attening is only
10e50 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c   attempted if al
10e60 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
10e70 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
10e80 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75  **   (1)  The su
10e90 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
10ea0 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
10eb0 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65  t both use aggre
10ec0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
10ed0 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
10ee0 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
10ef0 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65  gate or the oute
10f00 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
10f10 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
10f20 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
10f30 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
10f40 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
10f50 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20  eft outer join, 
10f60 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65  or.**        the
10f70 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
10f80 20 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20   itself a join. 
10f90 20 28 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a   (Ticket #306).*
10fa0 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
10fb0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
10fc0 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
10fd0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
10fe0 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
10ff0 20 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71     (5)  The subq
11000 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
11010 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65  INCT or the oute
11020 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
11030 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
11040 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
11050 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71     (6)  The subq
11060 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
11070 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
11080 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
11090 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
110a0 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
110b0 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
110c0 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20  uery has a FROM 
110d0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
110e0 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (8)  The subquer
110f0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
11100 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
11110 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
11120 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
11130 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
11140 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
11150 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
11160 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
11170 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
11180 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
11190 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75   (10)  The subqu
111a0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
111b0 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
111c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
111d0 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
111e0 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a    use LIMIT..**.
111f0 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75  **  (11)  The su
11200 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
11210 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
11220 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45  t both have ORDE
11230 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  R BY clauses..**
11240 0a 2a 2a 20 20 28 31 32 29 20 20 54 68 65 20 73  .**  (12)  The s
11250 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
11260 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66  he right term of
11270 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
11280 49 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20  IN or the.**    
11290 20 20 20 20 73 75 62 71 75 65 72 79 20 68 61 73      subquery has
112a0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
112b0 2e 20 20 28 61 64 64 65 64 20 62 79 20 74 69 63  .  (added by tic
112c0 6b 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20  ket #350).**.** 
112d0 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75   (13)  The subqu
112e0 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75  ery and outer qu
112f0 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
11300 75 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20  use LIMIT.**.** 
11310 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75   (14)  The subqu
11320 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
11330 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 49 6e   OFFSET.**.** In
11340 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
11350 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72  he "p" parameter
11360 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
11370 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11380 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72  ..** The subquer
11390 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  y is p->pSrc->a[
113a0 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69  iFrom].  isAgg i
113b0 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75  s true if the ou
113c0 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65  ter query.** use
113d0 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64  s aggregates and
113e0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69   subqueryIsAgg i
113f0 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75  s true if the su
11400 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
11410 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
11420 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
11430 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
11440 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
11450 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
11460 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
11470 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
11480 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
11490 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
114a0 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
114b0 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
114c0 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
114d0 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
114e0 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
114f0 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
11500 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
11510 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
11520 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
11530 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
11540 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
11550 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
11560 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
11570 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
11580 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
11590 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
115a0 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
115b0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
115c0 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20   isAgg,         
115d0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
115e0 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
115f0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
11600 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71  ns */.  int subq
11610 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20  ueryIsAgg    /* 
11620 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  True if the subq
11630 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
11640 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
11650 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  .){.  Select *pS
11660 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
11670 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
11680 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
11690 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
116a0 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
116b0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
116c0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  ter query */.  S
116d0 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b  rcList *pSubSrc;
116e0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
116f0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
11700 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c  query */.  ExprL
11710 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f  ist *pList;    /
11720 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
11730 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
11740 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ery */.  int iPa
11750 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  rent;        /* 
11760 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
11770 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72  er of the pSub r
11780 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74  esult set temp t
11790 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
117a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
117b0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
117c0 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
117d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117e0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
117f0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
11800 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
11810 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a   *pSubitem;   /*
11820 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   The subquery */
11830 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
11840 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e  see if flattenin
11850 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
11860 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
11870 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d  ..  */.  if( p==
11880 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
11890 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
118a0 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
118b0 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
118c0 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
118d0 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26  ;.  pSubitem = &
118e0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
118f0 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65    pSub = pSubite
11900 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73  m->pSelect;.  as
11910 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b  sert( pSub!=0 );
11920 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
11930 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
11940 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
11950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
11960 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f  triction (1)  */
11970 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
11980 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53  sAgg && pSrc->nS
11990 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  rc>1 ) return 0;
119a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
119b0 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f  triction (2)  */
119c0 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
119d0 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
119e0 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
119f0 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73  /* Prior to vers
11a00 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20  ion 3.1.2, when 
11a10 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
11a20 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c   had to be simpl
11a30 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a  e constants,.  *
11a40 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20  * not arbitrary 
11a50 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65  expresssions, we
11a60 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f   allowed some co
11a70 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54  mbining of LIMIT
11a80 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
11a90 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f   because they co
11aa0 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
11ab0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
11ac0 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54    But when LIMIT
11ad0 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
11ae0 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72   became arbitrar
11af0 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
11b00 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f  e were forced to
11b10 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e   add restriction
11b20 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20  s (13).  ** and 
11b30 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70  (14). */.  if( p
11b40 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
11b50 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
11b60 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
11b70 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
11b80 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70   (13) */.  if( p
11b90 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72  Sub->pOffset ) r
11ba0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bc0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
11bd0 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70   (14) */.  if( p
11be0 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  SubSrc->nSrc==0 
11bf0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
11c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c10 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
11c20 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 28   (7)  */.  if( (
11c30 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74  pSub->isDistinct
11c40 20 7c 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   || pSub->pLimit
11c50 29 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ) .         && (
11c60 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  pSrc->nSrc>1 || 
11c70 69 73 41 67 67 29 20 29 7b 20 20 20 20 20 20 20  isAgg) ){       
11c80 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
11c90 6e 73 20 28 34 29 28 35 29 28 38 29 28 39 29 20  ns (4)(5)(8)(9) 
11ca0 2a 2f 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  */.     return 0
11cb0 3b 20 20 20 20 20 20 20 0a 20 20 7d 0a 20 20 69  ;       .  }.  i
11cc0 66 28 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  f( p->isDistinct
11cd0 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
11ce0 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  g ) return 0;   
11cf0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
11d00 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 69  tion (6)  */.  i
11d10 66 28 20 28 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f  f( (p->disallowO
11d20 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4f 72  rderBy || p->pOr
11d30 64 65 72 42 79 29 20 26 26 20 70 53 75 62 2d 3e  derBy) && pSub->
11d40 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
11d50 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
11d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d80 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
11d90 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a  ion (11) */.  }.
11da0 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
11db0 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62  n 3:  If the sub
11dc0 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c  query is a join,
11dd0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
11de0 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a  ubquery is .  **
11df0 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65   not used as the
11e00 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
11e10 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e  f an outer join.
11e20 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68    Examples of wh
11e30 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e  y this.  ** is n
11e40 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
11e50 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
11e60 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
11e70 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20   (t2 JOIN t3).  
11e80 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
11e90 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
11ea0 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
11eb0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
11ec0 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
11ed0 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a  OIN t2) JOIN t3.
11ee0 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20    **.  ** which 
11ef0 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68  is not at all th
11f00 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20  e same thing..  
11f10 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 53 72 63  */.  if( pSubSrc
11f20 2d 3e 6e 53 72 63 3e 31 20 26 26 20 28 70 53 75  ->nSrc>1 && (pSu
11f30 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  bitem->jointype 
11f40 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
11f50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
11f60 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69    }..  /* Restri
11f70 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68  ction 12:  If th
11f80 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
11f90 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
11fa0 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a  of a left outer.
11fb0 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20    ** join, make 
11fc0 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
11fd0 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
11fe0 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65  lause..  ** An e
11ff0 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
12000 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  his is not allow
12010 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
12020 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
12030 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  TER JOIN (SELECT
12040 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
12050 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20   t2.x>0).  **.  
12060 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
12070 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
12080 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
12090 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
120a0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
120b0 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a  2) WHERE t2.x>0.
120c0 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68    **.  ** But th
120d0 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69  e t2.x>0 test wi
120e0 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f  ll always fail o
120f0 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20  n a NULL row of 
12100 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65  t2, which.  ** e
12110 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65  ffectively conve
12120 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f  rts the OUTER JO
12130 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52  IN into an INNER
12140 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66   JOIN..  */.  if
12150 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69  ( (pSubitem->joi
12160 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
12170 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 57  )!=0 && pSub->pW
12180 68 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72  here!=0 ){.    r
12190 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
121a0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
121b0 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
121c0 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ans flattening i
121d0 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20  s permitted for 
121e0 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74  the.  ** iFrom-t
121f0 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  h entry of the F
12200 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68  ROM clause in th
12210 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
12220 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61   */..  /* Move a
12230 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
12240 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
12250 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
12260 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
12270 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
12280 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
12290 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
122a0 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
122b0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
122c0 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
122d0 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
122e0 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
122f0 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
12300 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
12310 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
12320 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
12330 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
12340 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
12350 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
12360 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
12370 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
12380 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
12390 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
123a0 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
123b0 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
123c0 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
123d0 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
123e0 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61  g in..  */.  iPa
123f0 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  rent = pSubitem-
12400 3e 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20  >iCursor;.  {.  
12410 20 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20    int nSubSrc = 
12420 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20  pSubSrc->nSrc;. 
12430 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20     int jointype 
12440 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e  = pSubitem->join
12450 74 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74  type;..    sqlit
12460 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
12470 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 29   pSubitem->pTab)
12480 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
12490 28 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61  (pSubitem->zData
124a0 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  base);.    sqlit
124b0 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e  eFree(pSubitem->
124c0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
124d0 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d  teFree(pSubitem-
124e0 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66  >zAlias);.    if
124f0 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
12500 20 20 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d       int extra =
12510 20 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20   nSubSrc - 1;.  
12520 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
12530 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
12540 20 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c        pSrc = sql
12550 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
12560 64 28 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20  d(pSrc, 0, 0);. 
12570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
12580 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
12590 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e     for(i=pSrc->n
125a0 53 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d  Src-1; i-extra>=
125b0 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20  iFrom; i--){.   
125c0 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20       pSrc->a[i] 
125d0 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72  = pSrc->a[i-extr
125e0 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a];.      }.    
125f0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
12600 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a  <nSubSrc; i++){.
12610 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
12620 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
12630 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65  ->a[i];.      me
12640 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
12650 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
12660 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
12670 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
12680 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70  a[iFrom].jointyp
12690 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  e = jointype;.  
126a0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69  }..  /* Now begi
126b0 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73  n substituting s
126c0 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73  ubquery result s
126d0 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66  et expressions f
126e0 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e  or .  ** referen
126f0 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65  ces to the iPare
12700 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  nt in the outer 
12710 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a  query..  ** .  *
12720 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  * Example:.  **.
12730 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
12740 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
12750 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
12760 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
12770 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a  ) WHERE a>b;.  *
12780 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
12790 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
127a0 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
127b0 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
127c0 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20         /.  **   
127d0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
127e0 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
127f0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
12800 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
12810 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  __/.  **.  ** We
12820 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65   look at every e
12830 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
12840 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
12850 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
12860 73 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65 20  see.  ** "a" we 
12870 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22  substitute "x*3"
12880 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
12890 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73   we see "b" we s
128a0 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22  ubstitute "y+10"
128b0 2e 0a 20 20 2a 2f 0a 20 20 70 4c 69 73 74 20 3d  ..  */.  pList =
128c0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f   p->pEList;.  fo
128d0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
128e0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
128f0 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
12900 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
12910 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70  ].zName==0 && (p
12920 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
12930 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e  i].pExpr)->span.
12940 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  z!=0 ){.      pL
12950 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
12960 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
12970 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 73 70  (char*)pExpr->sp
12980 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61  an.z, pExpr->spa
12990 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n.n);.    }.  }.
129a0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
129b0 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65  p->pEList, iPare
129c0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
129d0 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 29  );.  if( isAgg )
129e0 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  {.    substExprL
129f0 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  ist(p->pGroupBy,
12a00 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
12a10 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
12a20 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  stExpr(p->pHavin
12a30 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
12a40 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  ->pEList);.  }. 
12a50 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
12a60 72 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  rBy ){.    asser
12a70 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
12a80 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  0 );.    p->pOrd
12a90 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
12aa0 64 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d  derBy;.    pSub-
12ab0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
12ac0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f   }else if( p->pO
12ad0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 75  rderBy ){.    su
12ae0 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
12af0 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74  OrderBy, iParent
12b00 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
12b10 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
12b20 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70  >pWhere ){.    p
12b30 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
12b40 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70 57 68  xprDup(pSub->pWh
12b50 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ere);.  }else{. 
12b60 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
12b70 20 7d 0a 20 20 69 66 28 20 73 75 62 71 75 65 72   }.  if( subquer
12b80 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73  yIsAgg ){.    as
12b90 73 65 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67  sert( p->pHaving
12ba0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48  ==0 );.    p->pH
12bb0 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72  aving = p->pWher
12bc0 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  e;.    p->pWhere
12bd0 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73   = pWhere;.    s
12be0 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76  ubstExpr(p->pHav
12bf0 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ing, iParent, pS
12c00 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
12c10 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71   p->pHaving = sq
12c20 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e  lite3ExprAnd(p->
12c30 70 48 61 76 69 6e 67 2c 20 73 71 6c 69 74 65 33  pHaving, sqlite3
12c40 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70 48  ExprDup(pSub->pH
12c50 61 76 69 6e 67 29 29 3b 0a 20 20 20 20 61 73 73  aving));.    ass
12c60 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
12c70 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47  ==0 );.    p->pG
12c80 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
12c90 45 78 70 72 4c 69 73 74 44 75 70 28 70 53 75 62  ExprListDup(pSub
12ca0 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d  ->pGroupBy);.  }
12cb0 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45  else{.    substE
12cc0 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69  xpr(p->pWhere, i
12cd0 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
12ce0 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 57  List);.    p->pW
12cf0 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
12d00 70 72 41 6e 64 28 70 2d 3e 70 57 68 65 72 65 2c  prAnd(p->pWhere,
12d10 20 70 57 68 65 72 65 29 3b 0a 20 20 7d 0a 0a 20   pWhere);.  }.. 
12d20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65   /* The flattene
12d30 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  d query is disti
12d40 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68  nct if either th
12d50 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20  e inner or the. 
12d60 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
12d70 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20  is distinct. .  
12d80 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74 69 6e  */.  p->isDistin
12d90 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e  ct = p->isDistin
12da0 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69  ct || pSub->isDi
12db0 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 0a 20 20  stinct;..  /*.  
12dc0 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  ** SELECT ... FR
12dd0 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c  OM (SELECT ... L
12de0 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29  IMIT a OFFSET b)
12df0 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20   LIMIT x OFFSET 
12e00 79 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 65  y;.  **.  ** One
12e10 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74   is tempted to t
12e20 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20  ry to add a and 
12e30 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65  b to combine the
12e40 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68   limits.  But th
12e50 69 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  is.  ** does not
12e60 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20   work if either 
12e70 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
12e80 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  e..  */.  if( pS
12e90 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ub->pLimit ){.  
12ea0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53    p->pLimit = pS
12eb0 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20  ub->pLimit;.    
12ec0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pSub->pLimit = 0
12ed0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69  ;.  }..  /* Fini
12ee0 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61  ally, delete wha
12ef0 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65  t is left of the
12f00 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65   subquery and re
12f10 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  turn.  ** succes
12f20 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
12f30 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
12f40 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  ub);.  return 1;
12f50 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f60 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
12f70 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
12f80 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
12f90 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e 20 61  ment passed in a
12fa0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
12fb0 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73   see if it.** is
12fc0 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20   a simple min() 
12fd0 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20  or max() query. 
12fe0 20 49 66 20 69 74 20 69 73 20 61 6e 64 20 74 68   If it is and th
12ff0 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 0a  is query can be.
13000 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75 73 69  ** satisfied usi
13010 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65 65 6b  ng a single seek
13020 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
13030 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20 69  g or end of an i
13040 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65  ndex,.** then ge
13050 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20  nerate the code 
13060 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20  for this SELECT 
13070 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20 49  and return 1.  I
13080 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
13090 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29  .** simple min()
130a0 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2c   or max() query,
130b0 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a   then return 0;.
130c0 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d  **.** A simply m
130d0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
130e0 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74  ery looks like t
130f0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  his:.**.**    SE
13100 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d  LECT min(a) FROM
13110 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45   table;.**    SE
13120 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f 4d  LECT max(a) FROM
13130 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68   table;.**.** Th
13140 65 20 71 75 65 72 79 20 6d 61 79 20 68 61 76 65  e query may have
13150 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
13160 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52 4f 4d  able in its FROM
13170 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 72   argument.  Ther
13180 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47  e.** can be no G
13190 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e  ROUP BY or HAVIN
131a0 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73  G or WHERE claus
131b0 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  es.  The result 
131c0 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74  set must.** be t
131d0 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
131e0 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f  ) of a single co
131f0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
13200 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a  e.  The column.*
13210 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f  * in the min() o
13220 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e  r max() function
13230 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78 65 64   must be indexed
13240 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61  ..**.** The para
13250 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73 20 72  meters to this r
13260 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65 20 73  outine are the s
13270 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c 69 74  ame as for sqlit
13280 65 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53  e3Select()..** S
13290 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  ee the header co
132a0 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f  mment on that ro
132b0 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
132c0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
132d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
132e0 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72  simpleMinMaxQuer
132f0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
13300 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
13310 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d  eDest, int iParm
13320 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  ){.  Expr *pExpr
13330 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20  ;.  int iCol;.  
13340 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
13350 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
13360 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20 2a  t base;.  Vdbe *
13370 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b  v;.  int seekOp;
13380 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
13390 69 73 74 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69  ist, *pList, eLi
133a0 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  st;.  struct Exp
133b0 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74  rList_item eList
133c0 49 74 65 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20  Item;.  SrcList 
133d0 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 62 72 6b  *pSrc;.  int brk
133e0 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
133f0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
13400 69 66 20 74 68 69 73 20 71 75 65 72 79 20 69 73  if this query is
13410 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20   a simple min() 
13420 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20  or max() query. 
13430 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72   Return.  ** zer
13440 6f 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e  o if it is  not.
13450 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
13460 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48  GroupBy || p->pH
13470 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65  aving || p->pWhe
13480 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  re ) return 0;. 
13490 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
134a0 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72  .  if( pSrc->nSr
134b0 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
134c0 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
134d0 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c  EList;.  if( pEL
134e0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
134f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70  return 0;.  pExp
13500 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  r = pEList->a[0]
13510 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45  .pExpr;.  if( pE
13520 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
13530 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
13540 6e 20 30 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70  n 0;.  pList = p
13550 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69  Expr->pList;.  i
13560 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  f( pList==0 || p
13570 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
13580 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
13590 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21   pExpr->token.n!
135a0 3d 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =3 ) return 0;. 
135b0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
135c0 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78 70  ICmp((char*)pExp
135d0 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22  r->token.z,"min"
135e0 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65  ,3)==0 ){.    se
135f0 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64  ekOp = OP_Rewind
13600 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
13610 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63  lite3StrNICmp((c
13620 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
13630 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20  n.z,"max",3)==0 
13640 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  ){.    seekOp = 
13650 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65  OP_Last;.  }else
13660 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
13670 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 70 4c    }.  pExpr = pL
13680 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
13690 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
136a0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
136b0 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d  turn 0;.  iCol =
136c0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
136d0 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
136e0 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 0a 20 20 2f  a[0].pTab;...  /
136f0 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 68  * If we get to h
13700 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ere, it means th
13710 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 74 68  e query is of th
13720 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a  e correct form..
13730 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61    ** Check to ma
13740 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
13750 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b  an index and mak
13760 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20  e pIdx point to 
13770 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72  the.  ** appropr
13780 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20  iate index.  If 
13790 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
137a0 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45  () is on an INTE
137b0 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a  GER PRIMARY.  **
137c0 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20   key column, no 
137d0 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73 61  index is necessa
137e0 72 79 20 73 6f 20 73 65 74 20 70 49 64 78 20 74  ry so set pIdx t
137f0 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20  o NULL.  If no. 
13800 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78   ** usable index
13810 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   is found, retur
13820 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n 0..  */.  if( 
13830 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49  iCol<0 ){.    pI
13840 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  dx = 0;.  }else{
13850 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
13860 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
13870 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
13880 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28   pExpr);.    if(
13890 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75   pColl==0 ) retu
138a0 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 49  rn 0;.    for(pI
138b0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
138c0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
138d0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
138e0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
138f0 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20  olumn>=1 );.    
13900 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
13910 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26  lumn[0]==iCol &&
13920 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73   .          0==s
13930 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
13940 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 70  dx->azColl[0], p
13950 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a  Coll->zName) ){.
13960 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13970 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13980 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72   if( pIdx==0 ) r
13990 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
139a0 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
139b0 6d 6e 20 74 79 70 65 73 20 69 66 20 77 65 20 77  mn types if we w
139c0 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65  ill be using the
139d0 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73   callback.  This
139e0 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b  .  ** step is sk
139f0 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74  ipped if the out
13a00 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20  put is going to 
13a10 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d  a table or a mem
13a20 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54  ory cell..  ** T
13a30 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
13a40 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
13a50 6e 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74  n generated in t
13a60 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
13a70 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ion..  */.  v = 
13a80 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
13a90 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
13aa0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
13ab0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
13ac0 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
13ad0 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
13ae0 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
13af0 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
13b00 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
13b10 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  emTab ){.    sql
13b20 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13b30 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
13b40 6c 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  l, iParm, 1);.  
13b50 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 69  }..  /* Generati
13b60 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20  ng code to find 
13b70 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d  the min or the m
13b80 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20 61  ax.  Basically a
13b90 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  ll we have.  ** 
13ba0 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74 68  to do is find th
13bb0 65 20 66 69 72 73 74 20 6f 72 20 74 68 65 20 6c  e first or the l
13bc0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
13bd0 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20   chosen index.  
13be0 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28  If.  ** the min(
13bf0 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
13c00 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
13c10 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 66  MARY KEY, then f
13c20 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20 20  ind the first.  
13c30 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72 79  ** or last entry
13c40 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62   in the main tab
13c50 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d  le..  */.  iDb =
13c60 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
13c70 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
13c80 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
13c90 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
13ca0 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 69 73 45 70  =0 || pTab->isEp
13cb0 68 65 6d 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  hem );.  sqlite3
13cc0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
13cd0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
13ce0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
13cf0 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
13d00 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
13d10 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 62 61  ab->zName);.  ba
13d20 73 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e  se = pSrc->a[0].
13d30 69 43 75 72 73 6f 72 3b 0a 20 20 62 72 6b 20 3d  iCursor;.  brk =
13d40 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
13d50 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70  Label(v);.  comp
13d60 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
13d70 73 28 70 50 61 72 73 65 2c 20 70 2c 20 62 72 6b  s(pParse, p, brk
13d80 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61  );.  if( pSrc->a
13d90 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29  [0].pSelect==0 )
13da0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  {.    sqlite3Ope
13db0 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 62  nTable(pParse, b
13dc0 61 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  ase, iDb, pTab, 
13dd0 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
13de0 7d 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20  }.  if( pIdx==0 
13df0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
13e00 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f  beAddOp(v, seekO
13e10 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d  p, base, 0);.  }
13e20 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 76 65  else{.    /* Eve
13e30 6e 20 74 68 6f 75 67 68 20 74 68 65 20 63 75 72  n though the cur
13e40 73 6f 72 20 75 73 65 64 20 74 6f 20 6f 70 65 6e  sor used to open
13e50 20 74 68 65 20 69 6e 64 65 78 20 68 65 72 65 20   the index here 
13e60 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 2a 2a  is closed.    **
13e70 20 61 73 20 73 6f 6f 6e 20 61 73 20 61 20 73 69   as soon as a si
13e80 6e 67 6c 65 20 76 61 6c 75 65 20 68 61 73 20 62  ngle value has b
13e90 65 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 69 74  een read from it
13ea0 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 0a 20 20  , allocate it.  
13eb0 20 20 2a 2a 20 75 73 69 6e 67 20 28 70 50 61 72    ** using (pPar
13ec0 73 65 2d 3e 6e 54 61 62 2b 2b 29 20 74 6f 20 70  se->nTab++) to p
13ed0 72 65 76 65 6e 74 20 74 68 65 20 63 75 72 73 6f  revent the curso
13ee0 72 20 69 64 20 66 72 6f 6d 20 62 65 69 6e 67 20  r id from being 
13ef0 0a 20 20 20 20 2a 2a 20 72 65 75 73 65 64 2e 20  .    ** reused. 
13f00 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
13f10 74 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73  t for statements
13f20 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 0a 20 20   of the form .  
13f30 20 20 2a 2a 20 22 49 4e 53 45 52 54 20 49 4e 54    ** "INSERT INT
13f40 4f 20 78 20 53 45 4c 45 43 54 20 6d 61 78 28 29  O x SELECT max()
13f50 20 46 52 4f 4d 20 78 22 2e 0a 20 20 20 20 2a 2f   FROM x"..    */
13f60 0a 20 20 20 20 69 6e 74 20 69 49 64 78 3b 0a 20  .    int iIdx;. 
13f70 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
13f80 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   = sqlite3IndexK
13f90 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
13fa0 49 64 78 29 3b 0a 20 20 20 20 69 49 64 78 20 3d  Idx);.    iIdx =
13fb0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
13fc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
13fd0 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
13fe0 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
13ff0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14000 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
14010 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71   iDb, 0);.    sq
14020 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
14030 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64  OP_OpenRead, iId
14040 78 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 0a  x, pIdx->tnum, .
14050 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
14060 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  Key, P3_KEYINFO_
14070 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 69 66  HANDOFF);.    if
14080 28 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77  ( seekOp==OP_Rew
14090 69 6e 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ind ){.      sql
140a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
140b0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b   OP_Null, 0, 0);
140c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
140d0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
140e0 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b  keRecord, 1, 0);
140f0 0a 20 20 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  .      seekOp = 
14100 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20 20 7d  OP_MoveGt;.    }
14110 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14120 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c  AddOp(v, seekOp,
14130 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73   iIdx, 0);.    s
14140 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14150 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20  v, OP_IdxRowid, 
14160 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71  iIdx, 0);.    sq
14170 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14180 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78  , OP_Close, iIdx
14190 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
141a0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
141b0 5f 4d 6f 76 65 47 65 2c 20 62 61 73 65 2c 20 30  _MoveGe, base, 0
141c0 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e  );.  }.  eList.n
141d0 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73  Expr = 1;.  mems
141e0 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c 20 30  et(&eListItem, 0
141f0 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74 49 74  , sizeof(eListIt
14200 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20  em));.  eList.a 
14210 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20  = &eListItem;.  
14220 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72  eList.a[0].pExpr
14230 20 3d 20 70 45 78 70 72 3b 0a 20 20 73 65 6c 65   = pExpr;.  sele
14240 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
14250 73 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c 20 30  se, p, &eList, 0
14260 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73  , 0, 0, -1, eDes
14270 74 2c 20 69 50 61 72 6d 2c 20 62 72 6b 2c 20 62  t, iParm, brk, b
14280 72 6b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  rk, 0);.  sqlite
14290 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
142a0 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 73 71 6c  l(v, brk);.  sql
142b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
142c0 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c   OP_Close, base,
142d0 20 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e   0);.  .  return
142e0 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61   1;.}../*.** Ana
142f0 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42  lyze and ORDER B
14300 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
14310 61 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43 54  ause in a SELECT
14320 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74   statement.  Ret
14330 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
14340 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
14350 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45 52  ..**.** An ORDER
14360 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
14370 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70  is a list of exp
14380 72 65 73 73 69 6f 6e 73 2e 20 20 49 66 20 61 6e  ressions.  If an
14390 79 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  y expression.** 
143a0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  is an integer co
143b0 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 61  nstant, then tha
143c0 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
143d0 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 0a  replaced by the.
143e0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
143f0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 65   entry in the re
14400 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  sult set..*/.sta
14410 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 4f  tic int processO
14420 72 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20 4e  rderGroupBy(.  N
14430 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
14440 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e       /* Name con
14450 74 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c 45  text of the SELE
14460 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f  CT statement. */
14470 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
14480 64 65 72 42 79 2c 20 20 20 2f 2a 20 54 68 65 20  derBy,   /* The 
14490 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
144a0 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62  P BY clause to b
144b0 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  e processed */. 
144c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
144d0 70 65 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72  pe     /* Either
144e0 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f   "ORDER" or "GRO
144f0 55 50 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69  UP", as appropri
14500 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ate */.){.  int 
14510 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  i;.  ExprList *p
14520 45 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c  EList = pNC->pEL
14530 69 73 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ist;     /* The 
14540 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
14550 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 50 61  e SELECT */.  Pa
14560 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
14570 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 2f  C->pParse;     /
14580 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
14590 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a   of the SELECT *
145a0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  /.  assert( pELi
145b0 73 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 4f 72  st );..  if( pOr
145c0 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
145d0 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 0;.  for(i=0; 
145e0 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
145f0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  r; i++){.    int
14600 20 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20   iCol;.    Expr 
14610 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  *pE = pOrderBy->
14620 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
14630 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
14640 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
14650 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ol) ){.      if(
14660 20 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c   iCol>0 && iCol<
14670 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  =pEList->nExpr )
14680 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14690 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b  3ExprDelete(pE);
146a0 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20 70 4f  .        pE = pO
146b0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
146c0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
146d0 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43  Dup(pEList->a[iC
146e0 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  ol-1].pExpr);.  
146f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14700 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14710 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
14720 20 20 20 20 20 20 20 22 25 73 20 42 59 20 63 6f         "%s BY co
14730 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f  lumn number %d o
14740 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68  ut of range - sh
14750 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20  ould be ".      
14760 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20       "between 1 
14770 61 6e 64 20 25 64 22 2c 20 7a 54 79 70 65 2c 20  and %d", zType, 
14780 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  iCol, pEList->nE
14790 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65  xpr);.        re
147a0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
147b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
147c0 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
147d0 4e 61 6d 65 73 28 70 4e 43 2c 20 70 45 29 20 29  Names(pNC, pE) )
147e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
147f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
14800 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
14810 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
14820 73 6f 6c 76 65 73 20 61 6e 79 20 6e 61 6d 65 73  solves any names
14830 20 75 73 65 64 20 69 6e 20 74 68 65 20 72 65 73   used in the res
14840 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 0a 2a  ult set of the.*
14850 2a 20 73 75 70 70 6c 69 65 64 20 53 45 4c 45 43  * supplied SELEC
14860 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20  T statement. If 
14870 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
14880 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 73 6f 6c  ment being resol
14890 76 65 64 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d  ved.** is a sub-
148a0 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 70 4f 75  select, then pOu
148b0 74 65 72 4e 43 20 69 73 20 61 20 70 6f 69 6e 74  terNC is a point
148c0 65 72 20 74 6f 20 74 68 65 20 4e 61 6d 65 43 6f  er to the NameCo
148d0 6e 74 65 78 74 20 0a 2a 2a 20 6f 66 20 74 68 65  ntext .** of the
148e0 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54 2e 0a   parent SELECT..
148f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
14900 6c 65 63 74 52 65 73 6f 6c 76 65 28 0a 20 20 50  lectResolve(.  P
14910 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
14920 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
14930 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
14940 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
14950 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
14960 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
14970 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
14980 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
14990 4f 75 74 65 72 4e 43 20 20 2f 2a 20 54 68 65 20  OuterNC  /* The 
149a0 6f 75 74 65 72 20 6e 61 6d 65 20 63 6f 6e 74 65  outer name conte
149b0 78 74 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e  xt. May be NULL.
149c0 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73   */.){.  ExprLis
149d0 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
149e0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 73 65      /* Result se
149f0 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  t. */.  int i;  
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a10 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76     /* For-loop v
14a20 61 72 69 61 62 6c 65 20 75 73 65 64 20 69 6e 20  ariable used in 
14a30 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 20  multiple places 
14a40 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
14a50 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20   sNC;           
14a60 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f  /* Local name-co
14a70 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
14a80 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
14a90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67 72 6f        /* The gro
14aa0 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  up by clause */.
14ab0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 72 6f  .  /* If this ro
14ac0 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65  utine has run be
14ad0 66 6f 72 65 2c 20 72 65 74 75 72 6e 20 69 6d 6d  fore, return imm
14ae0 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 69  ediately. */.  i
14af0 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64  f( p->isResolved
14b00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14b10 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a 20 20 20  !pOuterNC );.   
14b20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14b30 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 73 52 65  K;.  }.  p->isRe
14b40 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a 20 20 2f  solved = 1;..  /
14b50 2a 20 49 66 20 74 68 65 72 65 20 68 61 76 65 20  * If there have 
14b60 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65 72 72  already been err
14b70 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ors, do nothing.
14b80 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
14b90 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20  ->nErr>0 ){.    
14ba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
14bb0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ROR;.  }..  /* P
14bc0 72 65 70 61 72 65 20 74 68 65 20 73 65 6c 65 63  repare the selec
14bd0 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  t statement. Thi
14be0 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f  s call will allo
14bf0 63 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  cate all cursors
14c00 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 74  .  ** required t
14c10 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 74 61 62  o handle the tab
14c20 6c 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  les and subqueri
14c30 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
14c40 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  lause..  */.  if
14c50 28 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74  ( prepSelectStmt
14c60 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
14c70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14c80 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
14c90 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 65 78  * Resolve the ex
14ca0 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
14cb0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
14cc0 54 20 63 6c 61 75 73 65 73 2e 20 54 68 65 73 65  T clauses. These
14cd0 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c  .  ** are not al
14ce0 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72 20 74  lowed to refer t
14cf0 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20  o any names, so 
14d00 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20 4e 61  pass an empty Na
14d10 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a  meContext..  */.
14d20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
14d30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
14d40 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
14d50 50 61 72 73 65 3b 0a 20 20 69 66 28 20 73 71 6c  Parse;.  if( sql
14d60 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
14d70 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c  ames(&sNC, p->pL
14d80 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20 20 73  imit) ||.      s
14d90 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
14da0 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
14db0 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20  pOffset) ){.    
14dc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
14dd0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ROR;.  }..  /* S
14de0 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61 6c 20  et up the local 
14df0 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20  name-context to 
14e00 70 61 73 73 20 74 6f 20 45 78 70 72 52 65 73 6f  pass to ExprReso
14e10 6c 76 65 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20  lveNames() to.  
14e20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 65 20 65  ** resolve the e
14e30 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a  xpression-list..
14e40 20 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77    */.  sNC.allow
14e50 41 67 67 20 3d 20 31 3b 0a 20 20 73 4e 43 2e 70  Agg = 1;.  sNC.p
14e60 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  SrcList = p->pSr
14e70 63 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d  c;.  sNC.pNext =
14e80 20 70 4f 75 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a   pOuterNC;..  /*
14e90 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69   Resolve names i
14ea0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
14eb0 2e 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  . */.  pEList = 
14ec0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
14ed0 20 21 70 45 4c 69 73 74 20 29 20 72 65 74 75 72   !pEList ) retur
14ee0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
14ef0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
14f00 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
14f10 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d  {.    Expr *pX =
14f20 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
14f30 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  xpr;.    if( sql
14f40 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
14f50 61 6d 65 73 28 26 73 4e 43 2c 20 70 58 29 20 29  ames(&sNC, pX) )
14f60 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
14f70 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
14f80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
14f90 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 67 67  there are no agg
14fa0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
14fb0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73   in the result-s
14fc0 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50  et, and no GROUP
14fd0 20 42 59 20 0a 20 20 2a 2a 20 65 78 70 72 65 73   BY .  ** expres
14fe0 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c  sion, do not all
14ff0 6f 77 20 61 67 67 72 65 67 61 74 65 73 20 69 6e  ow aggregates in
15000 20 61 6e 79 20 6f 66 20 74 68 65 20 6f 74 68 65   any of the othe
15010 72 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  r expressions.. 
15020 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
15030 2d 3e 69 73 41 67 67 20 29 3b 0a 20 20 70 47 72  ->isAgg );.  pGr
15040 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
15050 70 42 79 3b 0a 20 20 69 66 28 20 70 47 72 6f 75  pBy;.  if( pGrou
15060 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61 73 41 67  pBy || sNC.hasAg
15070 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73 41 67  g ){.    p->isAg
15080 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 1;.  }else{.
15090 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67      sNC.allowAgg
150a0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
150b0 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75  If a HAVING clau
150c0 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74  se is present, t
150d0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
150e0 65 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  e a GROUP BY cla
150f0 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
15100 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20 21 70  p->pHaving && !p
15110 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
15120 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15130 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20  Parse, "a GROUP 
15140 42 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  BY clause is req
15150 75 69 72 65 64 20 62 65 66 6f 72 65 20 48 41 56  uired before HAV
15160 49 4e 47 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ING");.    retur
15170 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
15180 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
15190 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
151a0 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f  t to the name-co
151b0 6e 74 65 78 74 20 62 65 66 6f 72 65 20 70 61 72  ntext before par
151c0 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6f 74  sing the.  ** ot
151d0 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20  her expressions 
151e0 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
151f0 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
15200 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 65 78   so that.  ** ex
15210 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
15220 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 28 65   WHERE clause (e
15230 74 63 2e 29 20 63 61 6e 20 72 65 66 65 72 20 74  tc.) can refer t
15240 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79  o expressions by
15250 0a 20 20 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e  .  ** aliases in
15260 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
15270 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72  .  **.  ** Minor
15280 20 70 6f 69 6e 74 3a 20 49 66 20 74 68 69 73 20   point: If this 
15290 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
152a0 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
152b0 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 72 65   will be.  ** re
152c0 2d 65 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65  -evaluated for e
152d0 61 63 68 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ach reference to
152e0 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e   it..  */.  sNC.
152f0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
15300 73 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  st;.  if( sqlite
15310 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
15320 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72  s(&sNC, p->pWher
15330 65 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69  e) ||.      sqli
15340 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
15350 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61  mes(&sNC, p->pHa
15360 76 69 6e 67 29 20 7c 7c 0a 20 20 20 20 20 20 70  ving) ||.      p
15370 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70  rocessOrderGroup
15380 42 79 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 72 64  By(&sNC, p->pOrd
15390 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 20 7c  erBy, "ORDER") |
153a0 7c 0a 20 20 20 20 20 20 70 72 6f 63 65 73 73 4f  |.      processO
153b0 72 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43  rderGroupBy(&sNC
153c0 2c 20 70 47 72 6f 75 70 42 79 2c 20 22 47 52 4f  , pGroupBy, "GRO
153d0 55 50 22 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  UP").  ){.    re
153e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
153f0 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  R;.  }..  /* Mak
15400 65 20 73 75 72 65 20 74 68 65 20 47 52 4f 55 50  e sure the GROUP
15410 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20   BY clause does 
15420 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 67 72  not contain aggr
15430 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e  egate functions.
15440 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 47 72 6f  .  */.  if( pGro
15450 75 70 42 79 20 29 7b 0a 20 20 20 20 73 74 72 75  upBy ){.    stru
15460 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
15470 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 20 20   *pItem;.  .    
15480 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
15490 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47  GroupBy->a; i<pG
154a0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
154b0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
154c0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
154d0 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d 3e 70  roperty(pItem->p
154e0 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20 29 7b  Expr, EP_Agg) ){
154f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15500 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15510 20 22 61 67 67 72 65 67 61 74 65 20 66 75 6e 63   "aggregate func
15520 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c  tions are not al
15530 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20 20  lowed in ".     
15540 20 20 20 20 20 20 20 22 74 68 65 20 47 52 4f 55         "the GROU
15550 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20  P BY clause");. 
15560 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
15570 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
15580 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
15590 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6f   /* If this is o
155a0 6e 65 20 53 45 4c 45 43 54 20 6f 66 20 61 20 63  ne SELECT of a c
155b0 6f 6d 70 6f 75 6e 64 2c 20 62 65 20 73 75 72 65  ompound, be sure
155c0 20 74 6f 20 72 65 73 6f 6c 76 65 20 6e 61 6d 65   to resolve name
155d0 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 74  s.  ** in the ot
155e0 68 65 72 20 53 45 4c 45 43 54 73 2e 0a 20 20 2a  her SELECTs..  *
155f0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
15600 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
15610 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
15620 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  olve(pParse, p->
15630 70 50 72 69 6f 72 2c 20 70 4f 75 74 65 72 4e 43  pPrior, pOuterNC
15640 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
15650 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15660 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
15670 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
15680 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
15690 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
156a0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
156b0 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
156c0 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
156d0 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
156e0 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
156f0 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
15700 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
15710 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d 70  .** routine simp
15720 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20  ly stores NULLs 
15730 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20  in all of those 
15740 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f  memory cells..*/
15750 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
15760 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
15770 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
15780 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
15790 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
157a0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
157b0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
157c0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
157d0 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66  c;.  if( pAggInf
157e0 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66  o->nFunc+pAggInf
157f0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  o->nColumn==0 ){
15800 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
15810 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
15820 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
15830 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
15840 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
15850 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 41 67 67 49  P_MemNull, pAggI
15860 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
15870 6d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  m, 0);.  }.  for
15880 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
15890 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
158a0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
158b0 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
158c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
158d0 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c  dOp(v, OP_MemNul
158e0 6c 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 2c 20  l, pFunc->iMem, 
158f0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  0);.    if( pFun
15900 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  c->iDistinct>=0 
15910 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
15920 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72  E = pFunc->pExpr
15930 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
15940 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  pList==0 || pE->
15950 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
15960 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15970 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15980 65 2c 20 22 44 49 53 54 49 4e 43 54 20 69 6e 20  e, "DISTINCT in 
15990 61 67 67 72 65 67 61 74 65 20 6d 75 73 74 20 62  aggregate must b
159a0 65 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20 20 20  e followed ".   
159b0 20 20 20 20 20 20 20 20 22 62 79 20 61 6e 20 65          "by an e
159c0 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20  xpression");.   
159d0 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
159e0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
159f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15a00 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
15a10 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
15a20 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
15a30 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20   pE->pList);.   
15a40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15a50 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op3(v, OP_OpenEp
15a60 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e  hemeral, pFunc->
15a70 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 0a 20  iDistinct, 0, . 
15a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a90 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
15aa0 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  pKeyInfo, P3_KEY
15ab0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
15ac0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15ad0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
15ae0 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c   the OP_AggFinal
15af0 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65  ize opcode for e
15b00 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66  very aggregate f
15b10 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  unction.** in th
15b20 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74  e AggInfo struct
15b30 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
15b40 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46  oid finalizeAggF
15b50 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a  unctions(Parse *
15b60 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
15b70 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
15b80 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
15b90 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
15ba0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
15bb0 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72  _func *pF;.  for
15bc0 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
15bd0 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
15be0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
15bf0 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70  , pF++){.    Exp
15c00 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
15c10 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b  F->pExpr->pList;
15c20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15c30 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op3(v, OP_AggFin
15c40 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c  al, pF->iMem, pL
15c50 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
15c60 70 72 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20  pr : 0,.        
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
15c80 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
15c90 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d  P3_FUNCDEF);.  }
15ca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
15cb0 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
15cc0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
15cd0 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62  r an aggregate b
15ce0 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  ased on.** the c
15cf0 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
15d00 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  sition..*/.stati
15d10 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63  c void updateAcc
15d20 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
15d30 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
15d40 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
15d50 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
15d60 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
15d70 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
15d80 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72  _func *pF;.  str
15d90 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
15da0 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f  *pC;..  pAggInfo
15db0 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  ->directMode = 1
15dc0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
15dd0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
15de0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
15df0 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
15e00 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
15e10 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d    int addrNext =
15e20 20 30 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   0;.    ExprList
15e30 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
15e40 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
15e50 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
15e60 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d     nArg = pList-
15e70 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >nExpr;.      sq
15e80 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
15e90 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
15ea0 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ist);.    }else{
15eb0 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b  .      nArg = 0;
15ec0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
15ed0 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  F->iDistinct>=0 
15ee0 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78  ){.      addrNex
15ef0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
15f00 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
15f10 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d     assert( nArg=
15f20 3d 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =1 );.      code
15f30 44 69 73 74 69 6e 63 74 28 76 2c 20 70 46 2d 3e  Distinct(v, pF->
15f40 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e  iDistinct, addrN
15f50 65 78 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ext, 1);.    }. 
15f60 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
15f70 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b  ->needCollSeq ){
15f80 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
15f90 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
15fa0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
15fb0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
15fc0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
15fd0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
15fe0 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d  0 );  /* pList!=
15ff0 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 2d 3e  0 if pF->pFunc->
16000 6e 65 65 64 43 6f 6c 6c 53 65 71 20 69 73 20 74  needCollSeq is t
16010 72 75 65 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  rue */.      for
16020 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
16030 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
16040 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74  j<nArg; j++, pIt
16050 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
16060 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
16070 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
16080 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
16090 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
160a0 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
160b0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
160c0 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
160d0 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
160e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
160f0 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
16100 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
16110 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29  oll, P3_COLLSEQ)
16120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
16130 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
16140 5f 41 67 67 53 74 65 70 2c 20 70 46 2d 3e 69 4d  _AggStep, pF->iM
16150 65 6d 2c 20 6e 41 72 67 2c 20 28 76 6f 69 64 2a  em, nArg, (void*
16160 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 33 5f 46  )pF->pFunc, P3_F
16170 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 69 66 28  UNCDEF);.    if(
16180 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20   addrNext ){.   
16190 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
161a0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
161b0 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20  drNext);.    }. 
161c0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43   }.  for(i=0, pC
161d0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b  =pAggInfo->aCol;
161e0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63   i<pAggInfo->nAc
161f0 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20  cumulator; i++, 
16200 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  pC++){.    sqlit
16210 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
16220 65 2c 20 70 43 2d 3e 70 45 78 70 72 29 3b 0a 20  e, pC->pExpr);. 
16230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16240 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
16250 72 65 2c 20 70 43 2d 3e 69 4d 65 6d 2c 20 31 29  re, pC->iMem, 1)
16260 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
16270 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
16280 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
16290 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
162a0 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73  e given SELECT s
162b0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
162c0 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
162d0 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76  distributed in v
162e0 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65  arious ways depe
162f0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20  nding on the.** 
16300 76 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61  value of eDest a
16310 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  nd iParm..**.** 
16320 20 20 20 20 65 44 65 73 74 20 56 61 6c 75 65 20      eDest Value 
16330 20 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20        Result.** 
16340 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
16350 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
16360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
16380 2a 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62  **     SRT_Callb
16390 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68  ack    Invoke th
163a0 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65  e callback for e
163b0 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72  ach row of the r
163c0 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  esult..**.**    
163d0 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20   SRT_Mem        
163e0 20 53 74 6f 72 65 20 66 69 72 73 74 20 72 65 73   Store first res
163f0 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  ult in memory ce
16400 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  ll iParm.**.**  
16410 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20     SRT_Set      
16420 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
16430 20 61 73 20 6b 65 79 73 20 6f 66 20 74 61 62 6c   as keys of tabl
16440 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  e iParm..**.**  
16450 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20     SRT_Union    
16460 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
16470 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74   as a key in a t
16480 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
16490 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
164a0 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20 52  RT_Except      R
164b0 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72  emove results fr
164c0 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  om the temporary
164d0 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a   table iParm..**
164e0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c  .**     SRT_Tabl
164f0 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  e       Store re
16500 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61  sults in tempora
16510 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a  ry table iParm.*
16520 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61  *.** The table a
16530 62 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65  bove is incomple
16540 74 65 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20  te.  Additional 
16550 65 44 69 73 74 20 76 61 6c 75 65 20 68 61 76 65  eDist value have
16560 20 62 65 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e   be added.** sin
16570 63 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20  ce this comment 
16580 77 61 73 20 77 72 69 74 74 65 6e 2e 20 20 53 65  was written.  Se
16590 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e 65  e the selectInne
165a0 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e  rLoop() function
165b0 20 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65   for.** a comple
165c0 74 65 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68  te listing of th
165d0 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  e allowed values
165e0 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 74 68   of eDest and th
165f0 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a  eir meanings..**
16600 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16610 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
16620 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
16630 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
16640 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
16650 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
16660 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
16670 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
16680 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
16690 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
166a0 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
166b0 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
166c0 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
166d0 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
166e0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
166f0 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
16700 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74  *.** The pParent
16710 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64  , parentTab, and
16720 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66 69 65   *pParentAgg fie
16730 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69  lds are filled i
16740 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c  n if this.** SEL
16750 45 43 54 20 69 73 20 61 20 73 75 62 71 75 65 72  ECT is a subquer
16760 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
16770 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62   may try to comb
16780 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a  ine this SELECT.
16790 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61 72 65  ** with its pare
167a0 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e  nt to form a sin
167b0 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20  gle flat query. 
167c0 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74   In so doing, it
167d0 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65   might.** change
167e0 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
167f0 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67  y from a non-agg
16800 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67  regate to an agg
16810 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
16820 20 46 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e   For that reason
16830 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41 67 67  , the pParentAgg
16840 20 66 6c 61 67 20 69 73 20 70 61 73 73 65 64 20   flag is passed 
16850 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f  as a pointer, so
16860 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68   it.** can be ch
16870 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  anged..**.** Exa
16880 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20 6d 65  mple 1:   The me
16890 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 50 61  aning of the pPa
168a0 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 2e 0a  rent parameter..
168b0 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
168c0 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28  * FROM t1 JOIN (
168d0 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28  SELECT x, count(
168e0 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e  *) FROM t2) JOIN
168f0 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20   t3;.**    \    
16900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16910 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75    \_______ subqu
16920 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ery _______/    
16930 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20      /.**     \  
16940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16970 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f      /.**      \_
16980 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
16990 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
169a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
169b0 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ___/.**.** This 
169c0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
169d0 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20  d for the outer 
169e0 71 75 65 72 79 20 66 69 72 73 74 2e 20 20 20 46  query first.   F
169f0 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a  or that call,.**
16a00 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 62 65   pParent will be
16a10 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74   NULL.  During t
16a20 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66  he processing of
16a30 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
16a40 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69  , this .** routi
16a50 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ne is called rec
16a60 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61 6e 64  ursively to hand
16a70 6c 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  le the subquery.
16a80 20 20 46 6f 72 20 74 68 65 20 72 65 63 75 72 73    For the recurs
16a90 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61  ive.** call, pPa
16aa0 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20  rent will point 
16ab0 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
16ac0 72 79 2e 20 20 42 65 63 61 75 73 65 20 74 68 65  ry.  Because the
16ad0 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a 2a 20   subquery is.** 
16ae0 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  the second eleme
16af0 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d 77 61  nt in a three-wa
16b00 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72 65  y join, the pare
16b10 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65 72 20  ntTab parameter 
16b20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68  will.** be 1 (th
16b30 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66 20 61  e 2nd value of a
16b40 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72 61 79   0-indexed array
16b50 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  .).*/.int sqlite
16b60 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  3Select(.  Parse
16b70 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
16b80 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
16b90 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
16ba0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
16bb0 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
16bc0 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
16bd0 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e  g coded. */.  in
16be0 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20  t eDest,        
16bf0 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
16c00 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
16c10 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
16c20 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Parm,           
16c30 20 20 2f 2a 20 41 20 70 61 72 61 6d 65 74 65 72    /* A parameter
16c40 20 75 73 65 64 20 62 79 20 74 68 65 20 65 44 65   used by the eDe
16c50 73 74 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68  st disposal meth
16c60 6f 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  od */.  Select *
16c70 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 2f  pParent,       /
16c80 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
16c90 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
16ca0 69 73 20 61 20 73 75 62 2d 71 75 65 72 79 20 2a  is a sub-query *
16cb0 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54 61  /.  int parentTa
16cc0 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  b,         /* In
16cd0 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  dex in pParent->
16ce0 70 53 72 63 20 6f 66 20 74 68 69 73 20 71 75 65  pSrc of this que
16cf0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61  ry */.  int *pPa
16d00 72 65 6e 74 41 67 67 2c 20 20 20 20 20 20 20 2f  rentAgg,       /
16d10 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e  * True if pParen
16d20 74 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  t uses aggregate
16d30 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
16d40 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20  char *aff       
16d50 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65         /* If eDe
16d60 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c  st is SRT_Union,
16d70 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
16d80 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ring */.){.  int
16d90 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
16da0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
16db0 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49  ters */.  WhereI
16dc0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
16dd0 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20   /* Return from 
16de0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
16df0 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  n() */.  Vdbe *v
16e00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16e10 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d  /* The virtual m
16e20 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e  achine under con
16e30 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
16e40 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20  nt isAgg;       
16e50 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
16e60 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c  r select lists l
16e70 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a  ike "count(*)" *
16e80 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
16e90 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69  List;      /* Li
16ea0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
16eb0 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53   extract. */.  S
16ec0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
16ed0 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ;     /* List of
16ee0 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63   tables to selec
16ef0 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72  t from */.  Expr
16f00 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
16f10 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
16f20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
16f30 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
16f40 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
16f50 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
16f60 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
16f70 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
16f80 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
16f90 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
16fa0 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
16fb0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
16fc0 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
16fd0 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
16fe0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
16ff0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69   NULL */.  int i
17000 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
17010 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
17020 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
17030 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
17040 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20    int distinct; 
17050 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
17060 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  e to use for the
17070 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f   distinct set */
17080 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20  .  int rc = 1;  
17090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
170a0 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f  ue to return fro
170b0 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
170c0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72  */.  int addrSor
170d0 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41  tIndex;     /* A
170e0 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f  ddress of an OP_
170f0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
17100 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 41  struction */.  A
17110 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b  ggInfo sAggInfo;
17120 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
17130 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67  tion used by agg
17140 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
17150 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20  /.  int iEnd;   
17160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
17170 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64  dress of the end
17180 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
17190 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ..  if( p==0 || 
171a0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
171b0 6c 65 64 28 29 20 7c 7c 20 70 50 61 72 73 65 2d  led() || pParse-
171c0 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74  >nErr ){.    ret
171d0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
171e0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
171f0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
17200 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
17210 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
17220 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f  memset(&sAggInfo
17230 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67  , 0, sizeof(sAgg
17240 49 6e 66 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66  Info));..#ifndef
17250 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
17260 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f  POUND_SELECT.  /
17270 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72  * If there is ar
17280 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  e a sequence of 
17290 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20  queries, do the 
172a0 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72  earlier ones fir
172b0 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
172c0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
172d0 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  if( p->pRightmos
172e0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65  t==0 ){.      Se
172f0 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  lect *pLoop;.   
17300 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20     for(pLoop=p; 
17310 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
17320 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  op->pPrior){.   
17330 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67       pLoop->pRig
17340 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20  htmost = p;.    
17350 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
17360 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  turn multiSelect
17370 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73  (pParse, p, eDes
17380 74 2c 20 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a  t, iParm, aff);.
17390 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 4f    }.#endif..  pO
173a0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
173b0 65 72 42 79 3b 0a 20 20 69 66 28 20 49 67 6e 6f  erBy;.  if( Igno
173c0 72 61 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65  rableOrderby(eDe
173d0 73 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f  st) ){.    p->pO
173e0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
173f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
17400 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
17410 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20 20  e, p, 0) ){.    
17420 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
17430 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72  .  }.  p->pOrder
17440 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a  By = pOrderBy;..
17450 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20    /* Make local 
17460 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61  copies of the pa
17470 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69  rameters for thi
17480 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  s query..  */.  
17490 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
174a0 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70  rc;.  pWhere = p
174b0 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
174c0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
174d0 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
174e0 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73  p->pHaving;.  is
174f0 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a  Agg = p->isAgg;.
17500 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70    isDistinct = p
17510 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
17520 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
17530 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
17540 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
17550 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20  t_end;..  /* .  
17560 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61  ** Do not even a
17570 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61  ttempt to genera
17580 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77  te any code if w
17590 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73  e have already s
175a0 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20  een.  ** errors 
175b0 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
175c0 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f  ine starts..  */
175d0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
175e0 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c  Err>0 ) goto sel
175f0 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49  ect_end;..  /* I
17600 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d  f writing to mem
17610 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e  ory or generatin
17620 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c  g a set.  ** onl
17630 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  y a single colum
17640 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e  n may be output.
17650 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
17660 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
17670 52 59 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d  RY.  if( (eDest=
17680 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
17690 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70  t==SRT_Set) && p
176a0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29  EList->nExpr>1 )
176b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
176c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
176d0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
176e0 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
176f0 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
17700 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
17710 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
17720 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c  ");.    goto sel
17730 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e  ect_end;.  }.#en
17740 64 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20  dif..  /* ORDER 
17750 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f  BY is ignored fo
17760 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69  r some destinati
17770 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
17780 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
17790 28 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70  (eDest) ){.    p
177a0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
177b0 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
177c0 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20  erating code..  
177d0 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
177e0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
177f0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f  .  if( v==0 ) go
17800 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
17810 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
17820 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
17830 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
17840 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23  OM clause.  */.#
17850 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
17860 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
17870 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
17880 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
17890 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
178a0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
178b0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
178c0 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e  r *zSavedAuthCon
178d0 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  text = 0;.    in
178e0 74 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e  t needRestoreCon
178f0 74 65 78 74 3b 0a 20 20 20 20 73 74 72 75 63 74  text;.    struct
17900 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
17910 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
17920 2d 3e 61 5b 69 5d 3b 0a 0a 20 20 20 20 69 66 28  ->a[i];..    if(
17930 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d   pItem->pSelect=
17940 3d 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69 73 50  =0 || pItem->isP
17950 6f 70 75 6c 61 74 65 64 20 29 20 63 6f 6e 74 69  opulated ) conti
17960 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74  nue;.    if( pIt
17970 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a  em->zName!=0 ){.
17980 20 20 20 20 20 20 7a 53 61 76 65 64 41 75 74 68        zSavedAuth
17990 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65  Context = pParse
179a0 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  ->zAuthContext;.
179b0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41        pParse->zA
179c0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74  uthContext = pIt
179d0 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  em->zName;.     
179e0 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
179f0 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  ext = 1;.    }el
17a00 73 65 7b 0a 20 20 20 20 20 20 6e 65 65 64 52 65  se{.      needRe
17a10 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 30  storeContext = 0
17a20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
17a30 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
17a40 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
17a50 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20  , SRT_EphemTab, 
17a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17a70 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
17a80 2c 20 70 2c 20 69 2c 20 26 69 73 41 67 67 2c 20  , p, i, &isAgg, 
17a90 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64  0);.    if( need
17aa0 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 29  RestoreContext )
17ab0 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
17ac0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
17ad0 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
17ae0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
17af0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
17b00 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e      pWhere = p->
17b10 70 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28 20  pWhere;.    if( 
17b20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
17b30 79 28 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(eDest) ){.    
17b40 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
17b50 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
17b60 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
17b70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
17b80 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
17b90 76 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73 74  ving;.    isDist
17ba0 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
17bb0 69 6e 63 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  inct;.  }.#endif
17bc0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
17bd0 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
17be0 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72 20  e of a min() or 
17bf0 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 62  max() function b
17c00 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e  y itself.  ** in
17c10 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
17c20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70  .  */.  if( simp
17c30 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70 50  leMinMaxQuery(pP
17c40 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20  arse, p, eDest, 
17c50 69 50 61 72 6d 29 20 29 7b 0a 20 20 20 20 72 63  iParm) ){.    rc
17c60 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73   = 0;.    goto s
17c70 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
17c80 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
17c90 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  e if this is a s
17ca0 75 62 71 75 65 72 79 20 74 68 61 74 20 63 61 6e  ubquery that can
17cb0 20 62 65 20 22 66 6c 61 74 74 65 6e 65 64 22 20   be "flattened" 
17cc0 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e  into its parent.
17cd0 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  .  ** If flatten
17ce0 69 6e 67 20 69 73 20 61 20 70 6f 73 73 69 62 6c  ing is a possibl
17cf0 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72  ity, do so and r
17d00 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
17d10 79 2e 20 20 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  y.  .  */.#ifnde
17d20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
17d30 45 57 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  EW.  if( pParent
17d40 20 26 26 20 70 50 61 72 65 6e 74 41 67 67 20 26   && pParentAgg &
17d50 26 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53  &.      flattenS
17d60 75 62 71 75 65 72 79 28 70 50 61 72 65 6e 74 2c  ubquery(pParent,
17d70 20 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61   parentTab, *pPa
17d80 72 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20  rentAgg, isAgg) 
17d90 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67  ){.    if( isAgg
17da0 20 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d   ) *pParentAgg =
17db0 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   1;.    goto sel
17dc0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e  ect_end;.  }.#en
17dd0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
17de0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
17df0 59 20 63 6c 61 75 73 65 2c 20 72 65 73 6f 6c 76  Y clause, resolv
17e00 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  e any collation 
17e10 73 65 71 75 65 6e 63 65 73 0a 20 20 2a 2a 20 6e  sequences.  ** n
17e20 61 6d 65 73 20 74 68 61 74 20 68 61 76 65 20 62  ames that have b
17e30 65 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73  een explicitly s
17e40 70 65 63 69 66 69 65 64 20 61 6e 64 20 63 72 65  pecified and cre
17e50 61 74 65 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  ate a sorting in
17e60 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  dex..  **.  ** T
17e70 68 69 73 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  his sorting inde
17e80 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  x might end up b
17e90 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74  eing unused if t
17ea0 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a  he data can be .
17eb0 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69    ** extracted i
17ec0 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
17ed0 65 72 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  er.  If that is 
17ee0 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
17ef0 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45  he.  ** OP_OpenE
17f00 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
17f10 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61  tion will be cha
17f20 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f  nged to an OP_No
17f30 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20  op once.  ** we 
17f40 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20  figure out that 
17f50 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
17f60 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e  x is not needed.
17f70 20 20 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e    The addrSortIn
17f80 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  dex.  ** variabl
17f90 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63  e is used to fac
17fa0 69 6c 69 74 61 74 65 20 74 68 61 74 20 63 68 61  ilitate that cha
17fb0 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
17fc0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
17fd0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
17fe0 69 74 65 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20  item *pTerm;.   
17ff0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
18000 66 6f 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  fo;.    for(i=0,
18010 20 70 54 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d   pTerm=pOrderBy-
18020 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  >a; i<pOrderBy->
18030 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 54 65 72  nExpr; i++, pTer
18040 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
18050 70 54 65 72 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a  pTerm->zName ){.
18060 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70          pTerm->p
18070 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  Expr->pColl = sq
18080 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
18090 65 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  eq(pParse, pTerm
180a0 2d 3e 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20  ->zName, -1);.  
180b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
180c0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
180d0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
180e0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
180f0 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
18100 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
18110 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
18120 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65  erBy);.    pOrde
18130 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  rBy->iECursor = 
18140 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
18150 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
18160 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72  phm[2] = addrSor
18170 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73  tIndex =.      s
18180 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
18190 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
181a0 6c 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  l, pOrderBy->iEC
181b0 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d  ursor, pOrderBy-
181c0 3e 6e 45 78 70 72 2b 32 2c 20 20 20 20 20 20 20  >nExpr+2,       
181d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
181e0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
181f0 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
18200 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  F);.  }else{.   
18210 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d   addrSortIndex =
18220 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
18230 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
18240 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
18250 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
18260 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
18270 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
18280 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
18290 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
182a0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
182b0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 50 61  enEphemeral, iPa
182c0 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
182d0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  r);.  }..  /* Se
182e0 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
182f0 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c   */.  iEnd = sql
18300 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18310 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  l(v);.  computeL
18320 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
18330 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
18340 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72  .  /* Open a vir
18350 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73  tual index to us
18360 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
18370 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ct set..  */.  i
18380 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b  f( isDistinct ){
18390 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
183a0 65 79 49 6e 66 6f 3b 0a 20 20 20 20 64 69 73 74  eyInfo;.    dist
183b0 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
183c0 54 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49  Tab++;.    pKeyI
183d0 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
183e0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
183f0 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
18400 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
18410 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
18420 65 72 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20  eral, distinct, 
18430 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
18440 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
18450 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f  r*)pKeyInfo, P3_
18460 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
18470 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
18480 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
18490 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61 74  }..  /* Aggregat
184a0 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67  e and non-aggreg
184b0 61 74 65 20 71 75 65 72 69 65 73 20 61 72 65 20  ate queries are 
184c0 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
184d0 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  tly */.  if( !is
184e0 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d  Agg && pGroupBy=
184f0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
18500 73 20 63 61 73 65 20 69 73 20 66 6f 72 20 6e 6f  s case is for no
18510 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n-aggregate quer
18520 69 65 73 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e  ies.    ** Begin
18530 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
18540 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 57  an.    */.    pW
18550 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
18560 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
18570 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
18580 65 2c 20 26 70 4f 72 64 65 72 42 79 29 3b 0a 20  e, &pOrderBy);. 
18590 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
185a0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
185b0 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73  nd;..    /* If s
185c0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
185d0 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  t was created by
185e0 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e   a prior OP_Open
185f0 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a  Ephemeral .    *
18600 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e  * instruction en
18610 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67  ded up not being
18620 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68   needed, then ch
18630 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
18640 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a  Ephemeral.    **
18650 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
18660 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
18670 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d   addrSortIndex>=
18680 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30  0 && pOrderBy==0
18690 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
186a0 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
186b0 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64  p(v, addrSortInd
186c0 65 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d  ex, 1);.      p-
186d0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
186e0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20   = -1;.    }..  
186f0 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
18700 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
18710 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
18720 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
18730 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
18740 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
18750 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65  y, distinct, eDe
18760 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
18770 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70          iParm, p
18780 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
18790 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
187a0 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20  , aff) ){.      
187b0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
187c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
187d0 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
187e0 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
187f0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  */.    sqlite3Wh
18800 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
18810 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
18820 54 68 69 73 20 69 73 20 74 68 65 20 70 72 6f 63  This is the proc
18830 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
18840 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
18850 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
18860 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
18870 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
18880 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
18890 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
188a0 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
188b0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
188c0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
188d0 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
188e0 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
188f0 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
18900 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
18910 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
18920 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
18930 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
18940 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
18950 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
18960 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
18970 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
18980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18990 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
189a0 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
189b0 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
189c0 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
189d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189e0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
189f0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
18a00 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
18a10 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
18a20 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
18a30 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
18a40 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
18a50 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
18a60 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
18a70 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
18a80 72 64 65 72 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  rder */...    /*
18a90 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
18aa0 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 61 64  ariables hold ad
18ab0 64 72 65 73 73 65 73 20 6f 72 20 6c 61 62 65 6c  dresses or label
18ac0 73 20 66 6f 72 20 70 61 72 74 73 20 6f 66 20 74  s for parts of t
18ad0 68 65 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  he.    ** virtua
18ae0 6c 20 6d 61 63 68 69 6e 65 20 70 72 6f 67 72 61  l machine progra
18af0 6d 20 77 65 20 61 72 65 20 70 75 74 74 69 6e 67  m we are putting
18b00 20 74 6f 67 65 74 68 65 72 20 2a 2f 0a 20 20 20   together */.   
18b10 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52   int addrOutputR
18b20 6f 77 3b 20 20 20 20 20 20 2f 2a 20 53 74 61 72  ow;      /* Star
18b30 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20  t of subroutine 
18b40 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72  that outputs a r
18b50 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20  esult row */.   
18b60 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72   int addrSetAbor
18b70 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  t;       /* Set 
18b80 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
18b90 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
18ba0 20 69 6e 74 20 61 64 64 72 49 6e 69 74 69 61 6c   int addrInitial
18bb0 69 7a 65 4c 6f 6f 70 3b 20 2f 2a 20 53 74 61 72  izeLoop; /* Star
18bc0 74 20 6f 66 20 63 6f 64 65 20 74 68 61 74 20 69  t of code that i
18bd0 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 69  nitializes the i
18be0 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
18bf0 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f   int addrTopOfLo
18c00 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70 20  op;      /* Top 
18c10 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  of the input loo
18c20 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  p */.    int add
18c30 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 3b 20  rGroupByChange; 
18c40 20 2f 2a 20 43 6f 64 65 20 74 68 61 74 20 72 75   /* Code that ru
18c50 6e 73 20 77 68 65 6e 20 61 6e 79 20 47 52 4f 55  ns when any GROU
18c60 50 20 42 59 20 74 65 72 6d 20 63 68 61 6e 67 65  P BY term change
18c70 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  s */.    int add
18c80 72 50 72 6f 63 65 73 73 52 6f 77 3b 20 20 20 20  rProcessRow;    
18c90 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70 72 6f 63   /* Code to proc
18ca0 65 73 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 70  ess a single inp
18cb0 75 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e  ut row */.    in
18cc0 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
18cd0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
18ce0 61 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  all processing *
18cf0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f  /.    int addrSo
18d00 72 74 69 6e 67 49 64 78 3b 20 20 20 20 20 2f 2a  rtingIdx;     /*
18d10 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
18d20 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f  meral for the so
18d30 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  rting index */. 
18d40 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74     int addrReset
18d50 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75  ;          /* Su
18d60 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
18d70 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
18d80 75 6c 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 61  ulator */..    a
18d90 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  ddrEnd = sqlite3
18da0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
18db0 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ;..    /* Conver
18dc0 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  t TK_COLUMN node
18dd0 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  s into TK_AGG_CO
18de0 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e  LUMN and make en
18df0 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  tries in.    ** 
18e00 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c  sAggInfo for all
18e10 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
18e20 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73   nodes in expres
18e30 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20  sions of the.   
18e40 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
18e50 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ment..    */.   
18e60 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
18e70 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
18e80 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
18e90 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
18ea0 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
18eb0 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67  ist;.    sNC.pAg
18ec0 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66  gInfo = &sAggInf
18ed0 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  o;.    sAggInfo.
18ee0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d  nSortingColumn =
18ef0 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f   pGroupBy ? pGro
18f00 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20  upBy->nExpr+1 : 
18f10 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  0;.    sAggInfo.
18f20 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
18f30 70 42 79 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pBy;.    if( sql
18f40 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
18f50 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
18f60 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ist) ){.      go
18f70 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
18f80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
18f90 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
18fa0 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72  ggList(&sNC, pOr
18fb0 64 65 72 42 79 29 20 29 7b 0a 20 20 20 20 20 20  derBy) ){.      
18fc0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
18fd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
18fe0 48 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65  Having && sqlite
18ff0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
19000 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61  egates(&sNC, pHa
19010 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
19020 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
19030 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
19040 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  fo.nAccumulator 
19050 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  = sAggInfo.nColu
19060 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  mn;.    for(i=0;
19070 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e   i<sAggInfo.nFun
19080 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; i++){.      i
19090 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  f( sqlite3ExprAn
190a0 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
190b0 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  C, sAggInfo.aFun
190c0 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73  c[i].pExpr->pLis
190d0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  t) ){.        go
190e0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
190f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19100 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c   if( sqlite3Mall
19110 6f 63 46 61 69 6c 65 64 28 29 20 29 20 67 6f 74  ocFailed() ) got
19120 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
19130 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67     /* Processing
19140 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20   for aggregates 
19150 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73  with GROUP BY is
19160 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20   very different 
19170 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20  and.    ** much 
19180 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61  more complex tha
19190 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
191a0 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a  out a GROUP BY..
191b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
191c0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
191d0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
191e0 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69  fo;  /* Keying i
191f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
19200 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
19210 73 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  se */..      /* 
19220 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 74 68  Create labels th
19230 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 6e 65  at we will be ne
19240 65 64 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20  eding.      */. 
19250 20 20 20 20 0a 20 20 20 20 20 20 61 64 64 72 49      .      addrI
19260 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 20 3d 20  nitializeLoop = 
19270 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
19280 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61  abel(v);.      a
19290 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65  ddrGroupByChange
192a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
192b0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
192c0 20 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77    addrProcessRow
192d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
192e0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
192f0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
19300 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  s a GROUP BY cla
19310 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
19320 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  d a sorting inde
19330 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d  x to.      ** im
19340 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c  plement it.  All
19350 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69  ocate that sorti
19360 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49  ng index now.  I
19370 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20  f it turns out. 
19380 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
19390 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61  do not need it a
193a0 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70  fter all, the Op
193b0 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
193c0 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ruction.      **
193d0 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
193e0 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20  ed into a Noop. 
193f0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
19400 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
19410 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gIdx = pParse->n
19420 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65  Tab++;.      pKe
19430 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
19440 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
19450 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20  se, pGroupBy);. 
19460 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
19470 49 64 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20  Idx =.          
19480 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
19490 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
194a0 61 6c 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  al, sAggInfo.sor
194b0 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20  tingIdx,.       
194c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194d0 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
194e0 69 6e 67 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ingColumn,.     
194f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19500 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
19510 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  nfo, P3_KEYINFO_
19520 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20  HANDOFF);..     
19530 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d   /* Initialize m
19540 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
19550 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59  used by GROUP BY
19560 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65   aggregate proce
19570 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20  ssing.      */. 
19580 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20       iUseFlag = 
19590 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
195a0 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67        iAbortFlag
195b0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
195c0 2b 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d  +;.      iAMem =
195d0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
195e0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
195f0 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
19600 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65  Expr;.      iBMe
19610 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
19620 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
19630 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
19640 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
19650 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
19660 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c  v, OP_MemInt, 0,
19670 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
19680 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
19690 28 76 2c 20 22 23 20 63 6c 65 61 72 20 61 62 6f  (v, "# clear abo
196a0 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
196b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
196c0 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c  Op(v, OP_MemInt,
196d0 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   0, iUseFlag);. 
196e0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
196f0 28 28 76 2c 20 22 23 20 69 6e 64 69 63 61 74 65  ((v, "# indicate
19700 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70   accumulator emp
19710 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ty"));.      sql
19720 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
19730 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
19740 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29  rInitializeLoop)
19750 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
19760 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
19770 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
19780 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
19790 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
197a0 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75  ** set.  This su
197b0 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c  broutine first l
197c0 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65  ooks at the iUse
197d0 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c  Flag.  If iUseFl
197e0 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c  ag.      ** is l
197f0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
19800 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73  l to zero, the s
19810 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  ubroutine is a n
19820 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20  o-op.  If.      
19830 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  ** the processin
19840 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  g calls for the 
19850 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20  query to abort, 
19860 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a  this subroutine.
19870 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65        ** increme
19880 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c  nts the iAbortFl
19890 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ag memory locati
198a0 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  on before return
198b0 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ing in.      ** 
198c0 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20  order to signal 
198d0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62  the caller to ab
198e0 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ort..      */.  
198f0 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74      addrSetAbort
19900 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
19910 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
19920 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19930 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
19940 74 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67  t, 1, iAbortFlag
19950 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
19960 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 65 74 20  ment((v, "# set 
19970 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
19980 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19990 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75  AddOp(v, OP_Retu
199a0 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rn, 0, 0);.     
199b0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
199c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
199d0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
199e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
199f0 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f  Op(v, OP_IfMemPo
19a00 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64  s, iUseFlag, add
19a10 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20  rOutputRow+2);. 
19a20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
19a30 28 28 76 2c 20 22 23 20 47 72 6f 75 70 62 79 20  ((v, "# Groupby 
19a40 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
19a50 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b   entry point"));
19a60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19a70 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
19a80 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  turn, 0, 0);.   
19a90 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
19aa0 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
19ab0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
19ac0 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
19ad0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19ae0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
19af0 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
19b00 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 31 29  rOutputRow+1, 1)
19b10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19b20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72  rc = selectInner
19b30 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
19b40 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p->pEList, 0, 0,
19b50 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   pOrderBy,.     
19b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b70 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20        distinct, 
19b80 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20  eDest, iParm, . 
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ba0 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75            addrOu
19bb0 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53  tputRow+1, addrS
19bc0 65 74 41 62 6f 72 74 2c 20 61 66 66 29 3b 0a 20  etAbort, aff);. 
19bd0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
19be0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
19bf0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
19c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19c10 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74  eAddOp(v, OP_Ret
19c20 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  urn, 0, 0);.    
19c30 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
19c40 2c 20 22 23 20 65 6e 64 20 67 72 6f 75 70 62 79  , "# end groupby
19c50 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
19c60 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
19c70 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
19c80 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
19c90 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
19ca0 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
19cb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
19cc0 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65  drReset = sqlite
19cd0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
19ce0 28 76 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  (v);.      reset
19cf0 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
19d00 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
19d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19d20 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74  eAddOp(v, OP_Ret
19d30 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  urn, 0, 0);..   
19d40 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
19d50 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
19d60 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
19d70 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
19d80 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
19d90 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
19da0 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
19db0 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
19dc0 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
19dd0 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
19de0 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
19df0 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
19e00 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
19e10 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
19e20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
19e30 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
19e40 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
19e50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
19e60 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
19e70 61 62 65 6c 28 76 2c 20 61 64 64 72 49 6e 69 74  abel(v, addrInit
19e80 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20  ializeLoop);.   
19e90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19ea0 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
19eb0 20 30 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a   0, addrReset);.
19ec0 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
19ed0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
19ee0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
19ef0 74 2c 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f  t, pWhere, &pGro
19f00 75 70 42 79 29 3b 0a 20 20 20 20 20 20 69 66 28  upBy);.      if(
19f10 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
19f20 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
19f30 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
19f40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
19f50 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  * The optimizer 
19f60 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76  is able to deliv
19f70 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70  er rows in group
19f80 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20   by order so.   
19f90 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f       ** we do no
19fa0 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20  t have to sort. 
19fb0 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
19fc0 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  meral table will
19fd0 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63   be.        ** c
19fe0 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62  ancelled later b
19ff0 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20  ecause we still 
1a000 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  need to use the 
1a010 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20  pKeyInfo.       
1a020 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72 6f   */.        pGro
1a030 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
1a040 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f 75  By;.        grou
1a050 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20  pBySort = 0;.   
1a060 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a070 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f    /* Rows are co
1a080 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65  ming out in unde
1a090 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20  termined order. 
1a0a0 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68   We have to push
1a0b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68  .        ** each
1a0c0 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74   row into a sort
1a0d0 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69  ing index, termi
1a0e0 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c  nate the first l
1a0f0 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  oop,.        ** 
1a100 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74  then loop over t
1a110 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
1a120 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
1a130 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
1a140 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64      ** in sorted
1a150 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
1a160 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  /.        groupB
1a170 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  ySort = 1;.     
1a180 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1a190 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
1a1a0 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  e, pGroupBy);.  
1a1b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a1c0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71  eAddOp(v, OP_Seq
1a1d0 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e  uence, sAggInfo.
1a1e0 73 6f 72 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a  sortingIdx, 0);.
1a1f0 20 20 20 20 20 20 20 20 6a 20 3d 20 70 47 72 6f          j = pGro
1a200 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20  upBy->nExpr+1;. 
1a210 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1a220 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
1a230 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
1a240 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
1a250 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
1a260 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
1a270 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1a280 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
1a290 75 6d 6e 3c 6a 20 29 20 63 6f 6e 74 69 6e 75 65  umn<j ) continue
1a2a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1a2b0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  pCol->iColumn<0 
1a2c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1a2d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1a2e0 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 70 43 6f  v, OP_Rowid, pCo
1a2f0 6c 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  l->iTable, 0);. 
1a300 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1a310 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1a320 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1a330 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d  OP_Column, pCol-
1a340 3e 69 54 61 62 6c 65 2c 20 70 43 6f 6c 2d 3e 69  >iTable, pCol->i
1a350 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
1a360 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6a     }.          j
1a370 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
1a380 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a390 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
1a3a0 65 52 65 63 6f 72 64 2c 20 6a 2c 20 30 29 3b 0a  eRecord, j, 0);.
1a3b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1a3c0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
1a3d0 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e  dxInsert, sAggIn
1a3e0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 30  fo.sortingIdx, 0
1a3f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1a400 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
1a410 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
1a420 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1a430 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e 66  OP_Sort, sAggInf
1a440 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
1a450 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  drEnd);.        
1a460 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1a470 22 23 20 47 52 4f 55 50 20 42 59 20 73 6f 72 74  "# GROUP BY sort
1a480 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67  "));.        sAg
1a490 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67  gInfo.useSorting
1a4a0 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Idx = 1;.      }
1a4b0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75  ..      /* Evalu
1a4c0 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ate the current 
1a4d0 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
1a4e0 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20  nd store in b0, 
1a4f0 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20  b1, b2....      
1a500 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79  ** (b0 is memory
1a510 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b   location iBMem+
1a520 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31  0, b1 is iBMem+1
1a530 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a  , and so forth).
1a540 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f        ** Then co
1a550 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e  mpare the curren
1a560 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
1a570 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f   against the GRO
1a580 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20  UP BY terms.    
1a590 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72    ** from the pr
1a5a0 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65  evious row curre
1a5b0 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61  ntly stored in a
1a5c0 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20  0, a1, a2....   
1a5d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
1a5e0 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69  TopOfLoop = sqli
1a5f0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1a600 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72  dr(v);.      for
1a610 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79  (j=0; j<pGroupBy
1a620 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
1a630 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70         if( group
1a640 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
1a650 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a660 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
1a670 6e 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  n, sAggInfo.sort
1a680 69 6e 67 49 64 78 2c 20 6a 29 3b 0a 20 20 20 20  ingIdx, j);.    
1a690 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a6a0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69       sAggInfo.di
1a6b0 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
1a6c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a6d0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1a6e0 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70  pGroupBy->a[j].p
1a6f0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
1a700 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a710 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1a720 4d 65 6d 53 74 6f 72 65 2c 20 69 42 4d 65 6d 2b  MemStore, iBMem+
1a730 6a 2c 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  j, j<pGroupBy->n
1a740 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d  Expr-1);.      }
1a750 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 47 72  .      for(j=pGr
1a760 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20  oupBy->nExpr-1; 
1a770 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20  j>=0; j--){.    
1a780 20 20 20 20 69 66 28 20 6a 3c 70 47 72 6f 75 70      if( j<pGroup
1a790 42 79 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20  By->nExpr-1 ){. 
1a7a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1a7b0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1a7c0 4d 65 6d 4c 6f 61 64 2c 20 69 42 4d 65 6d 2b 6a  MemLoad, iBMem+j
1a7d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
1a7e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1a7f0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
1a800 65 6d 4c 6f 61 64 2c 20 69 41 4d 65 6d 2b 6a 2c  emLoad, iAMem+j,
1a810 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
1a820 20 6a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   j==0 ){.       
1a830 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a840 64 4f 70 28 76 2c 20 4f 50 5f 45 71 2c 20 30 78  dOp(v, OP_Eq, 0x
1a850 32 30 30 2c 20 61 64 64 72 50 72 6f 63 65 73 73  200, addrProcess
1a860 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Row);.        }e
1a870 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
1a880 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1a890 76 2c 20 4f 50 5f 4e 65 2c 20 30 78 32 30 30 2c  v, OP_Ne, 0x200,
1a8a0 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e   addrGroupByChan
1a8b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
1a8c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1a8d0 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
1a8e0 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66  , (void*)pKeyInf
1a8f0 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 2c 20 50 33 5f  o->aColl[j], P3_
1a900 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
1a910 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  }..      /* Gene
1a920 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72  rate code that r
1a930 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  uns whenever the
1a940 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65   GROUP BY change
1a950 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e  s..      ** Chan
1a960 67 65 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20  ge in the GROUP 
1a970 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20  BY are detected 
1a980 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
1a990 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c  code.      ** bl
1a9a0 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77  ock.  If there w
1a9b0 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20  ere no changes, 
1a9c0 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b  this block is sk
1a9d0 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ipped..      **.
1a9e0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
1a9f0 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e  de copies curren
1aa00 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73  t group by terms
1aa10 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e   in b0,b1,b2,...
1aa20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  .      ** over t
1aa30 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20  o a0,a1,a2.  It 
1aa40 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f  then calls the o
1aa50 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
1aa60 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
1aa70 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61  sets the aggrega
1aa80 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  te accumulator r
1aa90 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70  egisters in prep
1aaa0 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  aration.      **
1aab0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52   for the next GR
1aac0 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20  OUP BY batch..  
1aad0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
1aae0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1aaf0 61 62 65 6c 28 76 2c 20 61 64 64 72 47 72 6f 75  abel(v, addrGrou
1ab00 70 42 79 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  pByChange);.    
1ab10 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72    for(j=0; j<pGr
1ab20 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b  oupBy->nExpr; j+
1ab30 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
1ab40 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1ab50 4f 50 5f 4d 65 6d 4d 6f 76 65 2c 20 69 41 4d 65  OP_MemMove, iAMe
1ab60 6d 2b 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  m+j, iBMem+j);. 
1ab70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1ab80 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1ab90 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64   OP_Gosub, 0, ad
1aba0 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
1abb0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1abc0 28 76 2c 20 22 23 20 6f 75 74 70 75 74 20 6f 6e  (v, "# output on
1abd0 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20  e row"));.      
1abe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1abf0 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c  (v, OP_IfMemPos,
1ac00 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64   iAbortFlag, add
1ac10 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62  rEnd);.      Vdb
1ac20 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
1ac30 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67  check abort flag
1ac40 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1ac50 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1ac60 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72  P_Gosub, 0, addr
1ac70 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  Reset);.      Vd
1ac80 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
1ac90 20 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74   reset accumulat
1aca0 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
1acb0 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72   Update the aggr
1acc0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
1acd0 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  rs based on the 
1ace0 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20  content of.     
1acf0 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
1ad00 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  row.      */.   
1ad10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1ad20 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
1ad30 64 72 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20  drProcessRow);. 
1ad40 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
1ad50 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
1ad60 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
1ad70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ad80 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20  p(v, OP_MemInt, 
1ad90 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  1, iUseFlag);.  
1ada0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1adb0 28 76 2c 20 22 23 20 69 6e 64 69 63 61 74 65 20  (v, "# indicate 
1adc0 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61  data in accumula
1add0 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
1ade0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
1adf0 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
1ae00 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
1ae10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1ae20 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1ae30 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66  OP_Next, sAggInf
1ae40 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
1ae50 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  drTopOfLoop);.  
1ae60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ae70 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
1ae80 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
1ae90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1aea0 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
1aeb0 64 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31  ddrSortingIdx, 1
1aec0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1aed0 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
1aee0 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73  final row of res
1aef0 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ult.      */.   
1af00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1af10 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
1af20 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f   0, addrOutputRo
1af30 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
1af40 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6f 75 74  mment((v, "# out
1af50 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29  put final row"))
1af60 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 20 2f  ;.      .    } /
1af70 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79  * endif pGroupBy
1af80 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20   */.    else {. 
1af90 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73       /* This cas
1afa0 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67  e runs if the ag
1afb0 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47  gregate has no G
1afc0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
1afd0 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 72   The.      ** pr
1afe0 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68  ocessing is much
1aff0 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74   simpler since t
1b000 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
1b010 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20  ingle row.      
1b020 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20  ** of output..  
1b030 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 73      */.      res
1b040 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
1b050 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
1b060 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
1b070 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1b080 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
1b090 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30 29 3b  ist, pWhere, 0);
1b0a0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
1b0b0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
1b0c0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 75 70  ct_end;.      up
1b0d0 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
1b0e0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
1b0f0 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
1b100 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
1b110 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
1b120 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
1b130 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
1b140 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
1b150 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
1b160 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
1b170 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1b180 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
1b190 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20  aving, addrEnd, 
1b1a0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
1b1b0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
1b1c0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
1b1d0 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c  pEList, 0, 0, 0,
1b1e0 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20   -1, .          
1b1f0 20 20 20 20 20 20 20 20 20 20 20 20 65 44 65 73              eDes
1b200 74 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 45 6e  t, iParm, addrEn
1b210 64 2c 20 61 64 64 72 45 6e 64 2c 20 61 66 66 29  d, addrEnd, aff)
1b220 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1b230 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1b240 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b  bel(v, addrEnd);
1b250 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64  .    .  } /* end
1b260 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65  if aggregate que
1b270 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  ry */..  /* If t
1b280 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
1b290 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
1b2a0 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74   we need to sort
1b2b0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
1b2c0 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20  * and send them 
1b2d0 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
1b2e0 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f  one by one..  */
1b2f0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
1b300 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53  ){.    generateS
1b310 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
1b320 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  p, v, pEList->nE
1b330 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72  xpr, eDest, iPar
1b340 6d 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  m);.  }..#ifndef
1b350 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1b360 51 55 45 52 59 0a 20 20 2f 2a 20 49 66 20 74 68  QUERY.  /* If th
1b370 69 73 20 77 61 73 20 61 20 73 75 62 71 75 65 72  is was a subquer
1b380 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63  y, we have now c
1b390 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73 75 62  onverted the sub
1b3a0 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a  query into a.  *
1b3b0 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
1b3c0 65 2e 20 20 53 6f 20 73 65 74 20 74 68 65 20 53  e.  So set the S
1b3d0 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69 73 50 6f  rcList_item.isPo
1b3e0 70 75 6c 61 74 65 64 20 66 6c 61 67 20 74 6f 20  pulated flag to 
1b3f0 70 72 65 76 65 6e 74 0a 20 20 2a 2a 20 74 68 69  prevent.  ** thi
1b400 73 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20  s subquery from 
1b410 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20  being evaluated 
1b420 61 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72  again and to for
1b430 63 65 20 74 68 65 20 75 73 65 20 6f 66 0a 20 20  ce the use of.  
1b440 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ** the temporary
1b450 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
1b460 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  f( pParent ){.  
1b470 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1b480 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61  t->pSrc->nSrc>pa
1b490 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61  rentTab );.    a
1b4a0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1b4b0 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61  pSrc->a[parentTa
1b4c0 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b  b].pSelect==p );
1b4d0 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53  .    pParent->pS
1b4e0 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d  rc->a[parentTab]
1b4f0 2e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31  .isPopulated = 1
1b500 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1b510 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
1b520 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a  skip this query.
1b530 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1b540 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1b550 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54  , iEnd);..  /* T
1b560 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75  he SELECT was su
1b570 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64  ccessfully coded
1b580 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75  .   Set the retu
1b590 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a  rn code to 0.  *
1b5a0 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f  * to indicate no
1b5b0 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20   errors..  */.  
1b5c0 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  rc = 0;..  /* Co
1b5d0 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68  ntrol jumps to h
1b5e0 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ere if an error 
1b5f0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  is encountered a
1b600 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20  bove, or upon.  
1b610 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f  ** successful co
1b620 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45  ding of the SELE
1b630 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f  CT..  */.select_
1b640 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  end:..  /* Ident
1b650 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ify column names
1b660 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75   if we will be u
1b670 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63  sing them in a c
1b680 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20  allback.  This. 
1b690 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70   ** step is skip
1b6a0 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75  ped if the outpu
1b6b0 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f  t is going to so
1b6c0 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61  me other destina
1b6d0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
1b6e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1b6f0 26 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  & eDest==SRT_Cal
1b700 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e  lback ){.    gen
1b710 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
1b720 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
1b730 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
1b740 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 73 41  .  sqliteFree(sA
1b750 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20  ggInfo.aCol);.  
1b760 73 71 6c 69 74 65 46 72 65 65 28 73 41 67 67 49  sqliteFree(sAggI
1b770 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65  nfo.aFunc);.  re
1b780 74 75 72 6e 20 72 63 3b 0a 7d 0a                 turn rc;.}.