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

Artifact 38eda11d950ed5e631ea9054f84a4a8b9e9b39d8:


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 31 34  select.c,v 1.314
0200: 20 32 30 30 36 2f 30 36 2f 31 31 20 32 33 3a 34   2006/06/11 23:4
0210: 31 3a 35 36 20 64 72 68 20 45 78 70 20 24 0a 2a  1:56 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 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
1420: 2a 63 72 65 61 74 65 49 64 45 78 70 72 28 63 6f  *createIdExpr(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 63 72 65 61 74 65 49 64 45 78 70 72 28 7a  = createIdExpr(z
1740: 43 6f 6c 29 3b 0a 20 20 70 45 32 61 20 3d 20 63  Col);.  pE2a = c
1750: 72 65 61 74 65 49 64 45 78 70 72 28 7a 43 6f 6c  reateIdExpr(zCol
1760: 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 31  );.  if( zAlias1
1770: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61  ==0 ){.    zAlia
1780: 73 31 20 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d  s1 = pTab1->zNam
1790: 65 3b 0a 20 20 7d 0a 20 20 70 45 31 62 20 3d 20  e;.  }.  pE1b = 
17a0: 63 72 65 61 74 65 49 64 45 78 70 72 28 7a 41 6c  createIdExpr(zAl
17b0: 69 61 73 31 29 3b 0a 20 20 69 66 28 20 7a 41 6c  ias1);.  if( zAl
17c0: 69 61 73 32 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  ias2==0 ){.    z
17d0: 41 6c 69 61 73 32 20 3d 20 70 54 61 62 32 2d 3e  Alias2 = pTab2->
17e0: 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45 32  zName;.  }.  pE2
17f0: 62 20 3d 20 63 72 65 61 74 65 49 64 45 78 70 72  b = createIdExpr
1800: 28 7a 41 6c 69 61 73 32 29 3b 0a 20 20 70 45 31  (zAlias2);.  pE1
1810: 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  c = sqlite3Expr(
1820: 54 4b 5f 44 4f 54 2c 20 70 45 31 62 2c 20 70 45  TK_DOT, pE1b, pE
1830: 31 61 2c 20 30 29 3b 0a 20 20 70 45 32 63 20 3d  1a, 0);.  pE2c =
1840: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
1850: 44 4f 54 2c 20 70 45 32 62 2c 20 70 45 32 61 2c  DOT, pE2b, pE2a,
1860: 20 30 29 3b 0a 20 20 70 45 20 3d 20 73 71 6c 69   0);.  pE = sqli
1870: 74 65 33 45 78 70 72 28 54 4b 5f 45 51 2c 20 70  te3Expr(TK_EQ, p
1880: 45 31 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20  E1c, pE2c, 0);. 
1890: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
18a0: 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  (pE, EP_FromJoin
18b0: 29 3b 0a 20 20 70 45 2d 3e 69 52 69 67 68 74 4a  );.  pE->iRightJ
18c0: 6f 69 6e 54 61 62 6c 65 20 3d 20 69 52 69 67 68  oinTable = iRigh
18d0: 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 2a 70  tJoinTable;.  *p
18e0: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
18f0: 78 70 72 41 6e 64 28 2a 70 70 45 78 70 72 2c 20  xprAnd(*ppExpr, 
1900: 70 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  pE);.}../*.** Se
1910: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
1920: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
1930: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
1940: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
1950: 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20  .** And set the 
1960: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
1970: 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66  able to iTable f
1980: 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  or every term in
1990: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
19a0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50  on..**.** The EP
19b0: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
19c0: 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65  ty is used on te
19d0: 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73  rms of an expres
19e0: 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20  sion to tell.** 
19f0: 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  the LEFT OUTER J
1a00: 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  OIN processing l
1a10: 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74  ogic that this t
1a20: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74  erm is part of t
1a30: 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72  he.** join restr
1a40: 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  iction specified
1a50: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
1a60: 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  ING clause and n
1a70: 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ot a part.** of 
1a80: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
1a90: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
1aa0: 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20  These terms are 
1ab0: 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68  moved over to th
1ac0: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
1ad0: 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72  e during join pr
1ae0: 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20  ocessing but we 
1af0: 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
1b00: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72   that they.** or
1b10: 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20  iginated in the 
1b20: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
1b30: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  se..**.** The Ex
1b40: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
1b50: 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45  le tells the WHE
1b60: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
1b70: 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a  sing that the.**
1b80: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65   expression depe
1b90: 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69  nds on table iRi
1ba0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65  ghtJoinTable eve
1bb0: 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20  n if that table 
1bc0: 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63  is not.** explic
1bd0: 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69  itly mentioned i
1be0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
1bf0: 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74  .  That informat
1c00: 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ion is needed.**
1c10: 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20   for cases like 
1c20: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
1c30: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1c40: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
1c50: 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31  t1.a=t2.b AND t1
1c60: 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  .x=5.**.** The w
1c70: 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64  here clause need
1c80: 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68  s to defer the h
1c90: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74  andling of the t
1ca0: 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e  1.x=5.** term un
1cb0: 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32  til after the t2
1cc0: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69   loop of the joi
1cd0: 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c  n.  In that way,
1ce0: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f   a.** NULL t2 ro
1cf0: 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  w will be insert
1d00: 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78  ed whenever t1.x
1d10: 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  !=5.  If we do n
1d20: 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20  ot.** defer the 
1d30: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78  handling of t1.x
1d40: 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70  =5, it will be p
1d50: 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61  rocessed immedia
1d60: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68  tely.** after th
1d70: 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f  e t1 loop and ro
1d80: 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20  ws with t1.x!=5 
1d90: 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61  will never appea
1da0: 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70  r in.** the outp
1db0: 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63  ut, which is inc
1dc0: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
1dd0: 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78  c void setJoinEx
1de0: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
1df0: 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65  iTable){.  while
1e00: 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53  ( p ){.    ExprS
1e10: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
1e20: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
1e30: 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  p->iRightJoinTab
1e40: 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20  le = iTable;.   
1e50: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e   setJoinExpr(p->
1e60: 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a  pLeft, iTable);.
1e70: 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68      p = p->pRigh
1e80: 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  t;.  } .}../*.**
1e90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72   This routine pr
1ea0: 6f 63 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e  ocesses the join
1eb0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
1ec0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
1ed0: 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55  ent..** ON and U
1ee0: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65  SING clauses are
1ef0: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
1f00: 65 78 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74  extra terms of t
1f10: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
1f20: 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e  .** NATURAL join
1f30: 73 20 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78  s also create ex
1f40: 74 72 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  tra WHERE clause
1f50: 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   terms..**.** Th
1f60: 65 20 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f  e terms of a FRO
1f70: 4d 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e  M clause are con
1f80: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65  tained in the Se
1f90: 6c 65 63 74 2e 70 53 72 63 20 73 74 72 75 63 74  lect.pSrc struct
1fa0: 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ure..** The left
1fb0: 20 6d 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74   most table is t
1fc0: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
1fd0: 6e 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20  n Select.pSrc.  
1fe0: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a  The right-most.*
1ff0: 2a 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c  * table is the l
2000: 61 73 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20  ast entry.  The 
2010: 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73  join operator is
2020: 20 68 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74   held in the ent
2030: 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66  ry to.** the lef
2040: 74 2e 20 20 54 68 75 73 20 65 6e 74 72 79 20 30  t.  Thus entry 0
2050: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f   contains the jo
2060: 69 6e 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  in operator for 
2070: 74 68 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e  the join between
2080: 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e  .** entries 0 an
2090: 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20  d 1.  Any ON or 
20a0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73  USING clauses as
20b0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
20c0: 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c  e join are.** al
20d0: 73 6f 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  so attached to t
20e0: 68 65 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a  he left entry..*
20f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2100: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
2110: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65  mber of errors e
2120: 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73  ncountered..*/.s
2130: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
2140: 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73  ProcessJoin(Pars
2150: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
2160: 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74  t *p){.  SrcList
2170: 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20 20 20   *pSrc;         
2180: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
2190: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
21a0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  OM clause */.  i
21b0: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21d0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
21e0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
21f0: 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b  ist_item *pLeft;
2200: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62       /* Left tab
2210: 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20  le being joined 
2220: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
2230: 69 73 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74  ist_item *pRight
2240: 3b 20 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61  ;    /* Right ta
2250: 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64  ble being joined
2260: 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d   */..  pSrc = p-
2270: 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d  >pSrc;.  pLeft =
2280: 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20   &pSrc->a[0];.  
2290: 70 52 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b  pRight = &pLeft[
22a0: 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  1];.  for(i=0; i
22b0: 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69  <pSrc->nSrc-1; i
22c0: 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c  ++, pRight++, pL
22d0: 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  eft++){.    Tabl
22e0: 65 20 2a 70 4c 65 66 74 54 61 62 20 3d 20 70 4c  e *pLeftTab = pL
22f0: 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54  eft->pTab;.    T
2300: 61 62 6c 65 20 2a 70 52 69 67 68 74 54 61 62 20  able *pRightTab 
2310: 3d 20 70 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a  = pRight->pTab;.
2320: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 54 61  .    if( pLeftTa
2330: 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61  b==0 || pRightTa
2340: 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
2350: 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68  ..    /* When th
2360: 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
2370: 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64  d is present, ad
2380: 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  d WHERE clause t
2390: 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20  erms for.    ** 
23a0: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61  every column tha
23b0: 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  t the two tables
23c0: 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e   have in common.
23d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
23e0: 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74 79 70 65 20  pLeft->jointype 
23f0: 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a  & JT_NATURAL ){.
2400: 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
2410: 3e 70 4f 6e 20 7c 7c 20 70 4c 65 66 74 2d 3e 70  >pOn || pLeft->p
2420: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  Using ){.       
2430: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2440: 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55  (pParse, "a NATU
2450: 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74  RAL join may not
2460: 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20   have ".        
2470: 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49     "an ON or USI
2480: 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a  NG clause", 0);.
2490: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
24a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24b0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66 74  for(j=0; j<pLeft
24c0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
24d0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
24e0: 4e 61 6d 65 20 3d 20 70 4c 65 66 74 54 61 62 2d  Name = pLeftTab-
24f0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
2500: 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75          if( colu
2510: 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61  mnIndex(pRightTa
2520: 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  b, zName)>=0 ){.
2530: 20 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65            addWhe
2540: 72 65 54 65 72 6d 28 7a 4e 61 6d 65 2c 20 70 4c  reTerm(zName, pL
2550: 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a  eftTab, pLeft->z
2560: 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20 20 20  Alias, .        
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2580: 20 20 20 20 20 20 70 52 69 67 68 74 54 61 62 2c        pRightTab,
2590: 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c   pRight->zAlias,
25a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
25c0: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20  Right->iCursor, 
25d0: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
25e0: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
25f0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2600: 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77  .    /* Disallow
2610: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
2620: 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68  NG clauses in th
2630: 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20  e same join.    
2640: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  */.    if( pLeft
2650: 2d 3e 70 4f 6e 20 26 26 20 70 4c 65 66 74 2d 3e  ->pOn && pLeft->
2660: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2670: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2680: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
2690: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
26a0: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
26b0: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
26c0: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
26d0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
26e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
26f0: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
2700: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2710: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
2720: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
2730: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
2740: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
2750: 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 29 7b 0a  ( pLeft->pOn ){.
2760: 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70        setJoinExp
2770: 72 28 70 4c 65 66 74 2d 3e 70 4f 6e 2c 20 70 52  r(pLeft->pOn, pR
2780: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  ight->iCursor);.
2790: 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20        p->pWhere 
27a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
27b0: 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 4c 65 66  (p->pWhere, pLef
27c0: 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70  t->pOn);.      p
27d0: 4c 65 66 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20  Left->pOn = 0;. 
27e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
27f0: 61 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20  ate extra terms 
2800: 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  on the WHERE cla
2810: 75 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  use for each col
2820: 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a  umn named.    **
2830: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
2840: 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20  ause.  Example: 
2850: 49 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  If the two table
2860: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61  s to be joined a
2870: 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64  re .    ** A and
2880: 20 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47   B and the USING
2890: 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c   clause names X,
28a0: 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20   Y, and Z, then 
28b0: 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  add this.    ** 
28c0: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
28d0: 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20  use:    A.X=B.X 
28e0: 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20  AND A.Y=B.Y AND 
28f0: 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52  A.Z=B.Z.    ** R
2900: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69  eport an error i
2910: 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e  f any column men
2920: 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53  tioned in the US
2930: 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20  ING clause is.  
2940: 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e    ** not contain
2950: 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  ed in both table
2960: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a  s to be joined..
2970: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2980: 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  Left->pUsing ){.
2990: 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c        IdList *pL
29a0: 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 55 73  ist = pLeft->pUs
29b0: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
29c0: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
29d0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
29e0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c  char *zName = pL
29f0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
2a00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c  .        if( col
2a10: 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 54 61  umnIndex(pLeftTa
2a20: 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c 20 63  b, zName)<0 || c
2a30: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68  olumnIndex(pRigh
2a40: 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 29  tTab, zName)<0 )
2a50: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2a60: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2a70: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e  se, "cannot join
2a80: 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73   using column %s
2a90: 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20   - column ".    
2aa0: 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65          "not pre
2ab0: 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62  sent in both tab
2ac0: 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  les", zName);.  
2ad0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
2ae0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2af0: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
2b00: 28 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62  (zName, pLeftTab
2b10: 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c  , pLeft->zAlias,
2b20: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52                pR
2b40: 69 67 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d  ightTab, pRight-
2b50: 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20  >zAlias,.       
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69 43 75       pRight->iCu
2b80: 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  rsor, &p->pWhere
2b90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2ba0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
2bc0: 20 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74   code into "v" t
2bd0: 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68  hat will push th
2be0: 65 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20  e record on the 
2bf0: 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74  top of the.** st
2c00: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72  ack into the sor
2c10: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
2c20: 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  oid pushOntoSort
2c30: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
2c40: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
2c50: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
2c60: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
2c70: 72 64 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68  rderBy,    /* Th
2c80: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2c90: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
2ca0: 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 2f 2a  Select        /*
2cb0: 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43   The whole SELEC
2cc0: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29  T statement */.)
2cd0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
2ce0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73  arse->pVdbe;.  s
2cf0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
2d00: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2d10: 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69  OrderBy);.  sqli
2d20: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2d30: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72  OP_Sequence, pOr
2d40: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
2d50: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
2d60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
2d70: 6c 6c 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ll, pOrderBy->nE
2d80: 78 70 72 20 2b 20 31 2c 20 30 29 3b 0a 20 20 73  xpr + 1, 0);.  s
2d90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2da0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
2db0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
2dc0: 72 20 2b 20 32 2c 20 30 29 3b 0a 20 20 73 71 6c  r + 2, 0);.  sql
2dd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2de0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
2df0: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
2e00: 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65  r, 0);.  if( pSe
2e10: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20  lect->iLimit>=0 
2e20: 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31  ){.    int addr1
2e30: 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64  , addr2;.    add
2e40: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
2e50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65  AddOp(v, OP_IfMe
2e60: 6d 5a 65 72 6f 2c 20 70 53 65 6c 65 63 74 2d 3e  mZero, pSelect->
2e70: 69 4c 69 6d 69 74 2b 31 2c 20 30 29 3b 0a 20 20  iLimit+1, 0);.  
2e80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e90: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
2ea0: 2c 20 2d 31 2c 20 70 53 65 6c 65 63 74 2d 3e 69  , -1, pSelect->i
2eb0: 4c 69 6d 69 74 2b 31 29 3b 0a 20 20 20 20 61 64  Limit+1);.    ad
2ec0: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
2ed0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
2ee0: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  o, 0, 0);.    sq
2ef0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2f00: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
2f10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f20: 70 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f  p(v, OP_Last, pO
2f30: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
2f40: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2f50: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2f60: 5f 44 65 6c 65 74 65 2c 20 70 4f 72 64 65 72 42  _Delete, pOrderB
2f70: 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b  y->iECursor, 0);
2f80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2f90: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
2fa0: 32 29 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 2d  2);.    pSelect-
2fb0: 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >iLimit = -1;.  
2fc0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  }.}../*.** Add c
2fd0: 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
2fe0: 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73   the OFFSET.*/.s
2ff0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f  tatic void codeO
3000: 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76  ffset(.  Vdbe *v
3010: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ,          /* Ge
3020: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
3030: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65   this VM */.  Se
3040: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
3050: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
3060: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
3070: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ded */.  int iCo
3080: 6e 74 69 6e 75 65 2c 20 20 20 20 2f 2a 20 4a 75  ntinue,    /* Ju
3090: 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
30a0: 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f  the current reco
30b0: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 70  rd */.  int nPop
30c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
30d0: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 6f 20  ber of times to 
30e0: 70 6f 70 20 73 74 61 63 6b 20 77 68 65 6e 20 6a  pop stack when j
30f0: 75 6d 70 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  umping */.){.  i
3100: 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30  f( p->iOffset>=0
3110: 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30   && iContinue!=0
3120: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
3130: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3140: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
3150: 49 6e 63 72 2c 20 2d 31 2c 20 70 2d 3e 69 4f 66  Incr, -1, p->iOf
3160: 66 73 65 74 29 3b 0a 20 20 20 20 61 64 64 72 20  fset);.    addr 
3170: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
3180: 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 4e 65  Op(v, OP_IfMemNe
3190: 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 30  g, p->iOffset, 0
31a0: 29 3b 0a 20 20 20 20 69 66 28 20 6e 50 6f 70 3e  );.    if( nPop>
31b0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
31c0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
31d0: 50 5f 50 6f 70 2c 20 6e 50 6f 70 2c 20 30 29 3b  P_Pop, nPop, 0);
31e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
31f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3200: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74  P_Goto, 0, iCont
3210: 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43  inue);.    VdbeC
3220: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 6b  omment((v, "# sk
3230: 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64  ip OFFSET record
3240: 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  s"));.    sqlite
3250: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3260: 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   addr);.  }.}../
3270: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68  *.** Add code th
3280: 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f  at will check to
3290: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74   make sure the t
32a0: 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 6f 66  op N elements of
32b0: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 61 72   the.** stack ar
32c0: 65 20 64 69 73 74 69 6e 63 74 2e 20 20 69 54 61  e distinct.  iTa
32d0: 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69  b is a sorting i
32e0: 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20  ndex that holds 
32f0: 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65  previously.** se
3300: 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  en combinations 
3310: 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e  of the N values.
3320: 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
3330: 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a   made in iTab.**
3340: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
3350: 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77  N values are new
3360: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74  ..**.** A jump t
3370: 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73 20  o addrRepeat is 
3380: 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31  made and the N+1
3390: 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70   values are popp
33a0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73  ed from the.** s
33b0: 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20  tack if the top 
33c0: 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e  N elements are n
33d0: 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a  ot distinct..*/.
33e0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
33f0: 44 69 73 74 69 6e 63 74 28 0a 20 20 56 64 62 65  Distinct(.  Vdbe
3400: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *v,           /
3410: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
3420: 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  into this VM */.
3430: 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20    int iTab,     
3440: 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e       /* A sortin
3450: 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  g index used to 
3460: 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63  test for distinc
3470: 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61  tness */.  int a
3480: 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a  ddrRepeat,    /*
3490: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66   Jump to here if
34a0: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f   not distinct */
34b0: 0a 20 20 69 6e 74 20 4e 20 20 20 20 20 20 20 20  .  int N        
34c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 70        /* The top
34d0: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74   N elements of t
34e0: 68 65 20 73 74 61 63 6b 20 6d 75 73 74 20 62 65  he stack must be
34f0: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 29 7b 0a   distinct */.){.
3500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3510: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
3520: 6f 72 64 2c 20 2d 4e 2c 20 30 29 3b 0a 20 20 73  ord, -N, 0);.  s
3530: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3540: 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20  v, OP_Distinct, 
3550: 69 54 61 62 2c 20 73 71 6c 69 74 65 33 56 64 62  iTab, sqlite3Vdb
3560: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
3570: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
3580: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
3590: 2c 20 4e 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c  , N+1, 0);.  sql
35a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
35b0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
35c0: 72 52 65 70 65 61 74 29 3b 0a 20 20 56 64 62 65  rRepeat);.  Vdbe
35d0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73  Comment((v, "# s
35e0: 6b 69 70 20 69 6e 64 69 73 74 69 6e 63 74 20 72  kip indistinct r
35f0: 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 73 71 6c  ecords"));.  sql
3600: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3610: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
3620: 54 61 62 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  Tab, 0);.}.../*.
3630: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3640: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
3650: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
3660: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
3670: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
3680: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63  CT..**.** If src
3690: 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20  Tab and nColumn 
36a0: 61 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74  are both zero, t
36b0: 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65  hen the pEList e
36c0: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72  xpressions.** ar
36d0: 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f  e evaluated in o
36e0: 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
36f0: 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f  data for this ro
3700: 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30  w.  If nColumn>0
3710: 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73  .** then data is
3720: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63   pulled from src
3730: 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69  Tab and pEList i
3740: 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67  s used only to g
3750: 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79  et the.** dataty
3760: 70 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  pes for each col
3770: 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  umn..*/.static i
3780: 6e 74 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  nt selectInnerLo
3790: 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  op(.  Parse *pPa
37a0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
37b0: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
37c0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
37d0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
37e0: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65   /* The complete
37f0: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
3800: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
3810: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
3820: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69  ist,       /* Li
3830: 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69  st of values bei
3840: 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a  ng extracted */.
3850: 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20    int srcTab,   
3860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c            /* Pul
3870: 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73  l data from this
3880: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
3890: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  nColumn,        
38a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
38b0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
38c0: 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a  source table */.
38d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
38e0: 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20  erBy,     /* If 
38f0: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72  not NULL, sort r
3900: 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69  esults using thi
3910: 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64  s key */.  int d
3920: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20  istinct,        
3930: 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61     /* If >=0, ma
3940: 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74 73 20  ke sure results 
3950: 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  are distinct */.
3960: 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
3970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
3980: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
3990: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
39a0: 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20  int iParm,      
39b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 72          /* An ar
39c0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 69  gument to the di
39d0: 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f  sposal method */
39e0: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
39f0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ,          /* Ju
3a00: 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
3a10: 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f  nue with next ro
3a20: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  w */.  int iBrea
3a30: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
3a40: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
3a50: 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
3a60: 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20  inner loop */.  
3a70: 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20  char *aff       
3a80: 20 20 20 20 20 20 20 20 2f 2a 20 61 66 66 69 6e          /* affin
3a90: 69 74 79 20 73 74 72 69 6e 67 20 69 66 20 65 44  ity string if eD
3aa0: 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e  est is SRT_Union
3ab0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
3ac0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
3ad0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
3ae0: 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20   hasDistinct;   
3af0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3b00: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
3b10: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
3b20: 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  */..  if( v==0 )
3b30: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
3b40: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
3b50: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
3b60: 20 77 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61   was a LIMIT cla
3b70: 75 73 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  use on the SELEC
3b80: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
3b90: 6e 20 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20  n do the check. 
3ba0: 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68   ** to see if th
3bb0: 69 73 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65  is row should be
3bc0: 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20   output..  */.  
3bd0: 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64 69  hasDistinct = di
3be0: 73 74 69 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c  stinct>=0 && pEL
3bf0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20 20  ist->nExpr>0;.  
3c00: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
3c10: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
3c20: 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  ){.    codeOffse
3c30: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
3c40: 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e, 0);.  }..  /*
3c50: 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73   Pull the reques
3c60: 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a  ted columns..  *
3c70: 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e  /.  if( nColumn>
3c80: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
3c90: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
3ca0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3cb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3cc0: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
3cd0: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  i);.    }.  }els
3ce0: 65 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d  e{.    nColumn =
3cf0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
3d00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
3d10: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
3d20: 73 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  se, pEList);.  }
3d30: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
3d40: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
3d50: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
3d60: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3d70: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
3d80: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
3d90: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
3da0: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
3db0: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
3dc0: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
3dd0: 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74  */.  if( hasDist
3de0: 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65  inct ){.    asse
3df0: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
3e00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c  .    assert( pEL
3e10: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c  ist->nExpr==nCol
3e20: 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65 44  umn );.    codeD
3e30: 69 73 74 69 6e 63 74 28 76 2c 20 64 69 73 74 69  istinct(v, disti
3e40: 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  nct, iContinue, 
3e50: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69 66  nColumn);.    if
3e60: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
3e70: 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65  .      codeOffse
3e80: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
3e90: 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  e, nColumn);.   
3ea0: 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68   }.  }..  switch
3eb0: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f  ( eDest ){.    /
3ec0: 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20  * In this mode, 
3ed0: 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79  write each query
3ee0: 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b   result to the k
3ef0: 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  ey of the tempor
3f00: 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ary.    ** table
3f10: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23   iParm..    */.#
3f20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3f30: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
3f40: 43 54 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  CT.    case SRT_
3f50: 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73  Union: {.      s
3f60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3f70: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
3f80: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
3f90: 20 20 20 20 20 69 66 28 20 61 66 66 20 29 7b 0a       if( aff ){.
3fa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3fb0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
3fc0: 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49  1, aff, P3_STATI
3fd0: 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
3fe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3ff0: 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  Op(v, OP_IdxInse
4000: 72 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  rt, iParm, 0);. 
4010: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4020: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
4030: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
4040: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
4050: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
4060: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
4070: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
4080: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
4090: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
40a0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
40b0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
40c0: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
40d0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
40e0: 70 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  pt: {.      int 
40f0: 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72  addr;.      addr
4100: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4110: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
4120: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  cord, nColumn, 0
4130: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4140: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
4150: 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54  -1, aff, P3_STAT
4160: 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
4170: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4180: 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72  P_NotFound, iPar
4190: 6d 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20  m, addr+3);.    
41a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
41b0: 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  Op(v, OP_Delete,
41c0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
41d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
41e0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74  endif..    /* St
41f0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  ore the result a
4200: 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75  s data using a u
4210: 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a  nique key..    *
4220: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  /.    case SRT_T
4230: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
4240: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
4250: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4260: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
4270: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
4280: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
4290: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
42a0: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
42b0: 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  r(pParse, pOrder
42c0: 42 79 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 65  By, p);.      }e
42d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
42e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
42f0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
4300: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  arm, 0);.       
4310: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4320: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
4330: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
4340: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4350: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
4360: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m, 0);.      }. 
4370: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4380: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
4390: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
43a0: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
43b0: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
43c0: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
43d0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
43e0: 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
43f0: 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
4400: 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
4410: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
4420: 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
4430: 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
4440: 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
4450: 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
4460: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
4470: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _Set: {.      in
4480: 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65  t addr1 = sqlite
4490: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
44a0: 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  (v);.      int a
44b0: 64 64 72 32 3b 0a 0a 20 20 20 20 20 20 61 73 73  ddr2;..      ass
44c0: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
44d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
44e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
44f0: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64  NotNull, -1, add
4500: 72 31 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  r1+3);.      sql
4510: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4520: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
4530: 20 20 20 20 20 20 61 64 64 72 32 20 3d 20 73 71        addr2 = sq
4540: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4550: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29  , OP_Goto, 0, 0)
4560: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
4570: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
4580: 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e  /* At first glan
4590: 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69  ce you would thi
45a0: 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69  nk we could opti
45b0: 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20  mize out the.   
45c0: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
45d0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69   in this case si
45e0: 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  nce the order of
45f0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
4600: 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  set.        ** d
4610: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20  oes not matter. 
4620: 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74   But there might
4630: 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   be a LIMIT clau
4640: 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20  se, in which.   
4650: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65       ** case the
4660: 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74   order does matt
4670: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  er */.        pu
4680: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
4690: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
46a0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
46b0: 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66          char aff
46c0: 69 6e 69 74 79 20 3d 20 28 69 50 61 72 6d 3e 3e  inity = (iParm>>
46d0: 31 36 29 26 30 78 46 46 3b 0a 20 20 20 20 20 20  16)&0xFF;.      
46e0: 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c    affinity = sql
46f0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
4700: 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  ity(pEList->a[0]
4710: 2e 70 45 78 70 72 2c 20 61 66 66 69 6e 69 74 79  .pExpr, affinity
4720: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4730: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
4740: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30  MakeRecord, 1, 0
4750: 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  , &affinity, 1);
4760: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4770: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4780: 49 64 78 49 6e 73 65 72 74 2c 20 28 69 50 61 72  IdxInsert, (iPar
4790: 6d 26 30 78 30 30 30 30 46 46 46 46 29 2c 20 30  m&0x0000FFFF), 0
47a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
47b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
47c0: 48 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a  Here(v, addr2);.
47d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
47e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   }..    /* If an
47f0: 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74  y row exist in t
4800: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72  he result set, r
4810: 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
4820: 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a  and abort..    *
4830: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
4840: 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73  xists: {.      s
4850: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4860: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c  v, OP_MemInt, 1,
4870: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 73   iParm);.      s
4880: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4890: 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75  v, OP_Pop, nColu
48a0: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a  mn, 0);.      /*
48b0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
48c0: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
48d0: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
48e0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
48f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
4900: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
4910: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
4920: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
4930: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
4940: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
4950: 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
4960: 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
4970: 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
4980: 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
4990: 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
49a0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
49b0: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
49c0: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
49d0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
49e0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
49f0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
4a00: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
4a10: 79 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  y, p);.      }el
4a20: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
4a30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4a40: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61  OP_MemStore, iPa
4a50: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  rm, 1);.        
4a60: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
4a70: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
4a80: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
4a90: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
4aa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4ab0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
4ac0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4ad0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
4ae0: 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61    /* Send the da
4af0: 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ta to the callba
4b00: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74  ck function or t
4b10: 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  o a subroutine. 
4b20: 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   In the.    ** c
4b30: 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ase of a subrout
4b40: 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ine, the subrout
4b50: 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72 65  ine itself is re
4b60: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20  sponsible for.  
4b70: 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65    ** popping the
4b80: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73   data from the s
4b90: 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tack..    */.   
4ba0: 20 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75   case SRT_Subrou
4bb0: 74 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53  tine:.    case S
4bc0: 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20  RT_Callback: {. 
4bd0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
4be0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  y ){.        sql
4bf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4c00: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4c10: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
4c20: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
4c30: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
4c40: 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20 20  erBy, p);.      
4c50: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d  }else if( eDest=
4c60: 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20  =SRT_Subroutine 
4c70: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4c80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4c90: 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72  P_Gosub, 0, iPar
4ca0: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
4cb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4cc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4cd0: 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d  Callback, nColum
4ce0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n, 0);.      }. 
4cf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4d00: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
4d10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
4d20: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
4d30: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
4d40: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
4d50: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
4d60: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
4d70: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
4d80: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
4d90: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
4da0: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
4db0: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
4dc0: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
4dd0: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
4de0: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
4df0: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
4e00: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
4e10: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
4e20: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
4e30: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
4e40: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
4e50: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
4e60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4e70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
4e80: 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  p, nColumn, 0);.
4e90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4ea0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
4eb0: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
4ec0: 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
4ed0: 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
4ee0: 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  reached..  */.  
4ef0: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30  if( p->iLimit>=0
4f00: 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   && pOrderBy==0 
4f10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
4f20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
4f30: 6d 49 6e 63 72 2c 20 2d 31 2c 20 70 2d 3e 69 4c  mIncr, -1, p->iL
4f40: 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
4f50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4f60: 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e  P_IfMemZero, p->
4f70: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
4f80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4f90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
4fa0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
4fb0: 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b  st, generate a K
4fc0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
4fd0: 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a   that records.**
4fe0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
4ff0: 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68  equence for each
5000: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
5010: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  hat expression l
5020: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ist..**.** If th
5030: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e  e ExprList is an
5040: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
5050: 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65  UP BY clause the
5060: 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a  n the resulting.
5070: 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  ** KeyInfo struc
5080: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
5090: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
50a0: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69  zing a virtual i
50b0: 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  ndex to.** imple
50c0: 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65  ment that clause
50d0: 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  .  If the ExprLi
50e0: 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  st is the result
50f0: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
5100: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79  .** then the Key
5110: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
5120: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
5130: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
5140: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65   virtual.** inde
5150: 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  x to implement a
5160: 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a   DISTINCT test..
5170: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
5180: 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
5190: 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
51a0: 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ain from malloc.
51b0: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
51c0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
51d0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65  ponsible for see
51e0: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
51f0: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
5200: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20  ually.** freed. 
5210: 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f   Add the KeyInfo
5220: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68   structure to th
5230: 65 20 50 33 20 66 69 65 6c 64 20 6f 66 20 61 6e  e P3 field of an
5240: 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a   opcode using.**
5250: 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
5260: 4f 46 46 20 69 73 20 74 68 65 20 75 73 75 61 6c  OFF is the usual
5270: 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20   way of dealing 
5280: 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  with this..*/.st
5290: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65  atic KeyInfo *ke
52a0: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
52b0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
52c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
52d0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
52e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
52f0: 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65   int nExpr;.  Ke
5300: 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20  yInfo *pInfo;.  
5310: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
5320: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
5330: 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d  nt i;..  nExpr =
5340: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
5350: 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d   pInfo = sqliteM
5360: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
5370: 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73  Info) + nExpr*(s
5380: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
5390: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66  1) );.  if( pInf
53a0: 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  o ){.    pInfo->
53b0: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
53c0: 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  *)&pInfo->aColl[
53d0: 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e 66  nExpr];.    pInf
53e0: 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78 70  o->nField = nExp
53f0: 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e  r;.    pInfo->en
5400: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
5410: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
5420: 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70  pList->a; i<nExp
5430: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
5440: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
5450: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
5460: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
5470: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
5480: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
5490: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
54a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
54b0: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
54c0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
54d0: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d   pInfo->aColl[i]
54e0: 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
54f0: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
5500: 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  r[i] = pItem->so
5510: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
5520: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
5530: 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  o;.}.../*.** If 
5540: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
5550: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
5560: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
5570: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
5580: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
5590: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
55a0: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
55b0: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
55c0: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
55d0: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
55e0: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
55f0: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
5600: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
5610: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
5620: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
5630: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
5640: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5650: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
5660: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5670: 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  e,   /* Parsing 
5680: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
5690: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 2f 2a  ect *p,       /*
56a0: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
56b0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20  ement */.  Vdbe 
56c0: 2a 76 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 47  *v,         /* G
56d0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
56e0: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
56f0: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
5700: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
5710: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
5720: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
5730: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
5740: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
5750: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69   here */.  int i
5760: 50 61 72 6d 20 20 20 20 20 20 20 20 2f 2a 20 4f  Parm        /* O
5770: 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65  ptional paramete
5780: 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  r associated wit
5790: 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20  h eDest */.){.  
57a0: 69 6e 74 20 62 72 6b 20 3d 20 73 71 6c 69 74 65  int brk = sqlite
57b0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
57c0: 29 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 20 3d 20  );.  int cont = 
57d0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
57e0: 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61  abel(v);.  int a
57f0: 64 64 72 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  ddr;.  int iTab;
5800: 0a 20 20 69 6e 74 20 70 73 65 75 64 6f 54 61 62  .  int pseudoTab
5810: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
5820: 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
5830: 65 72 42 79 3b 0a 0a 20 20 69 54 61 62 20 3d 20  erBy;..  iTab = 
5840: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
5850: 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  or;.  if( eDest=
5860: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c  =SRT_Callback ||
5870: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75 62 72   eDest==SRT_Subr
5880: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73  outine ){.    ps
5890: 65 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65  eudoTab = pParse
58a0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71  ->nTab++;.    sq
58b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
58c0: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
58d0: 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a   pseudoTab, 0);.
58e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
58f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
5900: 6d 43 6f 6c 75 6d 6e 73 2c 20 70 73 65 75 64 6f  mColumns, pseudo
5910: 54 61 62 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Tab, nColumn);. 
5920: 20 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20   }.  addr = 1 + 
5930: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5940: 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61  (v, OP_Sort, iTa
5950: 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f 64 65 4f  b, brk);.  codeO
5960: 66 66 73 65 74 28 76 2c 20 70 2c 20 63 6f 6e 74  ffset(v, p, cont
5970: 2c 20 30 29 3b 0a 20 20 69 66 28 20 65 44 65 73  , 0);.  if( eDes
5980: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
5990: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75  || eDest==SRT_Su
59a0: 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  broutine ){.    
59b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
59c0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
59d0: 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  1, 0);.  }.  sql
59e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
59f0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
5a00: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
5a10: 72 20 2b 20 31 29 3b 0a 20 20 73 77 69 74 63 68  r + 1);.  switch
5a20: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
5a30: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
5a40: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
5a50: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71  mTab: {.      sq
5a60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5a70: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
5a80: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
5a90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5aa0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
5ab0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
5ac0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5ad0: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
5ae0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
5af0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
5b00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
5b10: 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54  ERY.    case SRT
5b20: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
5b30: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
5b40: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
5b50: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5b60: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71  _NotNull, -1, sq
5b70: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
5b80: 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20  Addr(v)+3);.    
5b90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5ba0: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
5bb0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
5bc0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5bd0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74  P_Goto, 0, sqlit
5be0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
5bf0: 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20 73  r(v)+3);.      s
5c00: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
5c10: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
5c20: 31 2c 20 30 2c 20 22 63 22 2c 20 50 33 5f 53 54  1, 0, "c", P3_ST
5c30: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
5c40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5c50: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 28   OP_IdxInsert, (
5c60: 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46 46  iParm&0x0000FFFF
5c70: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  ), 0);.      bre
5c80: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
5c90: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
5ca0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
5cb0: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
5cc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5cd0: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
5ce0: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
5cf0: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
5d00: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
5d10: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
5d20: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
5d30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5d40: 66 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  f.    case SRT_C
5d50: 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61 73  allback:.    cas
5d60: 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65  e SRT_Subroutine
5d70: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  : {.      int i;
5d80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5d90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
5da0: 73 65 72 74 2c 20 70 73 65 75 64 6f 54 61 62 2c  sert, pseudoTab,
5db0: 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   0);.      for(i
5dc0: 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  =0; i<nColumn; i
5dd0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
5de0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5df0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75   OP_Column, pseu
5e00: 64 6f 54 61 62 2c 20 69 29 3b 0a 20 20 20 20 20  doTab, i);.     
5e10: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44 65   }.      if( eDe
5e20: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
5e30: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5e40: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5e50: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f  OP_Callback, nCo
5e60: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
5e70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5e80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5e90: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
5ea0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  iParm);.      }.
5eb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5ec0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
5ed0: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
5ee0: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
5ef0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
5f00: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
5f10: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
5f20: 70 20 77 68 65 6e 20 74 68 65 20 4c 49 4d 49 54  p when the LIMIT
5f30: 20 69 73 20 72 65 61 63 68 65 64 0a 20 20 2a 2f   is reached.  */
5f40: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
5f50: 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
5f60: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5f70: 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70  P_MemIncr, -1, p
5f80: 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73  ->iLimit);.    s
5f90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5fa0: 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c  v, OP_IfMemZero,
5fb0: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 62 72 6b 29   p->iLimit, brk)
5fc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
5fd0: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
5fe0: 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
5ff0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
6000: 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71  l(v, cont);.  sq
6010: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6020: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
6030: 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65   addr);.  sqlite
6040: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
6050: 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28  l(v, brk);.  if(
6060: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
6070: 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53  back || eDest==S
6080: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b  RT_Subroutine ){
6090: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
60a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
60b0: 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29  e, pseudoTab, 0)
60c0: 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ;.  }..}../*.** 
60d0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
60e0: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
60f0: 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63  taining the 'dec
6100: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f  laration type' o
6110: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
6120: 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73  ion pExpr. The s
6130: 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65  tring may be tre
6140: 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62  ated as static b
6150: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
6160: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
6170: 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20  ion type is the 
6180: 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64  exact datatype d
6190: 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63  efinition extrac
61a0: 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ted from the.** 
61b0: 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20  original CREATE 
61c0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
61d0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
61e0: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54  n is a column. T
61f0: 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f  he.** declaratio
6200: 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57  n type for a ROW
6210: 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45  ID field is INTE
6220: 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65  GER. Exactly whe
6230: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  n an expression.
6240: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
6250: 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65   a column can be
6260: 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20   complex in the 
6270: 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71  presence of subq
6280: 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72  ueries. The.** r
6290: 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73  esult-set expres
62a0: 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74  sion in all of t
62b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c  he following SEL
62c0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
62d0: 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  s .** considered
62e0: 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69   a column by thi
62f0: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
6300: 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46  *   SELECT col F
6310: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
6320: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
6330: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
6340: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
6350: 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  ol FROM tbl);.**
6360: 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52     SELECT abc FR
6370: 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41  OM (SELECT col A
6380: 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b  S abc FROM tbl);
6390: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c  .** .** The decl
63a0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
63b0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
63c0: 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c  other than a col
63d0: 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  umn is NULL..*/.
63e0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
63f0: 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20  r *columnType(. 
6400: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
6410: 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  C, .  Expr *pExp
6420: 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  r,.  const char 
6430: 2a 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20  **pzOriginDb,.  
6440: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
6450: 72 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73  riginTab,.  cons
6460: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69  t char **pzOrigi
6470: 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63  nCol.){.  char c
6480: 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b  onst *zType = 0;
6490: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
64a0: 4f 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20  OriginDb = 0;.  
64b0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
64c0: 67 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68  ginTab = 0;.  ch
64d0: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69  ar const *zOrigi
64e0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nCol = 0;.  int 
64f0: 6a 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  j;.  if( pExpr==
6500: 30 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  0 || pNC->pSrcLi
6510: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
6520: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 54 4b 5f 41  ;..  /* The TK_A
6530: 53 20 6f 70 65 72 61 74 6f 72 20 63 61 6e 20 6f  S operator can o
6540: 6e 6c 79 20 6f 63 63 75 72 20 69 6e 20 4f 52 44  nly occur in ORD
6550: 45 52 20 42 59 2c 20 47 52 4f 55 50 20 42 59 2c  ER BY, GROUP BY,
6560: 20 48 41 56 49 4e 47 2c 0a 20 20 2a 2a 20 61 6e   HAVING,.  ** an
6570: 64 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 73 2e  d LIMIT clauses.
6580: 20 20 42 75 74 20 70 45 78 70 72 20 6f 72 69 67    But pExpr orig
6590: 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20 72 65  inates in the re
65a0: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 0a 20 20  sult set of a.  
65b0: 2a 2a 20 53 45 4c 45 43 54 2e 20 20 53 6f 20 70  ** SELECT.  So p
65c0: 45 78 70 72 20 63 61 6e 20 6e 65 76 65 72 20 63  Expr can never c
65d0: 6f 6e 74 61 69 6e 20 61 6e 20 41 53 20 6f 70 65  ontain an AS ope
65e0: 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 61 73  rator..  */.  as
65f0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
6600: 3d 54 4b 5f 41 53 20 29 3b 0a 0a 20 20 73 77 69  =TK_AS );..  swi
6610: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
6620: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
6630: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
6640: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
6650: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
6660: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
6670: 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20  umn. Locate the 
6680: 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e  table the column
6690: 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   is being.      
66a0: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
66b0: 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74  m in NameContext
66c0: 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20  .pSrcList. This 
66d0: 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61  table may be rea
66e0: 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  l.      ** datab
66f0: 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73  ase table or a s
6700: 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a  ubquery..      *
6710: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
6720: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
6730: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72      /* Table str
6740: 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73  ucture column is
6750: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
6760: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
6770: 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *pS = 0;        
6780: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74       /* Select t
6790: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  he column is ext
67a0: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
67b0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
67c0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20  pExpr->iColumn; 
67d0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
67e0: 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20  umn in pTab */. 
67f0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20       while( pNC 
6800: 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
6810: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61      SrcList *pTa
6820: 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  bList = pNC->pSr
6830: 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66  cList;.        f
6840: 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73  or(j=0;j<pTabLis
6850: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
6860: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
6870: 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r!=pExpr->iTable
6880: 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69  ;j++);.        i
6890: 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  f( j<pTabList->n
68a0: 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Src ){.         
68b0: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
68c0: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
68d0: 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62         pS = pTab
68e0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65  List->a[j].pSele
68f0: 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ct;.        }els
6900: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43  e{.          pNC
6910: 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20   = pNC->pNext;. 
6920: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6930: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ..      if( pTab
6940: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
6950: 2a 20 46 49 58 20 4d 45 3a 0a 20 20 20 20 20 20  * FIX ME:.      
6960: 20 20 2a 2a 20 54 68 69 73 20 63 61 6e 20 6f 63    ** This can oc
6970: 63 75 72 73 20 69 66 20 79 6f 75 20 68 61 76 65  curs if you have
6980: 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20   something like 
6990: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 3b 22 20  "SELECT new.x;" 
69a0: 69 6e 73 69 64 65 0a 20 20 20 20 20 20 20 20 2a  inside.        *
69b0: 2a 20 61 20 74 72 69 67 67 65 72 2e 20 20 49 6e  * a trigger.  In
69c0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
69d0: 20 79 6f 75 20 72 65 66 65 72 65 6e 63 65 20 74   you reference t
69e0: 68 65 20 73 70 65 63 69 61 6c 20 22 6e 65 77 22  he special "new"
69f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
6a00: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
6a10: 73 65 74 20 6f 66 20 61 20 73 65 6c 65 63 74 2e  set of a select.
6a20: 20 20 57 65 20 64 6f 20 6e 6f 74 20 68 61 76 65    We do not have
6a30: 20 61 20 67 6f 6f 64 20 77 61 79 0a 20 20 20 20   a good way.    
6a40: 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e 64 20 74      ** to find t
6a50: 68 65 20 61 63 74 75 61 6c 20 74 61 62 6c 65 20  he actual table 
6a60: 74 79 70 65 2c 20 73 6f 20 63 61 6c 6c 20 69 74  type, so call it
6a70: 20 22 54 45 58 54 22 2e 20 20 54 68 69 73 20 69   "TEXT".  This i
6a80: 73 20 72 65 61 6c 6c 79 0a 20 20 20 20 20 20 20  s really.       
6a90: 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 66   ** something of
6aa0: 20 61 20 62 75 67 2c 20 62 75 74 20 49 20 64 6f   a bug, but I do
6ab0: 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 74 6f   not know how to
6ac0: 20 66 69 78 20 69 74 2e 0a 20 20 20 20 20 20 20   fix it..       
6ad0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
6ae0: 68 69 73 20 63 6f 64 65 20 64 6f 65 73 20 6e 6f  his code does no
6af0: 74 20 70 72 6f 64 75 63 65 20 74 68 65 20 63 6f  t produce the co
6b00: 72 72 65 63 74 20 61 6e 73 77 65 72 20 2d 20 69  rrect answer - i
6b10: 74 20 6a 75 73 74 20 70 72 65 76 65 6e 74 73 0a  t just prevents.
6b20: 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73 65 67          ** a seg
6b30: 66 61 75 6c 74 2e 20 20 53 65 65 20 74 69 63 6b  fault.  See tick
6b40: 65 74 20 23 31 32 32 39 2e 0a 20 20 20 20 20 20  et #1229..      
6b50: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 54 79    */.        zTy
6b60: 70 65 20 3d 20 22 54 45 58 54 22 3b 0a 20 20 20  pe = "TEXT";.   
6b70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6b80: 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
6b90: 74 28 20 70 54 61 62 20 29 3b 0a 23 69 66 6e 64  t( pTab );.#ifnd
6ba0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
6bb0: 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 69 66  UBQUERY.      if
6bc0: 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pS ){.        
6bd0: 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69  /* The "table" i
6be0: 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62  s actually a sub
6bf0: 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65  -select or a vie
6c00: 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  w in the FROM cl
6c10: 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ause.        ** 
6c20: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
6c30: 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  atement. Return 
6c40: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
6c50: 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a  type and origin.
6c60: 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
6c70: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73  for the result-s
6c80: 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  et column of the
6c90: 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20   sub-select..   
6ca0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
6cb0: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  if( iCol>=0 && i
6cc0: 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  Col<pS->pEList->
6cd0: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
6ce0: 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73     /* If iCol is
6cf0: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
6d00: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
6d10: 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68  sion requests th
6d20: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  e.          ** r
6d30: 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d  owid of the sub-
6d40: 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
6d50: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
6d60: 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20  is legal (see . 
6d70: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74           ** test
6d80: 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29   case misc2.2.2)
6d90: 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61   - it always eva
6da0: 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a  luates to NULL..
6db0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
6dc0: 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65         NameConte
6dd0: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20  xt sNC;.        
6de0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
6df0: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
6e00: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
6e10: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
6e20: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
6e30: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
6e40: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  0;.          sNC
6e50: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
6e60: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
6e70: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
6e80: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
6e90: 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69  riginDb, &zOrigi
6ea0: 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f  nTab, &zOriginCo
6eb0: 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  l); .        }. 
6ec0: 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
6ed0: 66 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  f.      if( pTab
6ee0: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
6ef0: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
6f00: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
6f10: 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20  assert( !pS );. 
6f20: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
6f30: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
6f40: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
6f50: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
6f60: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
6f70: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
6f80: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
6f90: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
6fa0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
6fb0: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20  EGER";.         
6fc0: 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72   zOriginCol = "r
6fd0: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d  owid";.        }
6fe0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6ff0: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
7000: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
7010: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
7020: 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  nCol = pTab->aCo
7030: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
7040: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7050: 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 70 54   zOriginTab = pT
7060: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
7070: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
7080: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
7090: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
70a0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
70b0: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  NC->pParse->db, 
70c0: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
70d0: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
70e0: 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  nDb = pNC->pPars
70f0: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
7100: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
7110: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7120: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
7130: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7140: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
7150: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
7160: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
7170: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
7180: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
7190: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
71a0: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
71b0: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
71c0: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
71d0: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
71e0: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
71f0: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
7200: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
7210: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
7220: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
7230: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
7240: 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
7250: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
7260: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
7270: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63  ;.      sNC.pSrc
7280: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
7290: 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  .      sNC.pNext
72a0: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e   = pNC;.      sN
72b0: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
72c0: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54  pParse;.      zT
72d0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
72e0: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
72f0: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
7300: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
7310: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
7320: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
7330: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69    .  if( pzOrigi
7340: 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nDb ){.    asser
7350: 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26  t( pzOriginTab &
7360: 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b  & pzOriginCol );
7370: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62  .    *pzOriginDb
7380: 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20   = zOriginDb;.  
7390: 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d    *pzOriginTab =
73a0: 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20   zOriginTab;.   
73b0: 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20   *pzOriginCol = 
73c0: 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a  zOriginCol;.  }.
73d0: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
73e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
73f0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
7400: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
7410: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
7420: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
7430: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
7440: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
7450: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
7460: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
7470: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
7480: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
7490: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
74a0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
74b0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
74c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
74d0: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
74e0: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
74f0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
7500: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
7510: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
7520: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
7530: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
7540: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
7550: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
7560: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f  e = pParse;.  fo
7570: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
7580: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
7590: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
75a0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
75b0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
75c0: 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20  zOrigDb = 0;.   
75d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
75e0: 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63  igTab = 0;.    c
75f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
7600: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  Col = 0;.    con
7610: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  st char *zType =
7620: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
7630: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
7640: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
7650: 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  Col);..    /* Th
7660: 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65  e vdbe must make
7670: 20 69 74 27 73 20 6f 77 6e 20 63 6f 70 79 20 6f   it's own copy o
7680: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
7690: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
76a0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
76b0: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
76c0: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
76d0: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
76e0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
76f0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
7700: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
7710: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
7720: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
7730: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
7740: 20 7a 54 79 70 65 2c 20 50 33 5f 54 52 41 4e 53   zType, P3_TRANS
7750: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
7760: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
7770: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
7780: 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62  ATABASE, zOrigDb
7790: 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b  , P3_TRANSIENT);
77a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
77b0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
77c0: 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20   COLNAME_TABLE, 
77d0: 7a 4f 72 69 67 54 61 62 2c 20 50 33 5f 54 52 41  zOrigTab, P3_TRA
77e0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
77f0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
7800: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
7810: 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f  _COLUMN, zOrigCo
7820: 6c 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e 54 29  l, P3_TRANSIENT)
7830: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
7840: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
7850: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
7860: 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f  VDBE the names o
7870: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
7880: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
7890: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
78a0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  n is used to pro
78b0: 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f  vide the.** azCo
78c0: 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68  l[] values in th
78d0: 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  e callback..*/.s
78e0: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
78f0: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
7900: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
7910: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
7920: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
7930: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
7940: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
7950: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
7960: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
7970: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
7980: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
7990: 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  et */.){.  Vdbe 
79a0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
79b0: 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  be;.  int i, j;.
79c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
79d0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
79e0: 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f  t fullNames, sho
79f0: 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65  rtNames;..#ifnde
7a00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
7a10: 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68  PLAIN.  /* If th
7a20: 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  is is an EXPLAIN
7a30: 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70  , skip this step
7a40: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
7a50: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
7a60: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
7a70: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 76  dif..  assert( v
7a80: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
7a90: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
7aa0: 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69   || v==0 || sqli
7ab0: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
7ac0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50  ) ) return;.  pP
7ad0: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
7ae0: 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d  t = 1;.  fullNam
7af0: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
7b00: 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
7b10: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f  Names)!=0;.  sho
7b20: 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  rtNames = (db->f
7b30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
7b40: 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ortColNames)!=0;
7b50: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
7b60: 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69  tNumCols(v, pELi
7b70: 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f  st->nExpr);.  fo
7b80: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
7b90: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
7ba0: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70    Expr *p;.    p
7bb0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
7bc0: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
7bd0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
7be0: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
7bf0: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20  a[i].zName ){.  
7c00: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
7c10: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
7c20: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Name;.      sqli
7c30: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
7c40: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
7c50: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  NAME, zName, str
7c60: 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  len(zName));.   
7c70: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
7c80: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70   }.    if( p->op
7c90: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
7ca0: 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  TabList ){.     
7cb0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
7cc0: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
7cd0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
7ce0: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
7cf0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
7d00: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20  abList->nSrc && 
7d10: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
7d20: 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c  Cursor!=p->iTabl
7d30: 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  e; j++){}.      
7d40: 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69  assert( j<pTabLi
7d50: 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  st->nSrc );.    
7d60: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
7d70: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
7d80: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
7d90: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
7da0: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
7db0: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
7dc0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
7dd0: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
7de0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
7df0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
7e00: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
7e10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7e20: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
7e30: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
7e40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7e50: 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20   !shortNames && 
7e60: 21 66 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d  !fullNames && p-
7e70: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
7e80: 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  an.z[0] ){.     
7e90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
7ea0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
7eb0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68  OLNAME_NAME, (ch
7ec0: 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70  ar*)p->span.z, p
7ed0: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20  ->span.n);.     
7ee0: 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e   }else if( fullN
7ef0: 61 6d 65 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e  ames || (!shortN
7f00: 61 6d 65 73 20 26 26 20 70 54 61 62 4c 69 73 74  ames && pTabList
7f10: 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20  ->nSrc>1) ){.   
7f20: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
7f30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
7f40: 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20  ar *zTab;. .    
7f50: 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c      zTab = pTabL
7f60: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73  ist->a[j].zAlias
7f70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 75  ;.        if( fu
7f80: 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d  llNames || zTab=
7f90: 3d 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62  =0 ) zTab = pTab
7fa0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
7fb0: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
7fc0: 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20  g(&zName, zTab, 
7fd0: 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72  ".", zCol, (char
7fe0: 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  *)0);.        sq
7ff0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8000: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8010: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 50  E_NAME, zName, P
8020: 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  3_DYNAMIC);.    
8030: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8040: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8050: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8060: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c  NAME_NAME, zCol,
8070: 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a   strlen(zCol));.
8080: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
8090: 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20  e if( p->span.z 
80a0: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
80b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
80c0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
80d0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
80e0: 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61  E, (char*)p->spa
80f0: 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b  n.z, p->span.n);
8100: 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  .      /* sqlite
8110: 33 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61  3VdbeCompressSpa
8120: 63 65 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a  ce(v, addr); */.
8130: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8140: 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b   char zName[30];
8150: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8160: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
8170: 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29  || pTabList==0 )
8180: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
8190: 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64  zName, "column%d
81a0: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73  ", i+1);.      s
81b0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
81c0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
81d0: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
81e0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
81f0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
8200: 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  pes(pParse, pTab
8210: 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  List, pEList);.}
8220: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8230: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
8240: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  ELECT./*.** Name
8250: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
8260: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
8270: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
8280: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
8290: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
82a0: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
82b0: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
82c0: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
82d0: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
82e0: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
82f0: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
8300: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
8310: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
8320: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
8330: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
8340: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
8350: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
8360: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
8370: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
8380: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
8390: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
83a0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
83b0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
83c0: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
83d0: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
83e0: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
83f0: 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53   int prepSelectS
8400: 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65  tmt(Parse*, Sele
8410: 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ct*);../*.** Giv
8420: 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
8430: 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
8440: 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
8450: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
8460: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
8470: 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
8480: 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
8490: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
84a0: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
84b0: 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e  rse, char *zTabN
84c0: 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ame, Select *pSe
84d0: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
84e0: 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  pTab;.  int i, j
84f0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
8500: 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  List;.  Column *
8510: 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20 20  aCol, *pCol;..  
8520: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e  while( pSelect->
8530: 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74  pPrior ) pSelect
8540: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69   = pSelect->pPri
8550: 6f 72 3b 0a 20 20 69 66 28 20 70 72 65 70 53 65  or;.  if( prepSe
8560: 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c  lectStmt(pParse,
8570: 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20   pSelect) ){.   
8580: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
8590: 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
85a0: 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
85b0: 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 20 29 7b  , pSelect, 0) ){
85c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
85d0: 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69   }.  pTab = sqli
85e0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
85f0: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
8600: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
8610: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
8620: 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
8630: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
8640: 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74  zTabName ? sqlit
8650: 65 53 74 72 44 75 70 28 7a 54 61 62 4e 61 6d 65  eStrDup(zTabName
8660: 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20  ) : 0;.  pEList 
8670: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
8680: 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  t;.  pTab->nCol 
8690: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
86a0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
86b0: 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61  >nCol>0 );.  pTa
86c0: 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d  b->aCol = aCol =
86d0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
86e0: 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c  izeof(pTab->aCol
86f0: 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20  [0])*pTab->nCol 
8700: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  );.  for(i=0, pC
8710: 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d  ol=aCol; i<pTab-
8720: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
8730: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
8740: 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68 61 72 20  , *pR;.    char 
8750: 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63 68 61 72  *zType;.    char
8760: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61   *zName;.    cha
8770: 72 20 2a 7a 42 61 73 65 6e 61 6d 65 3b 0a 20 20  r *zBasename;.  
8780: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
8790: 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20  ;.    int cnt;. 
87a0: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
87b0: 4e 43 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20  NC;.    .    /* 
87c0: 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61  Get an appropria
87d0: 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  te name for the 
87e0: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20  column.    */.  
87f0: 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b    p = pEList->a[
8800: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  i].pExpr;.    as
8810: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d  sert( p->pRight=
8820: 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d  =0 || p->pRight-
8830: 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70  >token.z==0 || p
8840: 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e  ->pRight->token.
8850: 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69  z[0]!=0 );.    i
8860: 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  f( (zName = pELi
8870: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21  st->a[i].zName)!
8880: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
8890: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e  f the column con
88a0: 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61  tains an "AS <na
88b0: 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65  me>" phrase, use
88c0: 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e   <name> as the n
88d0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
88e0: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
88f0: 70 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  p(zName);.    }e
8900: 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  lse if( p->op==T
8910: 4b 5f 44 4f 54 20 0a 20 20 20 20 20 20 20 20 20  K_DOT .         
8920: 20 20 20 20 20 26 26 20 28 70 52 3d 70 2d 3e 70       && (pR=p->p
8930: 52 69 67 68 74 29 21 3d 30 20 26 26 20 70 52 2d  Right)!=0 && pR-
8940: 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e  >token.z && pR->
8950: 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  token.z[0] ){.  
8960: 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d      /* For colum
8970: 6e 73 20 6f 66 20 74 68 65 20 66 72 6f 6d 20 41  ns of the from A
8980: 2e 42 20 75 73 65 20 42 20 61 73 20 74 68 65 20  .B use B as the 
8990: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e  name */.      zN
89a0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
89b0: 69 6e 74 66 28 22 25 54 22 2c 20 26 70 52 2d 3e  intf("%T", &pR->
89c0: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  token);.    }els
89d0: 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20  e if( p->span.z 
89e0: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
89f0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 73 65 20  ){.      /* Use 
8a00: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
8a10: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
8a20: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74  expression as it
8a30: 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  s name */.      
8a40: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
8a50: 50 72 69 6e 74 66 28 22 25 54 22 2c 20 26 70 2d  Printf("%T", &p-
8a60: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  >span);.    }els
8a70: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61  e{.      /* If a
8a80: 6c 6c 20 65 6c 73 65 20 66 61 69 6c 73 2c 20 6d  ll else fails, m
8a90: 61 6b 65 20 75 70 20 61 20 6e 61 6d 65 20 2a 2f  ake up a name */
8aa0: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
8ab0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 63  qlite3MPrintf("c
8ac0: 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a  olumn%d", i+1);.
8ad0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
8ae0: 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
8af0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
8b00: 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
8b10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
8b20: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ee(zName);.     
8b30: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
8b40: 62 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a 20 20  ble(0, pTab);.  
8b50: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8b60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
8b70: 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e   sure the column
8b80: 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e   name is unique.
8b90: 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73    If the name is
8ba0: 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20   not unique,.   
8bb0: 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74   ** append a int
8bc0: 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65  eger to the name
8bd0: 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f   so that it beco
8be0: 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20  mes unique..    
8bf0: 2a 2f 0a 20 20 20 20 7a 42 61 73 65 6e 61 6d 65  */.    zBasename
8c00: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 66 6f   = zName;.    fo
8c10: 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20  r(j=cnt=0; j<i; 
8c20: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
8c30: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61  sqlite3StrICmp(a
8c40: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  Col[j].zName, zN
8c50: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
8c60: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
8c70: 65 33 4d 50 72 69 6e 74 66 28 22 25 73 3a 25 64  e3MPrintf("%s:%d
8c80: 22 2c 20 7a 42 61 73 65 6e 61 6d 65 2c 20 2b 2b  ", zBasename, ++
8c90: 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 20  cnt);.        j 
8ca0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66  = -1;.        if
8cb0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ( zName==0 ) bre
8cc0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
8cd0: 7d 0a 20 20 20 20 69 66 28 20 7a 42 61 73 65 6e  }.    if( zBasen
8ce0: 61 6d 65 21 3d 7a 4e 61 6d 65 20 29 7b 0a 20 20  ame!=zName ){.  
8cf0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
8d00: 42 61 73 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Basename);.    }
8d10: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  .    pCol->zName
8d20: 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f   = zName;..    /
8d30: 2a 20 47 65 74 20 74 68 65 20 74 79 70 65 6e 61  * Get the typena
8d40: 6d 65 2c 20 74 79 70 65 20 61 66 66 69 6e 69 74  me, type affinit
8d50: 79 2c 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  y, and collating
8d60: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
8d70: 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e  e.    ** column.
8d80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
8d90: 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
8da0: 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
8db0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65  C.pSrcList = pSe
8dc0: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20  lect->pSrc;.    
8dd0: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 53 74  zType = sqliteSt
8de0: 72 44 75 70 28 63 6f 6c 75 6d 6e 54 79 70 65 28  rDup(columnType(
8df0: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
8e00: 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54  ));.    pCol->zT
8e10: 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20  ype = zType;.   
8e20: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
8e30: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
8e40: 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 70 43  inity(p);.    pC
8e50: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
8e60: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
8e70: 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   p);.    if( pCo
8e80: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  ll ){.      pCol
8e90: 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ->zColl = sqlite
8ea0: 53 74 72 44 75 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  StrDup(pColl->zN
8eb0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
8ec0: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
8ed0: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61  -1;.  return pTa
8ee0: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  b;.}../*.** Prep
8ef0: 61 72 65 20 61 20 53 45 4c 45 43 54 20 73 74 61  are a SELECT sta
8f00: 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65  tement for proce
8f10: 73 73 69 6e 67 20 62 79 20 64 6f 69 6e 67 20 74  ssing by doing t
8f20: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
8f30: 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  things:.**.**   
8f40: 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20   (1)  Make sure 
8f50: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
8f60: 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
8f70: 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a  signed to every.
8f80: 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65  **         eleme
8f90: 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  nt of the FROM c
8fa0: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lause..**.**    
8fb0: 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  (2)  Fill in the
8fc0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
8fd0: 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68  Tab fields in th
8fe0: 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a  e SrcList that .
8ff0: 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e  **         defin
9000: 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  es FROM clause. 
9010: 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65   When views appe
9020: 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
9030: 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20  lause,.**       
9040: 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d    fill pTabList-
9050: 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74  >a[].pSelect wit
9060: 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
9070: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
9080: 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74  .**         that
9090: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
90a0: 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73  view.  A copy is
90b0: 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65   made of the vie
90c0: 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20  w's SELECT.**   
90d0: 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20        statement 
90e0: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66  so that we can f
90f0: 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20  reely modify or 
9100: 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74  delete that stat
9110: 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
9120: 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e   without worryin
9130: 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20  g about messing 
9140: 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65 6e  up the presisten
9150: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
9160: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74  .**         of t
9170: 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20  he view..**.**  
9180: 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73    (3)  Add terms
9190: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
91a0: 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61  ause to accomoda
91b0: 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
91c0: 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
91d0: 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
91e0: 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
91f0: 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
9200: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53  .**.**    (4)  S
9210: 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
9220: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
9230: 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
9240: 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
9250: 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
9260: 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
9270: 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
9280: 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
9290: 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
92a0: 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
92b0: 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
92c0: 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
92d0: 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
92e0: 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
92f0: 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
9300: 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
9310: 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75  * Return 0 on su
9320: 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 72 65  ccess.  If there
9330: 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c   are problems, l
9340: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
9350: 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72  ssage.** in pPar
9360: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  se and return no
9370: 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n-zero..*/.stati
9380: 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74  c int prepSelect
9390: 53 74 6d 74 28 50 61 72 73 65 20 2a 70 50 61 72  Stmt(Parse *pPar
93a0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
93b0: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72    int i, j, k, r
93c0: 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  c;.  SrcList *pT
93d0: 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
93e0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74  st *pEList;.  st
93f0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
9400: 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 69 66 28  m *pFrom;..  if(
9410: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63   p==0 || p->pSrc
9420: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61  ==0 || sqlite3Ma
9430: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a  llocFailed() ){.
9440: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9450: 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  }.  pTabList = p
9460: 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
9470: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20   = p->pEList;.. 
9480: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75   /* Make sure cu
9490: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
94a0: 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
94b0: 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  to all entries i
94c0: 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  n.  ** the FROM 
94d0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
94e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
94f0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72    */.  sqlite3Sr
9500: 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
9510: 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53  rs(pParse, p->pS
9520: 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  rc);..  /* Look 
9530: 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e  up every table n
9540: 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
9550: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
9560: 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20  elect.  If.  ** 
9570: 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
9580: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61  FROM clause is a
9590: 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61   subquery instea
95a0: 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  d of a table or 
95b0: 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  view,.  ** then 
95c0: 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65  create a transie
95d0: 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
95e0: 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  re to describe t
95f0: 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a  he subquery..  *
9600: 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  /.  for(i=0, pFr
9610: 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
9620: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
9630: 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
9640: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
9650: 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
9660: 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20  >pTab!=0 ){.    
9670: 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d    /* This statem
9680: 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  ent has already 
9690: 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20  been prepared.  
96a0: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
96b0: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20  .      ** to go 
96c0: 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  further. */.    
96d0: 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29    assert( i==0 )
96e0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
96f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9700: 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pFrom->zName==0 
9710: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
9720: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
9730: 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
9740: 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
9750: 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
9760: 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ECT */.      ass
9770: 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ert( pFrom->pSel
9780: 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect!=0 );.      
9790: 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  if( pFrom->zAlia
97a0: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
97b0: 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a  pFrom->zAlias =.
97c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
97d0: 33 4d 50 72 69 6e 74 66 28 22 73 71 6c 69 74 65  3MPrintf("sqlite
97e0: 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20  _subquery_%p_", 
97f0: 28 76 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53  (void*)pFrom->pS
9800: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a  elect);.      }.
9810: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
9820: 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
9830: 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
9840: 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20  b = pTab = .    
9850: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 75 6c      sqlite3Resul
9860: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
9870: 72 73 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  rse, pFrom->zAli
9880: 61 73 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  as, pFrom->pSele
9890: 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ct);.      if( p
98a0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
98b0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
98c0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65    }.      /* The
98d0: 20 69 73 45 70 68 65 6d 20 66 6c 61 67 20 69 6e   isEphem flag in
98e0: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
98f0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
9900: 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
9910: 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61  ** dynamically a
9920: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79  llocated and may
9930: 20 62 65 20 66 72 65 65 64 20 61 74 20 61 6e 79   be freed at any
9940: 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72   time.  In other
9950: 20 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a   words,.      **
9960: 20 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69   pTab is not poi
9970: 6e 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69  nting to a persi
9980: 73 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  stent table stru
9990: 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e  cture that defin
99a0: 65 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74  es.      ** part
99b0: 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20   of the schema. 
99c0: 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69  */.      pTab->i
99d0: 73 45 70 68 65 6d 20 3d 20 31 3b 0a 23 65 6e 64  sEphem = 1;.#end
99e0: 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
99f0: 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61      /* An ordina
9a00: 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  ry table or view
9a10: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f   name in the FRO
9a20: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
9a30: 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
9a40: 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
9a50: 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
9a60: 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20  pTab = .        
9a70: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
9a80: 6c 65 28 70 50 61 72 73 65 2c 70 46 72 6f 6d 2d  le(pParse,pFrom-
9a90: 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44  >zName,pFrom->zD
9aa0: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20  atabase);.      
9ab0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
9ac0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
9ad0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
9ae0: 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66  Tab->nRef++;.#if
9af0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9b00: 5f 56 49 45 57 0a 20 20 20 20 20 20 69 66 28 20  _VIEW.      if( 
9b10: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
9b20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72  .        /* We r
9b30: 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65  each here if the
9b40: 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20   named table is 
9b50: 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20  a really a view 
9b60: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
9b70: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
9b80: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
9b90: 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20   pTab) ){.      
9ba0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9bc0: 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53 65  /* If pFrom->pSe
9bd0: 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e 73  lect!=0 it means
9be0: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
9bf0: 77 69 74 68 20 61 0a 20 20 20 20 20 20 20 20 2a  with a.        *
9c00: 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20 61 20  * view within a 
9c10: 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45 43  view.  The SELEC
9c20: 54 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20  T structure has 
9c30: 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20  already been.   
9c40: 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 62       ** copied b
9c50: 79 20 74 68 65 20 6f 75 74 65 72 20 76 69 65 77  y the outer view
9c60: 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70 20   so we can skip 
9c70: 74 68 65 20 63 6f 70 79 20 73 74 65 70 20 68 65  the copy step he
9c80: 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  re.        ** in
9c90: 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77 2e   the inner view.
9ca0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
9cb0: 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70      if( pFrom->p
9cc0: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
9cd0: 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53         pFrom->pS
9ce0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
9cf0: 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d 3e 70  electDup(pTab->p
9d00: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
9d10: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
9d20: 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  f.    }.  }..  /
9d30: 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41  * Process NATURA
9d40: 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20  L keywords, and 
9d50: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
9d60: 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20  uses of joins.. 
9d70: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
9d80: 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72  ProcessJoin(pPar
9d90: 73 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e 20  se, p) ) return 
9da0: 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65  1;..  /* For eve
9db0: 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75  ry "*" that occu
9dc0: 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rs in the column
9dd0: 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68   list, insert th
9de0: 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20  e names of.  ** 
9df0: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
9e00: 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20  ll tables.  And 
9e10: 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e  for every TABLE.
9e20: 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  * insert the nam
9e30: 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63  es.  ** of all c
9e40: 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e  olumns in TABLE.
9e50: 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73    The parser ins
9e60: 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20  erted a special 
9e70: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
9e80: 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20  with the TK_ALL 
9e90: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63  operator for eac
9ea0: 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f  h "*" that it fo
9eb0: 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  und in the colum
9ec0: 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65  n list..  ** The
9ed0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
9ee0: 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61  just has to loca
9ef0: 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78  te the TK_ALL ex
9f00: 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78  pressions and ex
9f10: 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f  pand.  ** each o
9f20: 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ne to the list o
9f30: 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
9f40: 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a   all tables..  *
9f50: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
9f60: 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b   loop just check
9f70: 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  s to see if ther
9f80: 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70  e are any "*" op
9f90: 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61  erators.  ** tha
9fa0: 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67  t need expanding
9fb0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30  ..  */.  for(k=0
9fc0: 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
9fd0: 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; k++){.    Exp
9fe0: 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e  r *pE = pEList->
9ff0: 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
a000: 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
a010: 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  LL ) break;.    
a020: 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
a030: 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  OT && pE->pRight
a040: 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   && pE->pRight->
a050: 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20  op==TK_ALL.     
a060: 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74      && pE->pLeft
a070: 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f   && pE->pLeft->o
a080: 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b  p==TK_ID ) break
a090: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a  ;.  }.  rc = 0;.
a0a0: 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e    if( k<pEList->
a0b0: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a  nExpr ){.    /*.
a0c0: 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74      ** If we get
a0d0: 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74   here it means t
a0e0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  he result set co
a0f0: 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
a100: 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70  re "*".    ** op
a110: 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65  erators that nee
a120: 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
a130: 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  .  Loop through 
a140: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a  each expression.
a150: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65      ** in the re
a160: 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70  sult set and exp
a170: 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20  and them one by 
a180: 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  one..    */.    
a190: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
a1a0: 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74  item *a = pEList
a1b0: 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ->a;.    ExprLis
a1c0: 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20  t *pNew = 0;.   
a1d0: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61   int flags = pPa
a1e0: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a  rse->db->flags;.
a1f0: 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65      int longName
a200: 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c  s = (flags & SQL
a210: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
a220: 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )!=0 &&.        
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66                (f
a240: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
a250: 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b  ortColNames)==0;
a260: 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b  ..    for(k=0; k
a270: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
a280: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  k++){.      Expr
a290: 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70   *pE = a[k].pExp
a2a0: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  r;.      if( pE-
a2b0: 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20  >op!=TK_ALL &&. 
a2c0: 20 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e 6f            (pE->o
a2d0: 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
a2e0: 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45  >pRight==0 || pE
a2f0: 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  ->pRight->op!=TK
a300: 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _ALL) ){.       
a310: 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
a320: 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
a330: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
a340: 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
a350: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
a360: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
a370: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65  prListAppend(pNe
a380: 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30  w, a[k].pExpr, 0
a390: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
a3a0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
a3b0: 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
a3c0: 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20  Expr-1].zName = 
a3d0: 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[k].zName;.    
a3e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a3f0: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
a400: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
a410: 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20  [k].pExpr = 0;. 
a420: 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d         a[k].zNam
a430: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  e = 0;.      }el
a440: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
a450: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
a460: 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41  s a "*" or a "TA
a470: 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73  BLE.*" and needs
a480: 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a   to be.        *
a490: 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20  * expanded. */. 
a4a0: 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65         int table
a4b0: 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f  Seen = 0;      /
a4c0: 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20  * Set to 1 when 
a4d0: 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f  TABLE matches */
a4e0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
a4f0: 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  TName;          
a500: 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d    /* text of nam
a510: 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20  e of TABLE */.  
a520: 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
a530: 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e  ==TK_DOT && pE->
a540: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
a550: 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71 6c 69     zTName = sqli
a560: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
a570: 28 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b  (&pE->pLeft->tok
a580: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  en);.        }el
a590: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se{.          zT
a5a0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
a5b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
a5c0: 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
a5d0: 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
a5e0: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
a5f0: 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  From++){.       
a600: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
a610: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
a620: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
a630: 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e  abName = pFrom->
a640: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
a650: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
a660: 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  0 || zTabName[0]
a670: 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20  ==0 ){ .        
a680: 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
a690: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
a6a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a6b0: 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
a6c0: 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20  (zTabName==0 || 
a6d0: 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c  zTabName[0]==0 |
a6e0: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
a6f0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43      sqlite3StrIC
a700: 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e  mp(zTName, zTabN
a710: 61 6d 65 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  ame)!=0) ){.    
a720: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
a730: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
a740: 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
a750: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
a760: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
a770: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
a780: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
a790: 70 45 78 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a  pExpr, *pRight;.
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
a7b0: 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e   *zName = pTab->
a7c0: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a  aCol[j].zName;..
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
a7e0: 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i>0 ){.         
a7f0: 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
a800: 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20  ist_item *pLeft 
a810: 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
a820: 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -1];.           
a830: 20 20 20 69 66 28 20 28 70 4c 65 66 74 2d 3e 6a     if( (pLeft->j
a840: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
a850: 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20  URAL)!=0 &&.    
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a870: 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28      columnIndex(
a880: 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61  pLeft->pTab, zNa
a890: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
a8a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
a8b0: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20  a NATURAL join, 
a8c0: 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f  omit the join co
a8d0: 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a  lumns from the .
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8f0: 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  ** table on the 
a900: 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20  right */.       
a910: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
a920: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
a930: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
a940: 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69   if( sqlite3IdLi
a950: 73 74 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70  stIndex(pLeft->p
a960: 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
a970: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a980: 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e      /* In a join
a990: 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c   with a USING cl
a9a0: 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d  ause, omit colum
a9b0: 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
a9c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69            ** usi
a9d0: 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  ng clause from t
a9e0: 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
a9f0: 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
aa00: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
aa10: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
aa20: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
aa30: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
aa40: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
aa50: 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  pr(TK_ID, 0, 0, 
aa60: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
aa70: 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 20  if( pRight==0 ) 
aa80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
aa90: 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 52 69     setToken(&pRi
aaa0: 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d  ght->token, zNam
aab0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
aac0: 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20  if( zTabName && 
aad0: 28 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54  (longNames || pT
aae0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20  abList->nSrc>1) 
aaf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
ab00: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73   Expr *pLeft = s
ab10: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44  qlite3Expr(TK_ID
ab20: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
ab30: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
ab40: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
ab50: 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
ab60: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
ab70: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
ab80: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
ab90: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54 6f             setTo
aba0: 6b 65 6e 28 26 70 4c 65 66 74 2d 3e 74 6f 6b 65  ken(&pLeft->toke
abb0: 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20  n, zTabName);.  
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54              setT
abd0: 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73 70 61  oken(&pExpr->spa
abe0: 6e 2c 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74  n, sqlite3MPrint
abf0: 66 28 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e  f("%s.%s", zTabN
ac00: 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20  ame, zName));.  
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
ac20: 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b  r->span.dyn = 1;
ac30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
ac40: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  Expr->token.z = 
ac50: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
ac60: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20   pExpr->token.n 
ac70: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
ac80: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
ac90: 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dyn = 0;.       
aca0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
acb0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
acc0: 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
acd0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
ace0: 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b  pan = pExpr->tok
acf0: 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  en;.            
ad00: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
ad10: 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20  ( longNames ){. 
ad20: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
ad30: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
ad40: 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20  istAppend(pNew, 
ad50: 70 45 78 70 72 2c 20 26 70 45 78 70 72 2d 3e 73  pExpr, &pExpr->s
ad60: 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pan);.          
ad70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ad80: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
ad90: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
ada0: 65 6e 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c  end(pNew, pExpr,
adb0: 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29   &pRight->token)
adc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
add0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ade0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
adf0: 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a  ( !tableSeen ){.
ae00: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
ae10: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
ae20: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ae30: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
ae40: 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
ae50: 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20   zTName);.      
ae60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ae70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
ae80: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
ae90: 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66  no tables specif
aea0: 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ied");.         
aeb0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
aec0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
aed0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
aee0: 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e(zTName);.     
aef0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
af00: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
af10: 74 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  te(pEList);.    
af20: 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77  p->pEList = pNew
af30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
af40: 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
af50: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
af60: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
af70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73  This routine ass
af80: 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65 73 20  ociates entries 
af90: 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 65  in an ORDER BY e
afa0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 77  xpression list w
afb0: 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69  ith.** columns i
afc0: 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f 72  n a result.  For
afd0: 20 65 61 63 68 20 4f 52 44 45 52 20 42 59 20 65   each ORDER BY e
afe0: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 6f  xpression, the o
aff0: 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20  pcode of.** the 
b000: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
b010: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f  s changed to TK_
b020: 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20 69  COLUMN and the i
b030: 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66 0a  Column value of.
b040: 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  ** the top-level
b050: 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20   node is filled 
b060: 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 6e  in with column n
b070: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 54  umber and the iT
b080: 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  able.** value of
b090: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e   the top-level n
b0a0: 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69  ode is filled wi
b0b0: 74 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d 65  th iTable parame
b0c0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
b0d0: 65 72 65 20 61 72 65 20 70 72 69 6f 72 20 53 45  ere are prior SE
b0e0: 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74 68  LECT clauses, th
b0f0: 65 79 20 61 72 65 20 70 72 6f 63 65 73 73 65 64  ey are processed
b100: 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63 68   first.  A match
b110: 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69 65  .** in an earlie
b120: 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20 70  r SELECT takes p
b130: 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20 61  recedence over a
b140: 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a 2a   later SELECT..*
b150: 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20 74  *.** Any entry t
b160: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  hat does not mat
b170: 63 68 20 69 73 20 66 6c 61 67 67 65 64 20 61 73  ch is flagged as
b180: 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20   an error.  The 
b190: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
b1a0: 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ors is returned.
b1b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
b1c0: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
b1d0: 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
b1e0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
b1f0: 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65 61  * A place to lea
b200: 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ve error message
b210: 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
b220: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 2f  Select,        /
b230: 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75 6c  * Match to resul
b240: 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 69  t columns of thi
b250: 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45 78  s SELECT */.  Ex
b260: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
b270: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  ,     /* The ORD
b280: 45 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f 20  ER BY values to 
b290: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 63 6f  match against co
b2a0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  lumns */.  int i
b2b0: 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
b2c0: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 69     /* Insert thi
b2d0: 73 20 76 61 6c 75 65 20 69 6e 20 69 54 61 62 6c  s value in iTabl
b2e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 43  e */.  int mustC
b2f0: 6f 6d 70 6c 65 74 65 20 20 20 20 20 20 20 20 2f  omplete        /
b300: 2a 20 49 66 20 54 52 55 45 20 61 6c 6c 20 4f 52  * If TRUE all OR
b310: 44 45 52 20 42 59 73 20 6d 75 73 74 20 6d 61 74  DER BYs must mat
b320: 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ch */.){.  int n
b330: 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Err = 0;.  int i
b340: 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  , j;.  ExprList 
b350: 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  *pEList;..  if( 
b360: 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 4f  pSelect==0 || pO
b370: 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
b380: 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75 73 74  rn 1;.  if( must
b390: 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20  Complete ){.    
b3a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
b3b0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
b3c0: 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  { pOrderBy->a[i]
b3d0: 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20 7d  .done = 0; }.  }
b3e0: 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63  .  if( prepSelec
b3f0: 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53  tStmt(pParse, pS
b400: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
b410: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
b420: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
b430: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 74  r ){.    if( mat
b440: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
b450: 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  n(pParse, pSelec
b460: 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65  t->pPrior, pOrde
b470: 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 30 29 20  rBy, iTable, 0) 
b480: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
b490: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
b4a0: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
b4b0: 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
b4c0: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
b4d0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
b4e0: 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64   Expr *pE = pOrd
b4f0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
b500: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
b510: 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4f 72   -1;.    if( pOr
b520: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
b530: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
b540: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
b550: 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
b560: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66  Col) ){.      if
b570: 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f  ( iCol<=0 || iCo
b580: 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  l>pEList->nExpr 
b590: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b5a0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b5b0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52  e,.          "OR
b5c0: 44 45 52 20 42 59 20 70 6f 73 69 74 69 6f 6e 20  DER BY position 
b5d0: 25 64 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74  %d should be bet
b5e0: 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a  ween 1 and %d",.
b5f0: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 2c 20            iCol, 
b600: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
b610: 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a          nErr++;.
b620: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b630: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b640: 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29   !mustComplete )
b650: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
b660: 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20   iCol--;.    }. 
b670: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c     for(j=0; iCol
b680: 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d 3e  <0 && j<pEList->
b690: 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
b6a0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
b6b0: 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45  [j].zName && (pE
b6c0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70  ->op==TK_ID || p
b6d0: 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  E->op==TK_STRING
b6e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
b6f0: 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65  r *zName, *zLabe
b700: 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  l;.        zName
b710: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   = pEList->a[j].
b720: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a  zName;.        z
b730: 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 4e  Label = sqlite3N
b740: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 45  ameFromToken(&pE
b750: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
b760: 20 20 61 73 73 65 72 74 28 20 7a 4c 61 62 65 6c    assert( zLabel
b770: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
b780: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
b790: 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29  p(zName, zLabel)
b7a0: 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20  ==0 ){ .        
b7b0: 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20    iCol = j;.    
b7c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
b7d0: 6c 69 74 65 46 72 65 65 28 7a 4c 61 62 65 6c 29  liteFree(zLabel)
b7e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b7f0: 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 73 71  if( iCol<0 && sq
b800: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
b810: 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  (pE, pEList->a[j
b820: 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
b830: 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20      iCol = j;.  
b840: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b850: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
b860: 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b       pE->op = TK
b870: 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70  _COLUMN;.      p
b880: 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  E->iColumn = iCo
b890: 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 54 61  l;.      pE->iTa
b8a0: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
b8b0: 20 20 20 20 70 45 2d 3e 69 41 67 67 20 3d 20 2d      pE->iAgg = -
b8c0: 31 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  1;.      pOrderB
b8d0: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31  y->a[i].done = 1
b8e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
b8f0: 69 43 6f 6c 3c 30 20 26 26 20 6d 75 73 74 43 6f  iCol<0 && mustCo
b900: 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  mplete ){.      
b910: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
b920: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
b930: 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6e  "ORDER BY term n
b940: 75 6d 62 65 72 20 25 64 20 64 6f 65 73 20 6e 6f  umber %d does no
b950: 74 20 6d 61 74 63 68 20 61 6e 79 20 72 65 73 75  t match any resu
b960: 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29  lt column", i+1)
b970: 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
b980: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b990: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
b9a0: 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66  nErr;  .}.#endif
b9b0: 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
b9c0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
b9d0: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a  _SELECT */../*.*
b9e0: 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
b9f0: 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
ba00: 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
ba10: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
ba20: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
ba30: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
ba40: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
ba50: 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
ba60: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
ba70: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74  Vdbe *sqlite3Get
ba80: 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
ba90: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
baa0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
bab0: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
bac0: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
bad0: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dbe = sqlite3Vdb
bae0: 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e  eCreate(pParse->
baf0: 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  db);.  }.  retur
bb00: 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  n v;.}.../*.** C
bb10: 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69  ompute the iLimi
bb20: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69  t and iOffset fi
bb30: 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45  elds of the SELE
bb40: 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  CT based on the.
bb50: 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  ** pLimit and pO
bb60: 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  ffset expression
bb70: 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  s.  pLimit and p
bb80: 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20  Offset hold the 
bb90: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
bba0: 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  hat appear in th
bbb0: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73  e original SQL s
bbc0: 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74  tatement after t
bbd0: 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
bbe0: 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e  SET.** keywords.
bbf0: 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f    Or NULL if tho
bc00: 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
bc10: 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20  omitted. iLimit 
bc20: 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20  and iOffset .** 
bc30: 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  are the integer 
bc40: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20  memory register 
bc50: 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e  numbers for coun
bc60: 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ters used to com
bc70: 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d  pute .** the lim
bc80: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20  it and offset.  
bc90: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  If there is no l
bca0: 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73  imit and/or offs
bcb0: 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69  et, then .** iLi
bcc0: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
bcd0: 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  are negative..**
bce0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
bcf0: 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
bd00: 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e  ues of iLimit an
bd10: 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69  d iOffset only i
bd20: 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20  f.** a limit or 
bd30: 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65  offset is define
bd40: 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20  d by pLimit and 
bd50: 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74  pOffset.  iLimit
bd60: 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20   and.** iOffset 
bd70: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
bd80: 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f   preset to appro
bd90: 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76  priate default v
bda0: 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c  alues.** (usuall
bdb0: 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73  y but not always
bdc0: 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61   -1) prior to ca
bdd0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
bde0: 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70  ne..** Only if p
bdf0: 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66  Limit!=0 or pOff
be00: 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69  set!=0 do the li
be10: 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65  mit registers ge
be20: 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20  t.** redefined. 
be30: 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
be40: 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69  perator uses thi
be50: 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f  s property to fo
be60: 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65  rce.** the reuse
be70: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d   of the same lim
be80: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65  it and offset re
be90: 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d  gisters across m
bea0: 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43  ultiple.** SELEC
beb0: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  T statements..*/
bec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
bed0: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
bee0: 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
bef0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
bf00: 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65   iBreak){.  Vdbe
bf10: 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *v = 0;.  int i
bf20: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Limit = 0;.  int
bf30: 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
bf40: 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 0a 20  addr1, addr2;.. 
bf50: 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54   /* .  ** "LIMIT
bf60: 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77   -1" always show
bf70: 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65  s all rows.  The
bf80: 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20  re is some.  ** 
bf90: 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75  contraversy abou
bfa0: 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65  t what the corre
bfb0: 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75  ct behavior shou
bfc0: 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20  ld be..  ** The 
bfd0: 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
bfe0: 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74  tation interpret
bff0: 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d  s "LIMIT 0" to m
c000: 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73  ean.  ** no rows
c010: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
c020: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d  pLimit ){.    p-
c030: 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74  >iLimit = iLimit
c040: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   = pParse->nMem;
c050: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
c060: 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 76 20 3d 20  m += 2;.    v = 
c070: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
c080: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
c090: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
c0a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
c0b0: 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  de(pParse, p->pL
c0c0: 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
c0d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c0e0: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20  P_MustBeInt, 0, 
c0f0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
c100: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
c110: 65 6d 53 74 6f 72 65 2c 20 69 4c 69 6d 69 74 2c  emStore, iLimit,
c120: 20 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d   0);.    VdbeCom
c130: 6d 65 6e 74 28 28 76 2c 20 22 23 20 4c 49 4d 49  ment((v, "# LIMI
c140: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
c150: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c160: 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65  Op(v, OP_IfMemZe
c170: 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65  ro, iLimit, iBre
c180: 61 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ak);.  }.  if( p
c190: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
c1a0: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f   p->iOffset = iO
c1b0: 66 66 73 65 74 20 3d 20 70 50 61 72 73 65 2d 3e  ffset = pParse->
c1c0: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 76 20 3d 20  nMem++;.    v = 
c1d0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
c1e0: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
c1f0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
c200: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
c210: 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f  de(pParse, p->pO
c220: 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  ffset);.    sqli
c230: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c240: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c  OP_MustBeInt, 0,
c250: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
c260: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c270: 4d 65 6d 53 74 6f 72 65 2c 20 69 4f 66 66 73 65  MemStore, iOffse
c280: 74 2c 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 29  t, p->pLimit==0)
c290: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
c2a0: 74 28 28 76 2c 20 22 23 20 4f 46 46 53 45 54 20  t((v, "# OFFSET 
c2b0: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
c2c0: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
c2d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
c2e0: 66 4d 65 6d 50 6f 73 2c 20 69 4f 66 66 73 65 74  fMemPos, iOffset
c2f0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
c300: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c310: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
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 6e 74 65 67 65 72 2c  p(v, OP_Integer,
c340: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
c350: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
c360: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 69  v, addr1);.    i
c370: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
c380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c390: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64  eAddOp(v, OP_Add
c3a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
c3b0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d   }.  if( p->pLim
c3c0: 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 31 20  it ){.    addr1 
c3d0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c3e0: 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f  Op(v, OP_IfMemPo
c3f0: 73 2c 20 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20  s, iLimit, 0);. 
c400: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c410: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
c420: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
c430: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c440: 5f 4d 65 6d 49 6e 74 2c 20 2d 31 2c 20 69 4c 69  _MemInt, -1, iLi
c450: 6d 69 74 2b 31 29 3b 0a 20 20 20 20 61 64 64 72  mit+1);.    addr
c460: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
c470: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
c480: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
c490: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
c4a0: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73  v, addr1);.    s
c4b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c4c0: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
c4d0: 69 4c 69 6d 69 74 2b 31 2c 20 31 29 3b 0a 20 20  iLimit+1, 1);.  
c4e0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
c4f0: 2c 20 22 23 20 4c 49 4d 49 54 2b 4f 46 46 53 45  , "# LIMIT+OFFSE
c500: 54 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  T"));.    sqlite
c510: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
c520: 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a   addr2);.  }.}..
c530: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
c540: 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
c550: 6f 20 75 73 65 20 66 6f 72 20 73 6f 72 74 69 6e  o use for sortin
c560: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
c570: 64 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49  d createSortingI
c580: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
c590: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 45  se, Select *p, E
c5a0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
c5b0: 79 29 7b 0a 20 20 69 66 28 20 70 4f 72 64 65 72  y){.  if( pOrder
c5c0: 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  By ){.    int ad
c5d0: 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  dr;.    assert( 
c5e0: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
c5f0: 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72  or==0 );.    pOr
c600: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20  derBy->iECursor 
c610: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
c620: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
c630: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 70 50  ite3VdbeAddOp(pP
c640: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
c650: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
c660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c670: 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
c680: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70  rBy->iECursor, p
c690: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
c6a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
c6b0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
c6c0: 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 70  ] == -1 );.    p
c6d0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
c6e0: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 7d 0a 7d 0a  ] = addr;.  }.}.
c6f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c700: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
c710: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  LECT./*.** Retur
c720: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
c730: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
c740: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f  ence for the iCo
c750: 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  l-th column of.*
c760: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
c770: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
c780: 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d-select stateme
c790: 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20  nt "p".  Return 
c7a0: 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63  NULL if.** the c
c7b0: 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66  olumn has no def
c7c0: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ault collating s
c7d0: 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  equence..**.** T
c7e0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
c7f0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f  uence for the co
c800: 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73  mpound select is
c810: 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a   taken from the.
c820: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  ** left-most ter
c830: 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  m of the select 
c840: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61  that has a colla
c850: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
c860: 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
c870: 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c   *multiSelectCol
c880: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
c890: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
c8a0: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c  nt iCol){.  Coll
c8b0: 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  Seq *pRet;.  if(
c8c0: 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
c8d0: 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65    pRet = multiSe
c8e0: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
c8f0: 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  se, p->pPrior, i
c900: 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col);.  }else{. 
c910: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d     pRet = 0;.  }
c920: 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29  .  if( pRet==0 )
c930: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
c940: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
c950: 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
c960: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
c970: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
c980: 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pRet;.}.#endif /
c990: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
c9a0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
c9b0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c9c0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
c9d0: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ELECT./*.** This
c9e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
c9f0: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20  ed to process a 
ca00: 71 75 65 72 79 20 74 68 61 74 20 69 73 20 72 65  query that is re
ca10: 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a  ally the union.*
ca20: 2a 20 6f 72 20 69 6e 74 65 72 73 65 63 74 69 6f  * or intersectio
ca30: 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  n of two or more
ca40: 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65   separate querie
ca50: 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69  s..**.** "p" poi
ca60: 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74  nts to the right
ca70: 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f  -most of the two
ca80: 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71   queries.  the q
ca90: 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c  uery on the.** l
caa0: 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72  eft is p->pPrior
cab0: 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72  .  The left quer
cac0: 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  y could also be 
cad0: 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
cae0: 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73  .** in which cas
caf0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
cb00: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65  ill be called re
cb10: 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a  cursively. .**.*
cb20: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
cb30: 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
cb40: 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74   are to be writt
cb50: 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e  en into a destin
cb60: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65  ation.** of type
cb70: 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61   eDest with para
cb80: 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a  meter iParm..**.
cb90: 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43  ** Example 1:  C
cba0: 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d  onsider a three-
cbb0: 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c  way compound SQL
cbc0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
cbd0: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
cbe0: 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
cbf0: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e  ECT b FROM t2 UN
cc00: 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f  ION SELECT c FRO
cc10: 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  M t3.**.** This 
cc20: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
cc30: 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77  sed up as follow
cc40: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
cc50: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
cc60: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
cc70: 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  `----->  SELECT 
cc80: 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20  b FROM t2.**    
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccb0: 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54  `------>  SELECT
ccc0: 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a   a FROM t1.**.**
ccd0: 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74   The arrows in t
cce0: 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65  he diagram above
ccf0: 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53   represent the S
cd00: 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69  elect.pPrior poi
cd10: 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74  nter..** So if t
cd20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
cd30: 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75  alled with p equ
cd40: 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65  al to the t3 que
cd50: 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69  ry, then.** pPri
cd60: 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74  or will be the t
cd70: 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20  2 query.  p->op 
cd80: 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e  will be TK_UNION
cd90: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
cda0: 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74  *.** Notice that
cdb0: 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
cdc0: 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65  way SQLite parse
cdd0: 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  s compound SELEC
cde0: 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  Ts, the.** indiv
cdf0: 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c  idual selects al
ce00: 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20  ways group from 
ce10: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a  left to right..*
ce20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
ce30: 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  tiSelect(.  Pars
ce40: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ce50: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
ce60: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
ce70: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
ce80: 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
ce90: 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
cea0: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  be coded */.  in
ceb0: 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20  t eDest,        
cec0: 20 20 20 20 2f 2a 20 5c 5f 5f 5f 20 20 53 74 6f      /* \___  Sto
ced0: 72 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  re query results
cee0: 20 61 73 20 73 70 65 63 69 66 69 65 64 20 2a 2f   as specified */
cef0: 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20  .  int iParm,   
cf00: 20 20 20 20 20 20 20 20 20 2f 2a 20 2f 20 20 20           /* /   
cf10: 20 20 62 79 20 74 68 65 73 65 20 74 77 6f 20 70    by these two p
cf20: 61 72 61 6d 65 74 65 72 73 2e 20 20 20 20 20 20  arameters.      
cf30: 20 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66     */.  char *af
cf40: 66 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  f             /*
cf50: 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54   If eDest is SRT
cf60: 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69  _Union, the affi
cf70: 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29  nity string */.)
cf80: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
cf90: 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63  ITE_OK;   /* Suc
cfa0: 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61  cess code from a
cfb0: 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
cfc0: 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
cfd0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
cfe0: 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
cff0: 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
d000: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
d010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
d020: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
d030: 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69  this VDBE */.  i
d040: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
d050: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d060: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
d070: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
d080: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
d090: 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy;   /* The OR
d0a0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 6e  DER BY clause on
d0b0: 20 70 20 2a 2f 0a 20 20 69 6e 74 20 61 53 65 74   p */.  int aSet
d0c0: 50 32 5b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a  P2[2];        /*
d0d0: 20 53 65 74 20 50 32 20 76 61 6c 75 65 20 6f 66   Set P2 value of
d0e0: 20 74 68 65 73 65 20 6f 70 20 74 6f 20 6e 75 6d   these op to num
d0f0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a  ber of columns *
d100: 2f 0a 20 20 69 6e 74 20 6e 53 65 74 50 32 20 3d  /.  int nSetP2 =
d110: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d   0;       /* Num
d120: 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20  ber of slots in 
d130: 61 53 65 74 50 32 5b 5d 20 75 73 65 64 20 2a 2f  aSetP2[] used */
d140: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
d150: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
d160: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
d170: 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
d180: 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
d190: 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
d1a0: 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
d1b0: 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
d1c0: 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
d1d0: 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
d1e0: 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  /.  if( p==0 || 
d1f0: 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  p->pPrior==0 ){.
d200: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
d210: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d220: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72  t_end;.  }.  pPr
d230: 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
d240: 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
d250: 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70  r->pRightmost!=p
d260: 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72  Prior );.  asser
d270: 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68  t( pPrior->pRigh
d280: 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74  tmost==p->pRight
d290: 6d 6f 73 74 20 29 3b 0a 20 20 69 66 28 20 70 50  most );.  if( pP
d2a0: 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
d2b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
d2c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52  orMsg(pParse,"OR
d2d0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68  DER BY clause sh
d2e0: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
d2f0: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
d300: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
d310: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
d320: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
d330: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
d340: 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  d;.  }.  if( pPr
d350: 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ior->pLimit ){. 
d360: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d370: 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54  sg(pParse,"LIMIT
d380: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
d390: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
d3a0: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
d3b0: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
d3c0: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
d3d0: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
d3e0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
d3f0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
d400: 20 77 65 20 68 61 76 65 20 61 20 76 61 6c 69 64   we have a valid
d410: 20 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20   query engine.  
d420: 49 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61  If not, create a
d430: 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   new one..  */. 
d440: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
d450: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
d460: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72  f( v==0 ){.    r
d470: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
d480: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
d490: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61  ;.  }..  /* Crea
d4a0: 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
d4b0: 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
d4c0: 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
d4d0: 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
d4e0: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
d4f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
d500: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 61  >pEList );.    a
d510: 73 73 65 72 74 28 20 6e 53 65 74 50 32 3c 73 69  ssert( nSetP2<si
d520: 7a 65 6f 66 28 61 53 65 74 50 32 29 2f 73 69 7a  zeof(aSetP2)/siz
d530: 65 6f 66 28 61 53 65 74 50 32 5b 30 5d 29 20 29  eof(aSetP2[0]) )
d540: 3b 0a 20 20 20 20 61 53 65 74 50 32 5b 6e 53 65  ;.    aSetP2[nSe
d550: 74 50 32 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33  tP2++] = sqlite3
d560: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d570: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
d580: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44  Parm, 0);.    eD
d590: 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b  est = SRT_Table;
d5a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
d5b0: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
d5c0: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
d5d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d5e0: 73 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 64 65 72  s..  */.  pOrder
d5f0: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
d600: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  ;.  switch( p->o
d610: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
d620: 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66  _ALL: {.      if
d630: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
d640: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
d650: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61  r = 0;.        a
d660: 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
d670: 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20  pLimit );.      
d680: 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74    pPrior->pLimit
d690: 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
d6a0: 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f        pPrior->pO
d6b0: 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
d6c0: 65 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  et;.        rc =
d6d0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
d6e0: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 65  Parse, pPrior, e
d6f0: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20  Dest, iParm, 0, 
d700: 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20  0, 0, aff);.    
d710: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
d720: 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f  0;.        p->pO
d730: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
d740: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
d750: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
d760: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
d770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d780: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
d790: 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74         p->iLimit
d7a0: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69   = pPrior->iLimi
d7b0: 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f  t;.        p->iO
d7c0: 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e  ffset = pPrior->
d7d0: 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  iOffset;.       
d7e0: 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d   if( p->iLimit>=
d7f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
d800: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
d810: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d  eAddOp(v, OP_IfM
d820: 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  emZero, p->iLimi
d830: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
d840: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
d850: 20 22 23 20 4a 75 6d 70 20 61 68 65 61 64 20 69   "# Jump ahead i
d860: 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22  f LIMIT reached"
d870: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
d880: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d890: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
d8a0: 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d   p, eDest, iParm
d8b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b  , 0, 0, 0, aff);
d8c0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69  .        p->pPri
d8d0: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
d8e0: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
d8f0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
d900: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
d910: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d920: 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20    if( addr ){.  
d930: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d940: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
d950: 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ddr);.        }.
d960: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d970: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
d980: 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e  For UNION ALL ..
d990: 2e 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c 20  . ORDER BY fall 
d9a0: 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
d9b0: 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  ext case */.    
d9c0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
d9d0: 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
d9e0: 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
d9f0: 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
da00: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
da10: 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
da20: 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
da30: 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
da40: 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20    int op = 0;   
da50: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
da60: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
da70: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
da80: 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
da90: 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
daa0: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
dab0: 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
dac0: 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
dad0: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
dae0: 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20  t, *pOffset; /* 
daf0: 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
db00: 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
db10: 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
db20: 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20    int addr;..   
db30: 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e     priorOp = p->
db40: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54  op==TK_ALL ? SRT
db50: 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69  _Table : SRT_Uni
db60: 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  on;.      if( eD
db70: 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20  est==priorOp && 
db80: 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21  pOrderBy==0 && !
db90: 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21 70 2d  p->pLimit && !p-
dba0: 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
dbb0: 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
dbc0: 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
dbd0: 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
dbe0: 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
dbf0: 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69  ur.        ** ri
dc00: 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ght..        */.
dc10: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
dc20: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20 20   = iParm;.      
dc30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
dc40: 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  * We will need t
dc50: 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
dc60: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
dc70: 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20   to hold the.   
dc80: 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
dc90: 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
dca0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
dcb0: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72   unionTab = pPar
dcc0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
dcd0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
dce0: 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79   && matchOrderby
dcf0: 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  ToColumn(pParse,
dd00: 20 70 2c 20 70 4f 72 64 65 72 42 79 2c 20 75 6e   p, pOrderBy, un
dd10: 69 6f 6e 54 61 62 2c 31 29 20 29 7b 0a 20 20 20  ionTab,1) ){.   
dd20: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
dd30: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
dd40: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
dd50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dd60: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
dd70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
dd80: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75  OpenEphemeral, u
dd90: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
dda0: 20 20 20 20 20 69 66 28 20 70 72 69 6f 72 4f 70       if( priorOp
ddb0: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20  ==SRT_Table ){. 
ddc0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
ddd0: 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28 61   nSetP2<sizeof(a
dde0: 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61 53  SetP2)/sizeof(aS
ddf0: 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20  etP2[0]) );.    
de00: 20 20 20 20 20 20 61 53 65 74 50 32 5b 6e 53 65        aSetP2[nSe
de10: 74 50 32 2b 2b 5d 20 3d 20 61 64 64 72 3b 0a 20  tP2++] = addr;. 
de20: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
de30: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
de40: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
de50: 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
de60: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
de70: 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
de80: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 52  .          p->pR
de90: 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70  ightmost->usesEp
dea0: 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  hm = 1;.        
deb0: 7d 0a 20 20 20 20 20 20 20 20 63 72 65 61 74 65  }.        create
dec0: 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61  SortingIndex(pPa
ded0: 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42 79  rse, p, pOrderBy
dee0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
def0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
df00: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
df10: 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
df20: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
df30: 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
df40: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
df50: 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
df60: 79 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  y );.      rc = 
df70: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
df80: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 72  arse, pPrior, pr
df90: 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  iorOp, unionTab,
dfa0: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
dfb0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
dfc0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
dfd0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
dfe0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
dff0: 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
e000: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
e010: 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  nt.      */.    
e020: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
e030: 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  ){.         case
e040: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20   TK_EXCEPT:  op 
e050: 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20  = SRT_Except;   
e060: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
e070: 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20  case TK_UNION:  
e080: 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b   op = SRT_Union;
e090: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e0a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
e0b0: 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61       op = SRT_Ta
e0c0: 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ble;    break;. 
e0d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
e0e0: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
e0f0: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
e100: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 73 61  0;.      p->disa
e110: 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 70 4f  llowOrderBy = pO
e120: 72 64 65 72 42 79 21 3d 30 3b 0a 20 20 20 20 20  rderBy!=0;.     
e130: 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
e140: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
e150: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
e160: 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
e170: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
e180: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
e190: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
e1a0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
e1b0: 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c  op, unionTab, 0,
e1c0: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
e1d0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
e1e0: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
e1f0: 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
e200: 72 42 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rBy;.      sqlit
e210: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
e220: 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
e230: 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
e240: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
e250: 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
e260: 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
e270: 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f   -1;.      p->iO
e280: 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 20 20  ffset = -1;.    
e290: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
e2a0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
e2b0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
e2c0: 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   }...      /* Co
e2d0: 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69  nvert the data i
e2e0: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
e2f0: 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65  table into whate
e300: 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a  ver form.      *
e310: 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20  * it is that we 
e320: 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a  currently need..
e330: 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20        */      . 
e340: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 21 3d       if( eDest!=
e350: 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e  priorOp || union
e360: 54 61 62 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20  Tab!=iParm ){.  
e370: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
e380: 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
e390: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e3a0: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
e3b0: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
e3c0: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
e3d0: 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
e3e0: 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  t *pFirst = p;. 
e3f0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
e400: 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
e410: 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
e420: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
e430: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
e440: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
e450: 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
e460: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
e470: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
e480: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
e490: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
e4a0: 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
e4b0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
e4c0: 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65  .        compute
e4d0: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
e4e0: 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b  Parse, p, iBreak
e4f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
e500: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e510: 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
e520: 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  ab, iBreak);.   
e530: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
e540: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
e550: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
e560: 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65   rc = selectInne
e570: 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
e580: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f   p->pEList, unio
e590: 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  nTab, p->pEList-
e5a0: 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5c0: 20 20 20 20 20 70 4f 72 64 65 72 42 79 2c 20 2d       pOrderBy, -
e5d0: 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  1, eDest, iParm,
e5e0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
e600: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29  Cont, iBreak, 0)
e610: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
e620: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
e630: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
e640: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
e650: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
e660: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e670: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
e680: 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
e690: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e6a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
e6b0: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
e6c0: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
e6d0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
e6e0: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
e6f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e700: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
e710: 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  lose, unionTab, 
e720: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
e730: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e740: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
e750: 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  SECT: {.      in
e760: 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20  t tab1, tab2;.  
e770: 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
e780: 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
e790: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
e7a0: 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20  t, *pOffset;.   
e7b0: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20     int addr;..  
e7c0: 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54      /* INTERSECT
e7d0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
e7e0: 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69  om the others si
e7f0: 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a  nce it requires.
e800: 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
e810: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
e820: 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
e830: 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
e840: 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c  n.      ** by al
e850: 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62  locating the tab
e860: 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  les we will need
e870: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
e880: 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e   tab1 = pParse->
e890: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61  nTab++;.      ta
e8a0: 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
e8b0: 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b++;.      if( p
e8c0: 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74 63 68  OrderBy && match
e8d0: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
e8e0: 70 50 61 72 73 65 2c 70 2c 70 4f 72 64 65 72 42  pParse,p,pOrderB
e8f0: 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20 20 20  y,tab1,1) ){.   
e900: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
e910: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
e920: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
e930: 20 20 7d 0a 20 20 20 20 20 20 63 72 65 61 74 65    }.      create
e940: 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61  SortingIndex(pPa
e950: 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42 79  rse, p, pOrderBy
e960: 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d  );..      addr =
e970: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e980: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  p(v, OP_OpenEphe
e990: 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b  meral, tab1, 0);
e9a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e9b0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
e9c0: 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
e9d0: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
e9e0: 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
e9f0: 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d    p->pRightmost-
ea00: 3e 75 73 65 73 45 70 68 6d 20 3d 20 31 3b 0a 20  >usesEphm = 1;. 
ea10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
ea20: 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20  pEList );..     
ea30: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
ea40: 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ECTs to our left
ea50: 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
ea60: 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20  table "tab1"..  
ea70: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
ea80: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
ea90: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
eaa0: 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 2c  SRT_Union, tab1,
eab0: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
eac0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
ead0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
eae0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
eaf0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
eb00: 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
eb10: 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
eb20: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
eb30: 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ab2".      */.  
eb40: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
eb50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
eb60: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
eb70: 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
eb80: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
eb90: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d  OpenEphm[1] == -
eba0: 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
ebb0: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
ebc0: 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  addr;.      p->p
ebd0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
ebe0: 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
ebf0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
ec00: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
ec10: 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
ec20: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
ec30: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
ec40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
ec50: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
ec60: 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c  SRT_Union, tab2,
ec70: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
ec80: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
ec90: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
eca0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
ecb0: 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  e(p->pLimit);.  
ecc0: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
ecd0: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
ece0: 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
ecf0: 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  et;.      if( rc
ed00: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
ed10: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
ed20: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
ed30: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
ed40: 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69  de to take the i
ed50: 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
ed60: 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  he two temporary
ed70: 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73  .      ** tables
ed80: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
ed90: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
eda0: 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  st );.      if( 
edb0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
edc0: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 53  ack ){.        S
edd0: 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
ede0: 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  p;.        while
edf0: 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
ee00: 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
ee10: 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
ee20: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
ee30: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
ee40: 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
ee50: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
ee60: 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
ee70: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
ee80: 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20  v);.      iCont 
ee90: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
eea0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
eeb0: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
eec0: 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
eed0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
eee0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eef0: 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
ef00: 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20  tab1, iBreak);. 
ef10: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
ef20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ef30: 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62  , OP_RowKey, tab
ef40: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
ef50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ef60: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
ef70: 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  b2, iCont);.    
ef80: 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e    rc = selectInn
ef90: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
efa0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
efb0: 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  1, p->pEList->nE
efc0: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efe0: 20 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20    pOrderBy, -1, 
eff0: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20  eDest, iParm, . 
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f010: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e              iCon
f020: 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20  t, iBreak, 0);. 
f030: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
f040: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
f050: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
f060: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
f070: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
f080: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
f090: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
f0a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f0b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
f0c0: 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b  , tab1, iStart);
f0d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f0e0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
f0f0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
f100: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f110: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  p(v, OP_Close, t
f120: 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab2, 0);.      s
f130: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f140: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
f150: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
f160: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
f170: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c   /* Make sure al
f180: 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65  l SELECTs in the
f190: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20   statement have 
f1a0: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
f1b0: 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a  of elements.  **
f1c0: 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74   in their result
f1d0: 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73   sets..  */.  as
f1e0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
f1f0: 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  && pPrior->pELis
f200: 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45  t );.  if( p->pE
f210: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72  List->nExpr!=pPr
f220: 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ior->pEList->nEx
f230: 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
f240: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f250: 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68  , "SELECTs to th
f260: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
f270: 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20   of %s".      " 
f280: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
f290: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
f2a0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
f2b0: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
f2c0: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
f2d0: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
f2e0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
f2f0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e  ..  /* Set the n
f300: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
f310: 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   in temporary ta
f320: 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c  bles.  */.  nCol
f330: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
f340: 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53  xpr;.  while( nS
f350: 65 74 50 32 20 29 7b 0a 20 20 20 20 73 71 6c 69  etP2 ){.    sqli
f360: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
f370: 76 2c 20 61 53 65 74 50 32 5b 2d 2d 6e 53 65 74  v, aSetP2[--nSet
f380: 50 32 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a  P2], nCol);.  }.
f390: 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f  .  /* Compute co
f3a0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
f3b0: 73 20 75 73 65 64 20 62 79 20 65 69 74 68 65 72  s used by either
f3c0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
f3d0: 61 75 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20  ause or.  ** by 
f3e0: 61 6e 79 20 74 65 6d 70 6f 72 61 72 79 20 74 61  any temporary ta
f3f0: 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69  bles needed to i
f400: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d  mplement the com
f410: 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
f420: 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65  ** Attach the Ke
f430: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
f440: 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  to all temporary
f450: 20 74 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65   tables.  Invoke
f460: 20 74 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20   the.  ** ORDER 
f470: 42 59 20 70 72 6f 63 65 73 73 69 6e 67 20 69 66  BY processing if
f480: 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
f490: 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  ER BY clause..  
f4a0: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63  **.  ** This sec
f4b0: 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74  tion is run by t
f4c0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45  he right-most SE
f4d0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
f4e0: 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54  nly..  ** SELECT
f4f0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74   statements to t
f500: 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73  he left always s
f510: 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20 20  kip this part.  
f520: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  The right-most. 
f530: 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74   ** SELECT might
f540: 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20   also skip this 
f550: 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20 6e  part if it has n
f560: 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
f570: 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65  e and.  ** no te
f580: 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72 65  mp tables are re
f590: 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  quired..  */.  i
f5a0: 66 28 20 70 4f 72 64 65 72 42 79 20 7c 7c 20 70  f( pOrderBy || p
f5b0: 2d 3e 75 73 65 73 45 70 68 6d 20 29 7b 0a 20 20  ->usesEphm ){.  
f5c0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5e0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
f5f0: 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
f600: 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20  pKeyInfo;       
f610: 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
f620: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
f630: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
f640: 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f  .    Select *pLo
f650: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
f660: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
f670: 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54  g through SELECT
f680: 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20   statements */. 
f690: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43     CollSeq **apC
f6a0: 6f 6c 6c 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  oll;.    CollSeq
f6b0: 20 2a 2a 61 43 6f 70 79 3b 0a 0a 20 20 20 20 61   **aCopy;..    a
f6c0: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
f6d0: 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70  most==p );.    p
f6e0: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
f6f0: 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  Malloc(sizeof(*p
f700: 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 32 2a  KeyInfo)+nCol*2*
f710: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
f720: 20 2b 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 69 66   + nCol);.    if
f730: 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  ( !pKeyInfo ){. 
f740: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f750: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
f760: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f770: 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  end;.    }..    
f780: 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20  pKeyInfo->enc = 
f790: 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
f7a0: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  .    pKeyInfo->n
f7b0: 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20  Field = nCol;.. 
f7c0: 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f     for(i=0, apCo
f7d0: 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ll=pKeyInfo->aCo
f7e0: 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ll; i<nCol; i++,
f7f0: 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20   apColl++){.    
f800: 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74    *apColl = mult
f810: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
f820: 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
f830: 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f      if( 0==*apCo
f840: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61  ll ){.        *a
f850: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
f860: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
f870: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
f880: 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
f890: 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
f8a0: 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
f8b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
f8c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
f8d0: 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e  t addr = pLoop->
f8e0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b  addrOpenEphm[i];
f8f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
f900: 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
f910: 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e   /* If [0] is un
f920: 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73  used then [1] is
f930: 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53   also unused.  S
f940: 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20  o we can.       
f950: 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66     ** always saf
f960: 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f  ely abort as soo
f970: 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75  n as the first u
f980: 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f  nused slot is fo
f990: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
f9a0: 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
f9b0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c  addrOpenEphm[1]<
f9c0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
f9d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
f9e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f9f0: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
fa00: 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ddr, nCol);.    
fa10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
fa20: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
fa30: 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
fa40: 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P3_KEYINFO);. 
fa50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
fa60: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
fa70: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
fa80: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f  xprList_item *pO
fa90: 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d  Term = pOrderBy-
faa0: 3e 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f  >a;.      int nO
fab0: 72 64 65 72 42 79 45 78 70 72 20 3d 20 70 4f 72  rderByExpr = pOr
fac0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
fad0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
fae0: 20 20 20 20 75 38 20 2a 70 53 6f 72 74 4f 72 64      u8 *pSortOrd
faf0: 65 72 3b 0a 0a 20 20 20 20 20 20 61 43 6f 70 79  er;..      aCopy
fb00: 20 3d 20 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43   = &pKeyInfo->aC
fb10: 6f 6c 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 20  oll[nCol];.     
fb20: 20 70 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b   pSortOrder = pK
fb30: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
fb40: 65 72 20 3d 20 28 75 38 2a 29 26 61 43 6f 70 79  er = (u8*)&aCopy
fb50: 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 6d 65  [nCol];.      me
fb60: 6d 63 70 79 28 61 43 6f 70 79 2c 20 70 4b 65 79  mcpy(aCopy, pKey
fb70: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e 43 6f  Info->aColl, nCo
fb80: 6c 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  l*sizeof(CollSeq
fb90: 2a 29 29 3b 0a 20 20 20 20 20 20 61 70 43 6f 6c  *));.      apCol
fba0: 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
fbb0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  oll;.      for(i
fbc0: 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 45 78  =0; i<nOrderByEx
fbd0: 70 72 3b 20 69 2b 2b 2c 20 70 4f 54 65 72 6d 2b  pr; i++, pOTerm+
fbe0: 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 2c 20 70 53 6f  +, apColl++, pSo
fbf0: 72 74 4f 72 64 65 72 2b 2b 29 7b 0a 20 20 20 20  rtOrder++){.    
fc00: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
fc10: 3d 20 70 4f 54 65 72 6d 2d 3e 70 45 78 70 72 3b  = pOTerm->pExpr;
fc20: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
fc30: 4e 61 6d 65 20 3d 20 70 4f 54 65 72 6d 2d 3e 7a  Name = pOTerm->z
fc40: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73  Name;.        as
fc50: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
fc60: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
fc70: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 6e 43 6f  xpr->iColumn<nCo
fc80: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  l );.        if(
fc90: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   zName ){.      
fca0: 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 73 71      *apColl = sq
fcb0: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
fcc0: 65 71 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  eq(pParse, zName
fcd0: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
fce0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
fcf0: 2a 61 70 43 6f 6c 6c 20 3d 20 61 43 6f 70 79 5b  *apColl = aCopy[
fd00: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b  pExpr->iColumn];
fd10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
fd20: 20 20 20 2a 70 53 6f 72 74 4f 72 64 65 72 20 3d     *pSortOrder =
fd30: 20 70 4f 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64   pOTerm->sortOrd
fd40: 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  er;.      }.    
fd50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
fd60: 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20  ghtmost==p );.  
fd70: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
fd80: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3e 3d  ddrOpenEphm[2]>=
fd90: 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  0 );.      addr 
fda0: 3d 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  = p->addrOpenEph
fdb0: 6d 5b 32 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  m[2];.      sqli
fdc0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
fdd0: 76 2c 20 61 64 64 72 2c 20 70 2d 3e 70 45 4c 69  v, addr, p->pELi
fde0: 73 74 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20  st->nExpr+2);.  
fdf0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46      pKeyInfo->nF
fe00: 69 65 6c 64 20 3d 20 6e 4f 72 64 65 72 42 79 45  ield = nOrderByE
fe10: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
fe20: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
fe30: 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70  , addr, (char*)p
fe40: 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49  KeyInfo, P3_KEYI
fe50: 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
fe60: 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 30      pKeyInfo = 0
fe70: 3b 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74 65  ;.      generate
fe80: 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c  SortTail(pParse,
fe90: 20 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74   p, v, p->pEList
fea0: 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20  ->nExpr, eDest, 
feb0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20  iParm);.    }.. 
fec0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b     sqliteFree(pK
fed0: 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75  eyInfo);.  }..mu
fee0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a  lti_select_end:.
fef0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
ff00: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ff10: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
ff20: 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  LECT */..#ifndef
ff30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
ff40: 57 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72  W./*.** Scan thr
ff50: 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73  ough the express
ff60: 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c  ion pExpr.  Repl
ff70: 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65  ace every refere
ff80: 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75  nce to.** a colu
ff90: 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62  mn in table numb
ffa0: 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61  er iTable with a
ffb0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f   copy of the iCo
ffc0: 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79  lumn-th.** entry
ffd0: 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75   in pEList.  (Bu
ffe0: 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63  t leave referenc
fff0: 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20  es to the ROWID 
10000 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61  column .** uncha
10010 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69  nged.).**.** Thi
10020 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
10030 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e  t of the flatten
10040 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20  ing procedure.  
10050 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68  A subquery.** wh
10060 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  ose result set i
10070 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c  s defined by pEL
10080 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65  ist appears as e
10090 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46  ntry in the.** F
100a0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
100b0 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74  SELECT such that
100c0 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   the VDBE cursor
100d0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61   assigned to tha
100e0 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65  t.** FORM clause
100f0 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65   entry is iTable
10100 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
10110 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61  make the necessa
10120 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ry .** changes t
10130 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  o pExpr so that 
10140 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  it refers direct
10150 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  ly to the source
10160 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65   table.** of the
10170 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72   subquery rather
10180 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
10190 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
101a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
101b0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78  substExprList(Ex
101c0 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72  prList*,int,Expr
101d0 4c 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77  List*);  /* Forw
101e0 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74  ard Decl */.stat
101f0 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
10200 65 63 74 28 53 65 6c 65 63 74 20 2a 2c 20 69 6e  ect(Select *, in
10210 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 20  t, ExprList *); 
10220 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c   /* Forward Decl
10230 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
10240 73 75 62 73 74 45 78 70 72 28 45 78 70 72 20 2a  substExpr(Expr *
10250 70 45 78 70 72 2c 20 69 6e 74 20 69 54 61 62 6c  pExpr, int iTabl
10260 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  e, ExprList *pEL
10270 69 73 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70  ist){.  if( pExp
10280 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
10290 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
102a0 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
102b0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  pr->iTable==iTab
102c0 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  le ){.    if( pE
102d0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
102e0 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  {.      pExpr->o
102f0 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
10300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
10310 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  pr *pNew;.      
10320 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
10330 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  0 && pExpr->iCol
10340 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  umn<pEList->nExp
10350 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
10360 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
10370 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
10380 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  ght==0 && pExpr-
10390 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20  >pList==0 );.   
103a0 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74     pNew = pEList
103b0 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ->a[pExpr->iColu
103c0 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  mn].pExpr;.     
103d0 20 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30   assert( pNew!=0
103e0 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
103f0 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a  >op = pNew->op;.
10400 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
10410 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b  xpr->pLeft==0 );
10420 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  .      pExpr->pL
10430 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
10440 72 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74  rDup(pNew->pLeft
10450 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10460 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
10470 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
10480 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74  ->pRight = sqlit
10490 65 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e  e3ExprDup(pNew->
104a0 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61  pRight);.      a
104b0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
104c0 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
104d0 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73  pExpr->pList = s
104e0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
104f0 70 28 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a  p(pNew->pList);.
10500 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
10510 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62  ble = pNew->iTab
10520 6c 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  le;.      pExpr-
10530 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d  >iColumn = pNew-
10540 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
10550 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e  pExpr->iAgg = pN
10560 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20  ew->iAgg;.      
10570 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
10580 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20  (&pExpr->token, 
10590 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  &pNew->token);. 
105a0 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65       sqlite3Toke
105b0 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 73 70  nCopy(&pExpr->sp
105c0 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29  an, &pNew->span)
105d0 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
105e0 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
105f0 53 65 6c 65 63 74 44 75 70 28 70 4e 65 77 2d 3e  SelectDup(pNew->
10600 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
10610 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70  pExpr->flags = p
10620 4e 65 77 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  New->flags;.    
10630 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
10640 75 62 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e  ubstExpr(pExpr->
10650 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
10660 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
10670 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 52 69  tExpr(pExpr->pRi
10680 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ght, iTable, pEL
10690 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 53  ist);.    substS
106a0 65 6c 65 63 74 28 70 45 78 70 72 2d 3e 70 53 65  elect(pExpr->pSe
106b0 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  lect, iTable, pE
106c0 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
106d0 45 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e  ExprList(pExpr->
106e0 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  pList, iTable, p
106f0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
10700 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
10710 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
10720 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69 54 61   *pList, int iTa
10730 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  ble, ExprList *p
10740 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  EList){.  int i;
10750 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
10760 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
10770 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
10780 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
10790 75 62 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e  ubstExpr(pList->
107a0 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
107b0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
107c0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
107d0 75 62 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63  ubstSelect(Selec
107e0 74 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  t *p, int iTable
107f0 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
10800 73 74 29 7b 0a 20 20 69 66 28 20 21 70 20 29 20  st){.  if( !p ) 
10810 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45  return;.  substE
10820 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73  xprList(p->pELis
10830 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
10840 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
10850 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  ist(p->pGroupBy,
10860 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
10870 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
10880 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  t(p->pOrderBy, i
10890 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
108a0 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
108b0 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20  Having, iTable, 
108c0 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
108d0 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
108e0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
108f0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
10900 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10910 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 6e  T_VIEW) */..#ifn
10920 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10930 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  VIEW./*.** This 
10940 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
10950 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71   to flatten subq
10960 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20  ueries in order 
10970 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63  to speed.** exec
10980 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72  ution.  It retur
10990 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
109a0 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
109b0 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a  f no flattening.
109c0 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ** occurs..**.**
109d0 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74   To understand t
109e0 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c  he concept of fl
109f0 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64  attening, consid
10a00 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
10a10 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  .** query:.**.**
10a20 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
10a30 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41  OM (SELECT x+y A
10a40 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
10a50 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61  E z<100) WHERE a
10a60 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  >5.**.** The def
10a70 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c  ault way of impl
10a80 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75  ementing this qu
10a90 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74  ery is to execut
10aa0 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72  e the.** subquer
10ab0 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72  y first and stor
10ac0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
10ad0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
10ae0 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20  le, then.** run 
10af0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
10b00 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72  on that temporar
10b10 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  y table.  This r
10b20 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70  equires two.** p
10b30 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64  asses over the d
10b40 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72  ata.  Furthermor
10b50 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74  e, because the t
10b60 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a  emporary table.*
10b70 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73  * has no indices
10b80 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  , the WHERE clau
10b90 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20  se on the outer 
10ba0 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a  query cannot be.
10bb0 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a  ** optimized..**
10bc0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10bd0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77   attempts to rew
10be0 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63  rite queries suc
10bf0 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69  h as the above i
10c00 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
10c10 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b  flat select, lik
10c20 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
10c30 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20    SELECT x+y AS 
10c40 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
10c50 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a  z<100 AND a>5.**
10c60 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
10c70 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20  erated for this 
10c80 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69  simpification gi
10c90 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73  ves the same res
10ca0 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20  ult.** but only 
10cb0 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20  has to scan the 
10cc0 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20  data once.  And 
10cd0 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20  because indices 
10ce0 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20  might .** exist 
10cf0 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c  on the table t1,
10d00 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e   a complete scan
10d10 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67   of the data mig
10d20 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64  ht be.** avoided
10d30 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69  ..**.** Flatteni
10d40 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d  ng is only attem
10d50 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74  pted if all of t
10d60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
10d70 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28   true:.**.**   (
10d80 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
10d90 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
10da0 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
10db0 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e   use aggregates.
10dc0 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68  .**.**   (2)  Th
10dd0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
10de0 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
10df0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
10e00 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
10e10 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68  .**.**   (3)  Th
10e20 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
10e30 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  t the right oper
10e40 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
10e50 74 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20  ter join, or.** 
10e60 20 20 20 20 20 20 20 74 68 65 20 73 75 62 71 75         the subqu
10e70 65 72 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c  ery is not itsel
10e80 66 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b  f a join.  (Tick
10e90 65 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20  et #306).**.**  
10ea0 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
10eb0 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
10ec0 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
10ed0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
10ee0 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29  oin..**.**   (5)
10ef0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
10f00 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f  s not DISTINCT o
10f10 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
10f20 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
10f30 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
10f40 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29  tes..**.**   (6)
10f50 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
10f60 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
10f70 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
10f80 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
10f90 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
10fa0 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
10fb0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68    The subquery h
10fc0 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  as a FROM clause
10fd0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54  ..**.**   (8)  T
10fe0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
10ff0 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
11000 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
11010 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
11020 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68  .**.**   (9)  Th
11030 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
11040 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
11050 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11060 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
11070 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
11080 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20  es..**.**  (10) 
11090 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
110a0 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
110b0 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
110c0 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
110d0 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20  t.**        use 
110e0 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  LIMIT..**.**  (1
110f0 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
11100 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
11110 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
11120 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63   have ORDER BY c
11130 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  lauses..**.**  (
11140 31 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  12)  The subquer
11150 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  y is not the rig
11160 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
11170 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20  T OUTER JOIN or 
11180 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  the.**        su
11190 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
111a0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 28 61 64  ERE clause.  (ad
111b0 64 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  ded by ticket #3
111c0 35 30 29 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20  50).**.**  (13) 
111d0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
111e0 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  d outer query do
111f0 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49   not both use LI
11200 4d 49 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20  MIT.**.**  (14) 
11210 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
11220 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45  es not use OFFSE
11230 54 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  T.**.** In this 
11240 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
11250 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
11260 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
11270 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
11280 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
11290 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
112a0 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
112b0 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
112c0 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
112d0 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75  egates and subqu
112e0 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65  eryIsAgg is true
112f0 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
11300 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
11310 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
11320 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
11330 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
11340 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
11350 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
11360 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
11370 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
11380 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
11390 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
113a0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
113b0 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
113c0 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
113d0 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
113e0 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
113f0 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
11400 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
11410 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
11420 53 75 62 71 75 65 72 79 28 0a 20 20 53 65 6c 65  Subquery(.  Sele
11430 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
11440 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
11450 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73  r outer SELECT s
11460 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
11470 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
11480 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
11490 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74  ->pSrc->a[] of t
114a0 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72  he inner subquer
114b0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  y */.  int isAgg
114c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
114d0 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c  rue if outer SEL
114e0 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61  ECT uses aggrega
114f0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
11500 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73    int subqueryIs
11510 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69  Agg    /* True i
11520 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
11530 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
11540 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  nctions */.){.  
11550 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
11560 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
11570 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
11580 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ery" */.  SrcLis
11590 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  t *pSrc;      /*
115a0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
115b0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
115c0 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
115d0 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20   *pSubSrc;   /* 
115e0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
115f0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
11600 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
11610 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
11620 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
11630 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
11640 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
11650 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63         /* VDBE c
11660 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
11670 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20  the pSub result 
11680 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  set temp table *
11690 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
116a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
116b0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70  counter */.  Exp
116c0 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
116e0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
116f0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
11700 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62  cList_item *pSub
11710 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73  item;   /* The s
11720 75 62 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a  ubquery */..  /*
11730 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
11740 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
11750 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72  ermitted.  Retur
11760 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f  n 0 if not..  */
11770 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
11780 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
11790 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
117a0 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
117b0 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
117c0 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
117d0 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
117e0 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 70 53 75 62  a[iFrom];.  pSub
117f0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
11800 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20  lect;.  assert( 
11810 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSub!=0 );.  if(
11820 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65   isAgg && subque
11830 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e  ryIsAgg ) return
11840 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
11850 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
11860 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28  on (1)  */.  if(
11870 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26   subqueryIsAgg &
11880 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  & pSrc->nSrc>1 )
11890 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
118a0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
118b0 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75  on (2)  */.  pSu
118c0 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
118d0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  c;.  assert( pSu
118e0 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69  bSrc );.  /* Pri
118f0 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e  or to version 3.
11900 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20  1.2, when LIMIT 
11910 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74  and OFFSET had t
11920 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73  o be simple cons
11930 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20  tants,.  ** not 
11940 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
11950 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77  ssions, we allow
11960 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e  ed some combinin
11970 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f  g of LIMIT and O
11980 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75  FFSET.  ** becau
11990 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65  se they could be
119a0 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d   computed at com
119b0 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20  pile-time.  But 
119c0 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
119d0 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d  FFSET.  ** becam
119e0 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  e arbitrary expr
119f0 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65  essions, we were
11a00 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72   forced to add r
11a10 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29  estrictions (13)
11a20 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20  .  ** and (14). 
11a30 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
11a40 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d  Limit && p->pLim
11a50 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
11a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11a70 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20  estriction (13) 
11a80 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
11a90 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20  Offset ) return 
11aa0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11ac0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20  estriction (14) 
11ad0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 53 72 63  */.  if( pSubSrc
11ae0 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ->nSrc==0 ) retu
11af0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
11b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11b10 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20  estriction (7)  
11b20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e  */.  if( (pSub->
11b30 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53  isDistinct || pS
11b40 75 62 2d 3e 70 4c 69 6d 69 74 29 20 0a 20 20 20  ub->pLimit) .   
11b50 20 20 20 20 20 20 26 26 20 28 70 53 72 63 2d 3e        && (pSrc->
11b60 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29  nSrc>1 || isAgg)
11b70 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   ){          /* 
11b80 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29  Restrictions (4)
11b90 28 35 29 28 38 29 28 39 29 20 2a 2f 0a 20 20 20  (5)(8)(9) */.   
11ba0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
11bb0 20 20 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e    .  }.  if( p->
11bc0 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 73 75  isDistinct && su
11bd0 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65  bqueryIsAgg ) re
11be0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
11bf0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
11c00 36 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  6)  */.  if( (p-
11c10 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79  >disallowOrderBy
11c20 20 7c 7c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29   || p->pOrderBy)
11c30 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
11c40 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  By ){.     retur
11c50 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
11c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11c80 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
11c90 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  1) */.  }..  /* 
11ca0 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20  Restriction 3:  
11cb0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
11cc0 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20  is a join, make 
11cd0 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
11ce0 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75  y is .  ** not u
11cf0 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74  sed as the right
11d00 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f   operand of an o
11d10 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d  uter join.  Exam
11d20 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
11d30 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c  .  ** is not all
11d40 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
11d50 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
11d60 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a  OUTER JOIN (t2 J
11d70 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a  OIN t3).  **.  *
11d80 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
11d90 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
11da0 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
11db0 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
11dc0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
11dd0 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20  ) JOIN t3.  **. 
11de0 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74   ** which is not
11df0 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65   at all the same
11e00 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69   thing..  */.  i
11e10 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
11e20 3e 31 20 26 26 20 69 46 72 6f 6d 3e 30 20 26 26  >1 && iFrom>0 &&
11e30 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d   (pSrc->a[iFrom-
11e40 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  1].jointype & JT
11e50 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20  _OUTER)!=0 ){.  
11e60 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
11e70 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
11e80 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75  n 12:  If the su
11e90 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
11ea0 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
11eb0 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a   left outer.  **
11ec0 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
11ed0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
11ee0 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
11ef0 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70  e..  ** An examp
11f00 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20  les of why this 
11f10 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
11f20 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
11f30 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
11f40 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  JOIN (SELECT * F
11f50 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e  ROM t2 WHERE t2.
11f60 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  x>0).  **.  ** I
11f70 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
11f80 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
11f90 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
11fa0 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
11fb0 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57  OUTER JOIN t2) W
11fc0 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a  HERE t2.x>0.  **
11fd0 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32  .  ** But the t2
11fe0 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61  .x>0 test will a
11ff0 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20  lways fail on a 
12000 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20  NULL row of t2, 
12010 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63  which.  ** effec
12020 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20  tively converts 
12030 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69  the OUTER JOIN i
12040 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49  nto an INNER JOI
12050 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 46  N..  */.  if( iF
12060 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e  rom>0 && (pSrc->
12070 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74  a[iFrom-1].joint
12080 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
12090 3d 30 20 0a 20 20 20 20 20 20 26 26 20 70 53 75  =0 .      && pSu
120a0 62 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a  b->pWhere!=0 ){.
120b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
120c0 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  }..  /* If we re
120d0 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
120e0 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e  it means flatten
120f0 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
12100 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46   for the.  ** iF
12110 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
12120 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
12130 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
12140 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d  ry..  */..  /* M
12150 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46  ove all of the F
12160 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  ROM elements of 
12170 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
12180 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46  o the.  ** the F
12190 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
121a0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
121b0 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69  Before doing thi
121c0 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a  s, remember.  **
121d0 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
121e0 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69  er for the origi
121f0 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20  nal outer query 
12200 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a  FROM element in.
12210 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54    ** iParent.  T
12220 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f  he iParent curso
12230 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  r will never be 
12240 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e  used.  Subsequen
12250 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c  t code.  ** will
12260 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e   scan expression
12270 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50  s looking for iP
12280 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73  arent references
12290 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a   and replace.  *
122a0 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63  * those referenc
122b0 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69  es with expressi
122c0 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65  ons that resolve
122d0 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79   to the subquery
122e0 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65   FROM.  ** eleme
122f0 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63  nts we are now c
12300 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a  opying in..  */.
12310 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
12320 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
12330 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53   {.    int nSubS
12340 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
12350 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e  rc;.    int join
12360 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
12370 3e 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20 20  >jointype;..    
12380 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
12390 6c 65 28 30 2c 20 70 53 75 62 69 74 65 6d 2d 3e  le(0, pSubitem->
123a0 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
123b0 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e  eFree(pSubitem->
123c0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
123d0 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62 69  sqliteFree(pSubi
123e0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
123f0 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62   sqliteFree(pSub
12400 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  item->zAlias);. 
12410 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
12420 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
12430 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20  tra = nSubSrc - 
12440 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  1;.      for(i=1
12450 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
12460 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 20  ){.        pSrc 
12470 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
12480 41 70 70 65 6e 64 28 70 53 72 63 2c 20 30 2c 20  Append(pSrc, 0, 
12490 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
124a0 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
124b0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53  ;.      for(i=pS
124c0 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78  rc->nSrc-1; i-ex
124d0 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29  tra>=iFrom; i--)
124e0 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e  {.        pSrc->
124f0 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69  a[i] = pSrc->a[i
12500 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d  -extra];.      }
12510 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
12520 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =0; i<nSubSrc; i
12530 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d  ++){.      pSrc-
12540 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
12550 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
12560 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53     memset(&pSubS
12570 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a  rc->a[i], 0, siz
12580 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69  eof(pSubSrc->a[i
12590 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ]));.    }.    p
125a0 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e 53 75  Src->a[iFrom+nSu
125b0 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  bSrc-1].jointype
125c0 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d   = jointype;.  }
125d0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e  ..  /* Now begin
125e0 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75   substituting su
125f0 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65  bquery result se
12600 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  t expressions fo
12610 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  r .  ** referenc
12620 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
12630 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
12640 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a  uery..  ** .  **
12650 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
12660 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
12670 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
12680 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
12690 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
126a0 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a   WHERE a>b;.  **
126b0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
126c0 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
126d0 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
126e0 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
126f0 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20        /.  **    
12700 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
12710 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
12720 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
12730 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
12740 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  _/.  **.  ** We 
12750 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
12760 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
12770 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
12780 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
12790 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65 20 73  ee.  ** "a" we s
127a0 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20  ubstitute "x*3" 
127b0 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
127c0 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75  we see "b" we su
127d0 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e  bstitute "y+10".
127e0 0a 20 20 2a 2f 0a 20 20 70 4c 69 73 74 20 3d 20  .  */.  pList = 
127f0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72  p->pEList;.  for
12800 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
12810 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
12820 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20  Expr *pExpr;.   
12830 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
12840 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45  .zName==0 && (pE
12850 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
12860 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a  ].pExpr)->span.z
12870 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69  !=0 ){.      pLi
12880 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
12890 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28   sqliteStrNDup((
128a0 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 73 70 61  char*)pExpr->spa
128b0 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e  n.z, pExpr->span
128c0 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  .n);.    }.  }. 
128d0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
128e0 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
128f0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
12900 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  ;.  if( isAgg ){
12910 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
12920 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  st(p->pGroupBy, 
12930 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
12940 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
12950 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
12960 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
12970 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  >pEList);.  }.  
12980 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
12990 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  By ){.    assert
129a0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
129b0 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65   );.    p->pOrde
129c0 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
129d0 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e  erBy;.    pSub->
129e0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
129f0 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f 72  }else if( p->pOr
12a00 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 75 62  derBy ){.    sub
12a10 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  stExprList(p->pO
12a20 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c  rderBy, iParent,
12a30 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
12a40 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e    }.  if( pSub->
12a50 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57  pWhere ){.    pW
12a60 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
12a70 70 72 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65  prDup(pSub->pWhe
12a80 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  re);.  }else{.  
12a90 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
12aa0 7d 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  }.  if( subquery
12ab0 49 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73  IsAgg ){.    ass
12ac0 65 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d  ert( p->pHaving=
12ad0 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  =0 );.    p->pHa
12ae0 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65  ving = p->pWhere
12af0 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
12b00 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75  = pWhere;.    su
12b10 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69  bstExpr(p->pHavi
12b20 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
12b30 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
12b40 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c  p->pHaving = sql
12b50 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70  ite3ExprAnd(p->p
12b60 48 61 76 69 6e 67 2c 20 73 71 6c 69 74 65 33 45  Having, sqlite3E
12b70 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70 48 61  xprDup(pSub->pHa
12b80 76 69 6e 67 29 29 3b 0a 20 20 20 20 61 73 73 65  ving));.    asse
12b90 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  rt( p->pGroupBy=
12ba0 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72  =0 );.    p->pGr
12bb0 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
12bc0 78 70 72 4c 69 73 74 44 75 70 28 70 53 75 62 2d  xprListDup(pSub-
12bd0 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65  >pGroupBy);.  }e
12be0 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78  lse{.    substEx
12bf0 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69 50  pr(p->pWhere, iP
12c00 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
12c10 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68  ist);.    p->pWh
12c20 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
12c30 72 41 6e 64 28 70 2d 3e 70 57 68 65 72 65 2c 20  rAnd(p->pWhere, 
12c40 70 57 68 65 72 65 29 3b 0a 20 20 7d 0a 0a 20 20  pWhere);.  }..  
12c50 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64  /* The flattened
12c60 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
12c70 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65  ct if either the
12c80 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20   inner or the.  
12c90 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
12ca0 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 2a  s distinct. .  *
12cb0 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  /.  p->isDistinc
12cc0 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
12cd0 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73  t || pSub->isDis
12ce0 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  tinct;..  /*.  *
12cf0 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
12d00 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
12d10 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
12d20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
12d30 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 65 20  ;.  **.  ** One 
12d40 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72  is tempted to tr
12d50 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62  y to add a and b
12d60 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
12d70 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69  limits.  But thi
12d80 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  s.  ** does not 
12d90 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c  work if either l
12da0 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
12db0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
12dc0 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
12dd0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75   p->pLimit = pSu
12de0 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70  b->pLimit;.    p
12df0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  Sub->pLimit = 0;
12e00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61  .  }..  /* Finia
12e10 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74  lly, delete what
12e20 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20   is left of the 
12e30 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74  subquery and ret
12e40 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  urn.  ** success
12e50 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
12e60 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75  SelectDelete(pSu
12e70 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  b);.  return 1;.
12e80 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12e90 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
12ea0 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
12eb0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
12ec0 65 6e 74 20 70 61 73 73 65 64 20 69 6e 20 61 73  ent passed in as
12ed0 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   an argument to 
12ee0 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  see if it.** is 
12ef0 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f  a simple min() o
12f00 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20  r max() query.  
12f10 49 66 20 69 74 20 69 73 20 61 6e 64 20 74 68 69  If it is and thi
12f20 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a  s query can be.*
12f30 2a 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e  * satisfied usin
12f40 67 20 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20  g a single seek 
12f50 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
12f60 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e   or end of an in
12f70 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e  dex,.** then gen
12f80 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 66  erate the code f
12f90 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 61  or this SELECT a
12fa0 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66  nd return 1.  If
12fb0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a   this is not a .
12fc0 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20  ** simple min() 
12fd0 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20  or max() query, 
12fe0 74 68 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a  then return 0;.*
12ff0 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69  *.** A simply mi
13000 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
13010 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  ry looks like th
13020 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
13030 45 43 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20  ECT min(a) FROM 
13040 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c  table;.**    SEL
13050 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20  ECT max(a) FROM 
13060 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  table;.**.** The
13070 20 71 75 65 72 79 20 6d 61 79 20 68 61 76 65 20   query may have 
13080 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
13090 62 6c 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ble in its FROM 
130a0 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65  argument.  There
130b0 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52  .** can be no GR
130c0 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47  OUP BY or HAVING
130d0 20 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65   or WHERE clause
130e0 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 73  s.  The result s
130f0 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68  et must.** be th
13100 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
13110 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   of a single col
13120 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
13130 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  .  The column.**
13140 20 69 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   in the min() or
13150 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20   max() function 
13160 6d 75 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e  must be indexed.
13170 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d  .**.** The param
13180 65 74 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f  eters to this ro
13190 75 74 69 6e 65 20 61 72 65 20 74 68 65 20 73 61  utine are the sa
131a0 6d 65 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65  me as for sqlite
131b0 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65  3Select()..** Se
131c0 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
131d0 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75  ment on that rou
131e0 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
131f0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
13200 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
13210 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79  impleMinMaxQuery
13220 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13230 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65  Select *p, int e
13240 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
13250 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  {.  Expr *pExpr;
13260 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54  .  int iCol;.  T
13270 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
13280 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
13290 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20 2a 76   base;.  Vdbe *v
132a0 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a  ;.  int seekOp;.
132b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
132c0 73 74 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69 73  st, *pList, eLis
132d0 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  t;.  struct Expr
132e0 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49  List_item eListI
132f0 74 65 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  tem;.  SrcList *
13300 70 53 72 63 3b 0a 20 20 69 6e 74 20 62 72 6b 3b  pSrc;.  int brk;
13310 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 2f  .  int iDb;..  /
13320 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
13330 66 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  f this query is 
13340 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f  a simple min() o
13350 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20  r max() query.  
13360 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f  Return.  ** zero
13370 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a   if it is  not..
13380 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47    */.  if( p->pG
13390 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61  roupBy || p->pHa
133a0 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72  ving || p->pWher
133b0 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  e ) return 0;.  
133c0 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
133d0 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
133e0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
133f0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
13400 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69  List;.  if( pELi
13410 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
13420 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72  eturn 0;.  pExpr
13430 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e   = pEList->a[0].
13440 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
13450 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
13460 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
13470 20 30 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 45   0;.  pList = pE
13480 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66  xpr->pList;.  if
13490 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c  ( pList==0 || pL
134a0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
134b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
134c0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  pExpr->token.n!=
134d0 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  3 ) return 0;.  
134e0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
134f0 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78 70 72  Cmp((char*)pExpr
13500 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c  ->token.z,"min",
13510 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65  3)==0 ){.    see
13520 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b  kOp = OP_Rewind;
13530 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
13540 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
13550 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
13560 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29  .z,"max",3)==0 )
13570 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f  {.    seekOp = O
13580 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b  P_Last;.  }else{
13590 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
135a0 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 70 4c 69   }.  pExpr = pLi
135b0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
135c0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
135d0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
135e0 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20  urn 0;.  iCol = 
135f0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
13600 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61    pTab = pSrc->a
13610 5b 30 5d 2e 70 54 61 62 3b 0a 0a 0a 20 20 2f 2a  [0].pTab;...  /*
13620 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 68 65   If we get to he
13630 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  re, it means the
13640 20 71 75 65 72 79 20 69 73 20 6f 66 20 74 68 65   query is of the
13650 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20   correct form.. 
13660 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   ** Check to mak
13670 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
13680 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65  n index and make
13690 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20 74   pIdx point to t
136a0 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72 69  he.  ** appropri
136b0 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20 74  ate index.  If t
136c0 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
136d0 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47  ) is on an INTEG
136e0 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20  ER PRIMARY.  ** 
136f0 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69  key column, no i
13700 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73 61 72  ndex is necessar
13710 79 20 73 6f 20 73 65 74 20 70 49 64 78 20 74 6f  y so set pIdx to
13720 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20   NULL.  If no.  
13730 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78 20  ** usable index 
13740 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  is found, return
13750 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69   0..  */.  if( i
13760 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49 64  Col<0 ){.    pId
13770 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  x = 0;.  }else{.
13780 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
13790 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
137a0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
137b0 70 45 78 70 72 29 3b 0a 20 20 20 20 66 6f 72 28  pExpr);.    for(
137c0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
137d0 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
137e0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
137f0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
13800 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20  nColumn>=1 );.  
13810 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
13820 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20  Column[0]==iCol 
13830 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d  && .          0=
13840 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
13850 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c  pIdx->azColl[0],
13860 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 20 29   pColl->zName) )
13870 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
13880 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13890 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29     if( pIdx==0 )
138a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
138b0 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f    /* Identify co
138c0 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20 77 65  lumn types if we
138d0 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74   will be using t
138e0 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68  he callback.  Th
138f0 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20  is.  ** step is 
13900 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f  skipped if the o
13910 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
13920 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d  o a table or a m
13930 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a  emory cell..  **
13940 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
13950 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
13960 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20 69 6e  een generated in
13970 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
13980 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20  ction..  */.  v 
13990 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
139a0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
139b0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) return 0;
139c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
139d0 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
139e0 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
139f0 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
13a00 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
13a10 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  if( eDest==SRT_E
13a20 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
13a30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13a40 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
13a50 72 61 6c 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ral, iParm, 1);.
13a60 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
13a70 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e  ting code to fin
13a80 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65  d the min or the
13a90 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79   max.  Basically
13aa0 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a   all we have.  *
13ab0 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20  * to do is find 
13ac0 74 68 65 20 66 69 72 73 74 20 6f 72 20 74 68 65  the first or the
13ad0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
13ae0 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e  he chosen index.
13af0 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69    If.  ** the mi
13b00 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20  n() or max() is 
13b10 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  on the INTEGER P
13b20 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e  RIMARY KEY, then
13b30 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a   find the first.
13b40 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74    ** or last ent
13b50 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74  ry in the main t
13b60 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 44 62  able..  */.  iDb
13b70 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
13b80 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
13b90 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
13ba0 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  a);.  assert( iD
13bb0 62 3e 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 69 73  b>=0 || pTab->is
13bc0 45 70 68 65 6d 20 29 3b 0a 20 20 73 71 6c 69 74  Ephem );.  sqlit
13bd0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
13be0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
13bf0 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c  .  sqlite3TableL
13c00 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
13c10 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
13c20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
13c30 62 61 73 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30  base = pSrc->a[0
13c40 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 62 72 6b  ].iCursor;.  brk
13c50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
13c60 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f  keLabel(v);.  co
13c70 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
13c80 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 62  ers(pParse, p, b
13c90 72 6b 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d  rk);.  if( pSrc-
13ca0 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d 30  >a[0].pSelect==0
13cb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
13cc0 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
13cd0 20 62 61 73 65 2c 20 69 44 62 2c 20 70 54 61 62   base, iDb, pTab
13ce0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
13cf0 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 3d 3d    }.  if( pIdx==
13d00 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
13d10 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65  VdbeAddOp(v, see
13d20 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  kOp, base, 0);. 
13d30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45   }else{.    /* E
13d40 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 63  ven though the c
13d50 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 6f 70  ursor used to op
13d60 65 6e 20 74 68 65 20 69 6e 64 65 78 20 68 65 72  en the index her
13d70 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
13d80 2a 2a 20 61 73 20 73 6f 6f 6e 20 61 73 20 61 20  ** as soon as a 
13d90 73 69 6e 67 6c 65 20 76 61 6c 75 65 20 68 61 73  single value has
13da0 20 62 65 65 6e 20 72 65 61 64 20 66 72 6f 6d 20   been read from 
13db0 69 74 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 0a  it, allocate it.
13dc0 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 28 70 50      ** using (pP
13dd0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 29 20 74 6f  arse->nTab++) to
13de0 20 70 72 65 76 65 6e 74 20 74 68 65 20 63 75 72   prevent the cur
13df0 73 6f 72 20 69 64 20 66 72 6f 6d 20 62 65 69 6e  sor id from bein
13e00 67 20 0a 20 20 20 20 2a 2a 20 72 65 75 73 65 64  g .    ** reused
13e10 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74  . This is import
13e20 61 6e 74 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  ant for statemen
13e30 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 0a  ts of the form .
13e40 20 20 20 20 2a 2a 20 22 49 4e 53 45 52 54 20 49      ** "INSERT I
13e50 4e 54 4f 20 78 20 53 45 4c 45 43 54 20 6d 61 78  NTO x SELECT max
13e60 28 29 20 46 52 4f 4d 20 78 22 2e 0a 20 20 20 20  () FROM x"..    
13e70 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 3b  */.    int iIdx;
13e80 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
13e90 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ey = sqlite3Inde
13ea0 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
13eb0 20 70 49 64 78 29 3b 0a 20 20 20 20 69 49 64 78   pIdx);.    iIdx
13ec0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
13ed0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  +;.    assert( p
13ee0 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  Idx->pSchema==pT
13ef0 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
13f00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13f10 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
13f20 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20  r, iDb, 0);.    
13f30 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
13f40 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
13f50 49 64 78 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Idx, pIdx->tnum,
13f60 20 0a 20 20 20 20 20 20 20 20 28 63 68 61 72 2a   .        (char*
13f70 29 70 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46  )pKey, P3_KEYINF
13f80 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
13f90 69 66 28 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52  if( seekOp==OP_R
13fa0 65 77 69 6e 64 20 29 7b 0a 20 20 20 20 20 20 73  ewind ){.      s
13fb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13fc0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
13fd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13fe0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13ff0 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30  MakeRecord, 1, 0
14000 29 3b 0a 20 20 20 20 20 20 73 65 65 6b 4f 70 20  );.      seekOp 
14010 3d 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20  = OP_MoveGt;.   
14020 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
14030 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f  beAddOp(v, seekO
14040 70 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20  p, iIdx, 0);.   
14050 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14060 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64  p(v, OP_IdxRowid
14070 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  , iIdx, 0);.    
14080 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14090 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
140a0 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  dx, 0);.    sqli
140b0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
140c0 4f 50 5f 4d 6f 76 65 47 65 2c 20 62 61 73 65 2c  OP_MoveGe, base,
140d0 20 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74   0);.  }.  eList
140e0 2e 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65  .nExpr = 1;.  me
140f0 6d 73 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c  mset(&eListItem,
14100 20 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74   0, sizeof(eList
14110 49 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e  Item));.  eList.
14120 61 20 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a  a = &eListItem;.
14130 20 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78    eList.a[0].pEx
14140 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 73 65  pr = pExpr;.  se
14150 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
14160 61 72 73 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c  arse, p, &eList,
14170 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44   0, 0, 0, -1, eD
14180 65 73 74 2c 20 69 50 61 72 6d 2c 20 62 72 6b 2c  est, iParm, brk,
14190 20 62 72 6b 2c 20 30 29 3b 0a 20 20 73 71 6c 69   brk, 0);.  sqli
141a0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
141b0 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 73  bel(v, brk);.  s
141c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
141d0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73  v, OP_Close, bas
141e0 65 2c 20 30 29 3b 0a 20 20 0a 20 20 72 65 74 75  e, 0);.  .  retu
141f0 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 1;.}../*.** A
14200 6e 61 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45 52  nalyze and ORDER
14210 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
14220 63 6c 61 75 73 65 20 69 6e 20 61 20 53 45 4c 45  clause in a SELE
14230 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52  CT statement.  R
14240 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
14250 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65  ber of errors se
14260 65 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f 52 44  en..**.** An ORD
14270 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
14280 59 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65  Y is a list of e
14290 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 49 66 20  xpressions.  If 
142a0 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  any expression.*
142b0 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  * is an integer 
142c0 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
142d0 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  hat expression i
142e0 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68  s replaced by th
142f0 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
14300 6e 67 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ng entry in the 
14310 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73  result set..*/.s
14320 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73  tatic int proces
14330 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 0a 20  sOrderGroupBy(. 
14340 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
14350 43 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  C,     /* Name c
14360 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20 53 45  ontext of the SE
14370 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
14380 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
14390 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 54 68  OrderBy,   /* Th
143a0 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  e ORDER BY or GR
143b0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f  OUP BY clause to
143c0 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f   be processed */
143d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
143e0 54 79 70 65 20 20 20 20 20 2f 2a 20 45 69 74 68  Type     /* Eith
143f0 65 72 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47  er "ORDER" or "G
14400 52 4f 55 50 22 2c 20 61 73 20 61 70 70 72 6f 70  ROUP", as approp
14410 72 69 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  riate */.){.  in
14420 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  t i;.  ExprList 
14430 2a 70 45 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  *pEList = pNC->p
14440 45 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 54 68  EList;     /* Th
14450 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
14460 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  the SELECT */.  
14470 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
14480 70 4e 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20  pNC->pParse;    
14490 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
144a0 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
144b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45   */.  assert( pE
144c0 4c 69 73 74 20 29 3b 0a 0a 20 20 69 66 28 20 70  List );..  if( p
144d0 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
144e0 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 0;.  for(i=0
144f0 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
14500 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  xpr; i++){.    i
14510 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70  nt iCol;.    Exp
14520 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79  r *pE = pOrderBy
14530 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
14540 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
14550 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26  rIsInteger(pE, &
14560 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69  iCol) ){.      i
14570 66 28 20 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f  f( iCol>0 && iCo
14580 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l<=pEList->nExpr
14590 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
145a0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45  te3ExprDelete(pE
145b0 29 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20  );.        pE = 
145c0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
145d0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
145e0 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b  prDup(pEList->a[
145f0 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a  iCol-1].pExpr);.
14600 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14610 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
14620 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
14630 20 20 20 20 20 20 20 20 20 22 25 73 20 42 59 20           "%s BY 
14640 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64  column number %d
14650 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20   out of range - 
14660 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20  should be ".    
14670 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20         "between 
14680 31 20 61 6e 64 20 25 64 22 2c 20 7a 54 79 70 65  1 and %d", zType
14690 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e  , iCol, pEList->
146a0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
146b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
146c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
146d0 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
146e0 76 65 4e 61 6d 65 73 28 70 4e 43 2c 20 70 45 29  veNames(pNC, pE)
146f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
14700 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
14710 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
14720 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14730 72 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e 61 6d  resolves any nam
14740 65 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 72  es used in the r
14750 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
14760 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 53 45 4c  .** supplied SEL
14770 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 49  ECT statement. I
14780 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
14790 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 73  tement being res
147a0 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20 73 75  olved.** is a su
147b0 62 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 70  b-select, then p
147c0 4f 75 74 65 72 4e 43 20 69 73 20 61 20 70 6f 69  OuterNC is a poi
147d0 6e 74 65 72 20 74 6f 20 74 68 65 20 4e 61 6d 65  nter to the Name
147e0 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66 20 74  Context .** of t
147f0 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54  he parent SELECT
14800 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14810 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 0a 20  SelectResolve(. 
14820 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14830 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
14840 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
14850 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
14860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14870 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
14880 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
14890 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
148a0 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 54 68  *pOuterNC  /* Th
148b0 65 20 6f 75 74 65 72 20 6e 61 6d 65 20 63 6f 6e  e outer name con
148c0 74 65 78 74 2e 20 4d 61 79 20 62 65 20 4e 55 4c  text. May be NUL
148d0 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  L. */.){.  ExprL
148e0 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
148f0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
14900 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  set. */.  int i;
14910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14920 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f 70       /* For-loop
14930 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20 69   variable used i
14940 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
14950 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  s */.  NameConte
14960 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20  xt sNC;         
14970 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65 2d    /* Local name-
14980 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
14990 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
149a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67          /* The g
149b0 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
149c0 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
149d0 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20  routine has run 
149e0 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 20 69  before, return i
149f0 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  mmediately. */. 
14a00 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c 76   if( p->isResolv
14a10 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
14a20 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a 20  ( !pOuterNC );. 
14a30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14a40 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 73  _OK;.  }.  p->is
14a50 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a 20  Resolved = 1;.. 
14a60 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61 76   /* If there hav
14a70 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65  e already been e
14a80 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69 6e  rrors, do nothin
14a90 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  g. */.  if( pPar
14aa0 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20  se->nErr>0 ){.  
14ab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14ac0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
14ad0 20 50 72 65 70 61 72 65 20 74 68 65 20 73 65 6c   Prepare the sel
14ae0 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ect statement. T
14af0 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c  his call will al
14b00 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  locate all curso
14b10 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  rs.  ** required
14b20 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 74   to handle the t
14b30 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71 75 65  ables and subque
14b40 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
14b50 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
14b60 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74  if( prepSelectSt
14b70 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  mt(pParse, p) ){
14b80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14b90 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
14ba0 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20   /* Resolve the 
14bb0 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
14bc0 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
14bd0 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 65  SET clauses. The
14be0 73 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20  se.  ** are not 
14bf0 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72  allowed to refer
14c00 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73   to any names, s
14c10 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20  o pass an empty 
14c20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 2a  NameContext..  *
14c30 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  /.  memset(&sNC,
14c40 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
14c50 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
14c60 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 73   pParse;.  if( s
14c70 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
14c80 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
14c90 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20  pLimit) ||.     
14ca0 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
14cb0 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
14cc0 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20  ->pOffset) ){.  
14cd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14ce0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
14cf0 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61   Set up the loca
14d00 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74  l name-context t
14d10 6f 20 70 61 73 73 20 74 6f 20 45 78 70 72 52 65  o pass to ExprRe
14d20 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 74 6f 0a  solveNames() to.
14d30 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 65    ** resolve the
14d40 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
14d50 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c  ..  */.  sNC.all
14d60 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 73 4e 43  owAgg = 1;.  sNC
14d70 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70  .pSrcList = p->p
14d80 53 72 63 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74  Src;.  sNC.pNext
14d90 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 0a 20 20   = pOuterNC;..  
14da0 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  /* Resolve names
14db0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
14dc0 65 74 2e 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  et. */.  pEList 
14dd0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
14de0 66 28 20 21 70 45 4c 69 73 74 20 29 20 72 65 74  f( !pEList ) ret
14df0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
14e00 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
14e10 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
14e20 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58  +){.    Expr *pX
14e30 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
14e40 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73  pExpr;.    if( s
14e50 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
14e60 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 58 29  eNames(&sNC, pX)
14e70 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
14e80 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
14e90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
14ea0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61  f there are no a
14eb0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
14ec0 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
14ed0 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f  -set, and no GRO
14ee0 55 50 20 42 59 20 0a 20 20 2a 2a 20 65 78 70 72  UP BY .  ** expr
14ef0 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61  ession, do not a
14f00 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65 73 20  llow aggregates 
14f10 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6f 74  in any of the ot
14f20 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  her expressions.
14f30 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
14f40 21 70 2d 3e 69 73 41 67 67 20 29 3b 0a 20 20 70  !p->isAgg );.  p
14f50 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
14f60 6f 75 70 42 79 3b 0a 20 20 69 66 28 20 70 47 72  oupBy;.  if( pGr
14f70 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61 73  oupBy || sNC.has
14f80 41 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73  Agg ){.    p->is
14f90 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Agg = 1;.  }else
14fa0 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41  {.    sNC.allowA
14fb0 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  gg = 0;.  }..  /
14fc0 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c  * If a HAVING cl
14fd0 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c  ause is present,
14fe0 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
14ff0 20 62 65 20 61 20 47 52 4f 55 50 20 42 59 20 63   be a GROUP BY c
15000 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  lause..  */.  if
15010 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20  ( p->pHaving && 
15020 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  !pGroupBy ){.   
15030 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15040 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55  (pParse, "a GROU
15050 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 72  P BY clause is r
15060 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 48  equired before H
15070 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 72 65 74  AVING");.    ret
15080 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
15090 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
150a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
150b0 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d  ist to the name-
150c0 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20 70  context before p
150d0 61 72 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  arsing the.  ** 
150e0 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
150f0 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
15100 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
15110 69 73 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20  is so that.  ** 
15120 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
15130 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
15140 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66 65 72  (etc.) can refer
15150 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20   to expressions 
15160 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65 73 20  by.  ** aliases 
15170 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
15180 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69 6e  t..  **.  ** Min
15190 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74 68 69  or point: If thi
151a0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
151b0 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
151c0 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  on will be.  ** 
151d0 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66 6f 72  re-evaluated for
151e0 20 65 61 63 68 20 72 65 66 65 72 65 6e 63 65 20   each reference 
151f0 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e  to it..  */.  sN
15200 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45  C.pEList = p->pE
15210 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71 6c 69  List;.  if( sqli
15220 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
15230 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68  mes(&sNC, p->pWh
15240 65 72 65 29 20 7c 7c 0a 20 20 20 20 20 20 73 71  ere) ||.      sq
15250 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
15260 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
15270 48 61 76 69 6e 67 29 20 7c 7c 0a 20 20 20 20 20  Having) ||.     
15280 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f   processOrderGro
15290 75 70 42 79 28 26 73 4e 43 2c 20 70 2d 3e 70 4f  upBy(&sNC, p->pO
152a0 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
152b0 20 7c 7c 0a 20 20 20 20 20 20 70 72 6f 63 65 73   ||.      proces
152c0 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26 73  sOrderGroupBy(&s
152d0 4e 43 2c 20 70 47 72 6f 75 70 42 79 2c 20 22 47  NC, pGroupBy, "G
152e0 52 4f 55 50 22 29 0a 20 20 29 7b 0a 20 20 20 20  ROUP").  ){.    
152f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
15300 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ROR;.  }..  /* M
15310 61 6b 65 20 73 75 72 65 20 74 68 65 20 47 52 4f  ake sure the GRO
15320 55 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65  UP BY clause doe
15330 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67  s not contain ag
15340 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
15350 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 47  s..  */.  if( pG
15360 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 74  roupBy ){.    st
15370 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
15380 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20  em *pItem;.  .  
15390 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
153a0 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c  =pGroupBy->a; i<
153b0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
153c0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
153d0 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
153e0 73 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d  sProperty(pItem-
153f0 3e 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20  >pExpr, EP_Agg) 
15400 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15410 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15420 65 2c 20 22 61 67 67 72 65 67 61 74 65 20 66 75  e, "aggregate fu
15430 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  nctions are not 
15440 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20  allowed in ".   
15450 20 20 20 20 20 20 20 20 20 22 74 68 65 20 47 52           "the GR
15460 4f 55 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b  OUP BY clause");
15470 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15480 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
15490 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
154a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
154b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
154c0 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
154d0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  e accumulator..*
154e0 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61  *.** The aggrega
154f0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69  te accumulator i
15500 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72  s a set of memor
15510 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c  y cells that hol
15520 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74  d.** intermediat
15530 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20  e results while 
15540 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61  calculating an a
15550 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a  ggregate.  This.
15560 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c  ** routine simpl
15570 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  y stores NULLs i
15580 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
15590 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  emory cells..*/.
155a0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65  static void rese
155b0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  tAccumulator(Par
155c0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
155d0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
155e0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
155f0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
15600 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
15610 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63  Info_func *pFunc
15620 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f  ;.  if( pAggInfo
15630 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f  ->nFunc+pAggInfo
15640 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a  ->nColumn==0 ){.
15650 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
15660 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
15670 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  gInfo->nColumn; 
15680 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
15690 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
156a0 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 41 67 67 49 6e  _MemNull, pAggIn
156b0 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
156c0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  , 0);.  }.  for(
156d0 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
156e0 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
156f0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
15700 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
15710 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15720 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c  Op(v, OP_MemNull
15730 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 2c 20 30  , pFunc->iMem, 0
15740 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  );.    if( pFunc
15750 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
15760 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
15770 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b   = pFunc->pExpr;
15780 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 70  .      if( pE->p
15790 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70  List==0 || pE->p
157a0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
157b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
157c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
157d0 2c 20 22 44 49 53 54 49 4e 43 54 20 69 6e 20 61  , "DISTINCT in a
157e0 67 67 72 65 67 61 74 65 20 6d 75 73 74 20 62 65  ggregate must be
157f0 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20 20 20 20   followed ".    
15800 20 20 20 20 20 20 20 22 62 79 20 61 6e 20 65 78         "by an ex
15810 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20  pression");.    
15820 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74      pFunc->iDist
15830 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
15840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15850 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
15860 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
15870 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
15880 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  pE->pList);.    
15890 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
158a0 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p3(v, OP_OpenEph
158b0 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69  emeral, pFunc->i
158c0 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 0a 20 20  Distinct, 0, .  
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158e0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
158f0 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49  KeyInfo, P3_KEYI
15900 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
15910 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15920 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
15930 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69  the OP_AggFinali
15940 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76  ze opcode for ev
15950 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75  ery aggregate fu
15960 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  nction.** in the
15970 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75   AggInfo structu
15980 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
15990 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75  id finalizeAggFu
159a0 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70  nctions(Parse *p
159b0 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
159c0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
159d0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
159e0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
159f0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
15a00 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28  func *pF;.  for(
15a10 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
15a20 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
15a30 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
15a40 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72   pF++){.    Expr
15a50 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
15a60 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  ->pExpr->pList;.
15a70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
15a80 70 33 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p3(v, OP_AggFina
15a90 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
15aa0 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
15ab0 72 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20  r : 0,.         
15ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
15ad0 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50  id*)pF->pFunc, P
15ae0 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a  3_FUNCDEF);.  }.
15af0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
15b00 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
15b10 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
15b20 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61   an aggregate ba
15b30 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
15b40 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
15b50 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
15b60 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75   void updateAccu
15b70 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
15b80 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
15b90 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
15ba0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
15bb0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
15bc0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
15bd0 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75  func *pF;.  stru
15be0 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
15bf0 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d  pC;..  pAggInfo-
15c00 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  >directMode = 1;
15c10 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
15c20 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
15c30 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
15c40 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
15c50 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20     int nArg;.   
15c60 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20   int addrNext = 
15c70 30 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  0;.    ExprList 
15c80 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78  *pList = pF->pEx
15c90 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69  pr->pList;.    i
15ca0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
15cb0 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e    nArg = pList->
15cc0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
15cd0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
15ce0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
15cf0 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  st);.    }else{.
15d00 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a        nArg = 0;.
15d10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
15d20 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
15d30 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  {.      addrNext
15d40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
15d50 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
15d60 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
15d70 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44  1 );.      codeD
15d80 69 73 74 69 6e 63 74 28 76 2c 20 70 46 2d 3e 69  istinct(v, pF->i
15d90 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65  Distinct, addrNe
15da0 78 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  xt, 1);.    }.  
15db0 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d    if( pF->pFunc-
15dc0 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a  >needCollSeq ){.
15dd0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
15de0 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
15df0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
15e00 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
15e10 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
15e20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
15e30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30   );  /* pList!=0
15e40 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e   if pF->pFunc->n
15e50 65 65 64 43 6f 6c 6c 53 65 71 20 69 73 20 74 72  eedCollSeq is tr
15e60 75 65 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  ue */.      for(
15e70 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  j=0, pItem=pList
15e80 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a  ->a; !pColl && j
15e90 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65  <nArg; j++, pIte
15ea0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43  m++){.        pC
15eb0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
15ec0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
15ed0 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
15ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15ef0 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
15f00 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72      pColl = pPar
15f10 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
15f20 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
15f30 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
15f40 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
15f50 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
15f60 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P3_COLLSEQ);
15f70 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15f80 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
15f90 41 67 67 53 74 65 70 2c 20 70 46 2d 3e 69 4d 65  AggStep, pF->iMe
15fa0 6d 2c 20 6e 41 72 67 2c 20 28 76 6f 69 64 2a 29  m, nArg, (void*)
15fb0 70 46 2d 3e 70 46 75 6e 63 2c 20 50 33 5f 46 55  pF->pFunc, P3_FU
15fc0 4e 43 44 45 46 29 3b 0a 20 20 20 20 69 66 28 20  NCDEF);.    if( 
15fd0 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20  addrNext ){.    
15fe0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
15ff0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
16000 72 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20  rNext);.    }.  
16010 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d  }.  for(i=0, pC=
16020 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20  pAggInfo->aCol; 
16030 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  i<pAggInfo->nAcc
16040 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70  umulator; i++, p
16050 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  C++){.    sqlite
16060 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
16070 2c 20 70 43 2d 3e 70 45 78 70 72 29 3b 0a 20 20  , pC->pExpr);.  
16080 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16090 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
160a0 65 2c 20 70 43 2d 3e 69 4d 65 6d 2c 20 31 29 3b  e, pC->iMem, 1);
160b0 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d  .  }.  pAggInfo-
160c0 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b  >directMode = 0;
160d0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
160e0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
160f0 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74   given SELECT st
16100 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
16110 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  he results are d
16120 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61  istributed in va
16130 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e  rious ways depen
16140 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76  ding on the.** v
16150 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e  alue of eDest an
16160 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  d iParm..**.**  
16170 20 20 20 65 44 65 73 74 20 56 61 6c 75 65 20 20     eDest Value  
16180 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20       Result.**  
16190 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20     ------------ 
161a0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
161b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
161c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
161d0 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61  *     SRT_Callba
161e0 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65  ck    Invoke the
161f0 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61   callback for ea
16200 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  ch row of the re
16210 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  sult..**.**     
16220 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20  SRT_Mem         
16230 53 74 6f 72 65 20 66 69 72 73 74 20 72 65 73 75  Store first resu
16240 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  lt in memory cel
16250 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  l iParm.**.**   
16260 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20    SRT_Set       
16270 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
16280 61 73 20 6b 65 79 73 20 6f 66 20 74 61 62 6c 65  as keys of table
16290 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20   iParm..**.**   
162a0 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20    SRT_Union     
162b0 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
162c0 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65  as a key in a te
162d0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
162e0 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  arm.**.**     SR
162f0 54 5f 45 78 63 65 70 74 20 20 20 20 20 20 52 65  T_Except      Re
16300 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f  move results fro
16310 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  m the temporary 
16320 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a  table iParm..**.
16330 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65  **     SRT_Table
16340 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
16350 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72  ults in temporar
16360 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a  y table iParm.**
16370 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61 62  .** The table ab
16380 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65 74  ove is incomplet
16390 65 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65  e.  Additional e
163a0 44 69 73 74 20 76 61 6c 75 65 20 68 61 76 65 20  Dist value have 
163b0 62 65 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e 63  be added.** sinc
163c0 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 77  e this comment w
163d0 61 73 20 77 72 69 74 74 65 6e 2e 20 20 53 65 65  as written.  See
163e0 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72   the selectInner
163f0 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e 20  Loop() function 
16400 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65 74  for.** a complet
16410 65 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65  e listing of the
16420 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   allowed values 
16430 6f 66 20 65 44 65 73 74 20 61 6e 64 20 74 68 65  of eDest and the
16440 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a  ir meanings..**.
16450 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16460 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
16470 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  er of errors.  I
16480 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
16490 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c  .** encountered,
164a0 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72   then an appropr
164b0 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  iate error messa
164c0 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a  ge is left in.**
164d0 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
164e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
164f0 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72  tine does NOT fr
16500 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74  ee the Select st
16510 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69  ructure passed i
16520 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  n.  The.** calli
16530 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64  ng function need
16540 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a  s to do that..**
16550 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c  .** The pParent,
16560 20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20   parentTab, and 
16570 2a 70 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c  *pParentAgg fiel
16580 64 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e  ds are filled in
16590 20 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45   if this.** SELE
165a0 43 54 20 69 73 20 61 20 73 75 62 71 75 65 72 79  CT is a subquery
165b0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
165c0 6d 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69  may try to combi
165d0 6e 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a  ne this SELECT.*
165e0 2a 20 77 69 74 68 20 69 74 73 20 70 61 72 65 6e  * with its paren
165f0 74 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67  t to form a sing
16600 6c 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20  le flat query.  
16610 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20  In so doing, it 
16620 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20  might.** change 
16630 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
16640 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72   from a non-aggr
16650 65 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72  egate to an aggr
16660 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20  egate query..** 
16670 46 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  For that reason,
16680 20 74 68 65 20 70 50 61 72 65 6e 74 41 67 67 20   the pParentAgg 
16690 66 6c 61 67 20 69 73 20 70 61 73 73 65 64 20 61  flag is passed a
166a0 73 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20  s a pointer, so 
166b0 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61  it.** can be cha
166c0 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  nged..**.** Exam
166d0 70 6c 65 20 31 3a 20 20 20 54 68 65 20 6d 65 61  ple 1:   The mea
166e0 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 50 61 72  ning of the pPar
166f0 65 6e 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ent parameter..*
16700 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
16710 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53   FROM t1 JOIN (S
16720 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a  ELECT x, count(*
16730 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20  ) FROM t2) JOIN 
16740 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20  t3;.**    \     
16750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16760 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65   \_______ subque
16770 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  ry _______/     
16780 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20     /.**     \   
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167c0 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f     /.**      \__
167d0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
167e0 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
167f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
16800 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  __/.**.** This r
16810 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
16820 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71   for the outer q
16830 75 65 72 79 20 66 69 72 73 74 2e 20 20 20 46 6f  uery first.   Fo
16840 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20  r that call,.** 
16850 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 62 65 20  pParent will be 
16860 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74 68  NULL.  During th
16870 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20  e processing of 
16880 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2c  the outer query,
16890 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e   this .** routin
168a0 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75  e is called recu
168b0 72 73 69 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c  rsively to handl
168c0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20  e the subquery. 
168d0 20 46 6f 72 20 74 68 65 20 72 65 63 75 72 73 69   For the recursi
168e0 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72  ve.** call, pPar
168f0 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74  ent will point t
16900 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
16910 79 2e 20 20 42 65 63 61 75 73 65 20 74 68 65 20  y.  Because the 
16920 73 75 62 71 75 65 72 79 20 69 73 0a 2a 2a 20 74  subquery is.** t
16930 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  he second elemen
16940 74 20 69 6e 20 61 20 74 68 72 65 65 2d 77 61 79  t in a three-way
16950 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72 65 6e   join, the paren
16960 74 54 61 62 20 70 61 72 61 6d 65 74 65 72 20 77  tTab parameter w
16970 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68 65  ill.** be 1 (the
16980 20 32 6e 64 20 76 61 6c 75 65 20 6f 66 20 61 20   2nd value of a 
16990 30 2d 69 6e 64 65 78 65 64 20 61 72 72 61 79 2e  0-indexed array.
169a0 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ).*/.int sqlite3
169b0 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
169c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
169d0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
169e0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
169f0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
16a00 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
16a10 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
16a20 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74   coded. */.  int
16a30 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20   eDest,         
16a40 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
16a50 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
16a60 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ults */.  int iP
16a70 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  arm,            
16a80 20 2f 2a 20 41 20 70 61 72 61 6d 65 74 65 72 20   /* A parameter 
16a90 75 73 65 64 20 62 79 20 74 68 65 20 65 44 65 73  used by the eDes
16aa0 74 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  t disposal metho
16ab0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  d */.  Select *p
16ac0 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a  Parent,       /*
16ad0 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
16ae0 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69  for which this i
16af0 73 20 61 20 73 75 62 2d 71 75 65 72 79 20 2a 2f  s a sub-query */
16b00 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54 61 62  .  int parentTab
16b10 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ,         /* Ind
16b20 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70  ex in pParent->p
16b30 53 72 63 20 6f 66 20 74 68 69 73 20 71 75 65 72  Src of this quer
16b40 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72  y */.  int *pPar
16b50 65 6e 74 41 67 67 2c 20 20 20 20 20 20 20 2f 2a  entAgg,       /*
16b60 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74   True if pParent
16b70 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
16b80 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63  functions */.  c
16b90 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20  har *aff        
16ba0 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73        /* If eDes
16bb0 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  t is SRT_Union, 
16bc0 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
16bd0 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
16be0 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
16bf0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
16c00 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ers */.  WhereIn
16c10 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
16c20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73  /* Return from s
16c30 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
16c40 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  () */.  Vdbe *v;
16c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16c60 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
16c70 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73  chine under cons
16c80 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
16c90 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20  t isAgg;        
16ca0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
16cb0 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
16cc0 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
16cd0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
16ce0 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist;      /* Lis
16cf0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
16d00 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72  extract. */.  Sr
16d10 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
16d20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
16d30 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
16d40 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
16d50 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
16d60 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
16d70 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
16d80 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
16d90 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
16da0 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
16db0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
16dc0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
16dd0 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
16de0 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
16df0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
16e00 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
16e10 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20  *pHaving;       
16e20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20    /* The HAVING 
16e30 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
16e40 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  NULL */.  int is
16e50 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
16e60 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
16e70 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
16e80 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
16e90 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20   int distinct;  
16ea0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
16eb0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
16ec0 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a  distinct set */.
16ed0 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20    int rc = 1;   
16ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
16ef0 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d  e to return from
16f00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
16f10 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74  /.  int addrSort
16f20 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64  Index;     /* Ad
16f30 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f  dress of an OP_O
16f40 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
16f50 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67  truction */.  Ag
16f60 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20  gInfo sAggInfo; 
16f70 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
16f80 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72  ion used by aggr
16f90 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f  egate queries */
16fa0 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20  .  int iEnd;    
16fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
16fc0 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20  ress of the end 
16fd0 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  of the query */.
16fe0 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 73  .  if( p==0 || s
16ff0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
17000 65 64 28 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ed() || pParse->
17010 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75  nErr ){.    retu
17020 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
17030 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
17040 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
17050 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
17060 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
17070 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c  emset(&sAggInfo,
17080 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49   0, sizeof(sAggI
17090 6e 66 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20  nfo));..#ifndef 
170a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
170b0 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a  OUND_SELECT.  /*
170c0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65   If there is are
170d0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71   a sequence of q
170e0 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65  ueries, do the e
170f0 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73  arlier ones firs
17100 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
17110 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
17120 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  f( p->pRightmost
17130 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ==0 ){.      Sel
17140 65 63 74 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  ect *pLoop;.    
17150 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
17160 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
17170 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
17180 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68      pLoop->pRigh
17190 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  tmost = p;.     
171a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
171b0 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  urn multiSelect(
171c0 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
171d0 2c 20 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a 20  , iParm, aff);. 
171e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 4f 72   }.#endif..  pOr
171f0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
17200 72 42 79 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72  rBy;.  if( Ignor
17210 61 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65 73  ableOrderby(eDes
17220 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72  t) ){.    p->pOr
17230 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  derBy = 0;.  }. 
17240 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
17250 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
17260 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20 20 67  , p, 0) ){.    g
17270 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
17280 20 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42    }.  p->pOrderB
17290 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20  y = pOrderBy;.. 
172a0 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63   /* Make local c
172b0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72  opies of the par
172c0 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73  ameters for this
172d0 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
172e0 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
172f0 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  c;.  pWhere = p-
17300 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75  >pWhere;.  pGrou
17310 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
17320 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70  y;.  pHaving = p
17330 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 41  ->pHaving;.  isA
17340 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20  gg = p->isAgg;. 
17350 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d   isDistinct = p-
17360 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70  >isDistinct;.  p
17370 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
17380 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d  t;.  if( pEList=
17390 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
173a0 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  _end;..  /* .  *
173b0 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74  * Do not even at
173c0 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74  tempt to generat
173d0 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65  e any code if we
173e0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65   have already se
173f0 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62  en.  ** errors b
17400 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
17410 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a  ne starts..  */.
17420 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
17430 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  rr>0 ) goto sele
17440 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66  ct_end;..  /* If
17450 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f   writing to memo
17460 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  ry or generating
17470 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79   a set.  ** only
17480 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
17490 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a   may be output..
174a0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
174b0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
174c0 59 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d  Y.  if( (eDest==
174d0 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
174e0 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70 45  ==SRT_Set) && pE
174f0 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b  List->nExpr>1 ){
17500 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
17510 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e  rMsg(pParse, "on
17520 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  ly a single resu
17530 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22  lt allowed for "
17540 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43  .       "a SELEC
17550 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  T that is part o
17560 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22  f an expression"
17570 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  );.    goto sele
17580 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
17590 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42  if..  /* ORDER B
175a0 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  Y is ignored for
175b0 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f   some destinatio
175c0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ns..  */.  if( I
175d0 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
175e0 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70 4f  eDest) ){.    pO
175f0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
17600 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
17610 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
17620 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
17630 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
17640 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
17650 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
17660 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
17670 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
17680 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
17690 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69  M clause.  */.#i
176a0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
176b0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
176c0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
176d0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
176e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
176f0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
17700 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
17710 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
17720 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
17730 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
17740 65 78 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ext;.    struct 
17750 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
17760 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
17770 3e 61 5b 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20  >a[i];..    if( 
17780 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pItem->pSelect==
17790 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f  0 || pItem->isPo
177a0 70 75 6c 61 74 65 64 20 29 20 63 6f 6e 74 69 6e  pulated ) contin
177b0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ue;.    if( pIte
177c0 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  m->zName!=0 ){. 
177d0 20 20 20 20 20 7a 53 61 76 65 64 41 75 74 68 43       zSavedAuthC
177e0 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
177f0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
17800 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75       pParse->zAu
17810 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65  thContext = pIte
17820 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  m->zName;.      
17830 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
17840 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  xt = 1;.    }els
17850 65 7b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73  e{.      needRes
17860 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 30 3b  toreContext = 0;
17870 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
17880 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
17890 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
178a0 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 0a   SRT_EphemTab, .
178b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178c0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c   pItem->iCursor,
178d0 20 70 2c 20 69 2c 20 26 69 73 41 67 67 2c 20 30   p, i, &isAgg, 0
178e0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64 52  );.    if( needR
178f0 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b  estoreContext ){
17900 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  .      pParse->z
17910 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
17920 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
17930 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c  .    }.    pTabL
17940 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
17950 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70     pWhere = p->p
17960 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28 20 21  Where;.    if( !
17970 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
17980 28 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20  (eDest) ){.     
17990 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
179a0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
179b0 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
179c0 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70  >pGroupBy;.    p
179d0 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
179e0 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69  ing;.    isDisti
179f0 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
17a00 6e 63 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  nct;.  }.#endif.
17a10 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
17a20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
17a30 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d   of a min() or m
17a40 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 79  ax() function by
17a50 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20   itself.  ** in 
17a60 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
17a70 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c    */.  if( simpl
17a80 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61  eMinMaxQuery(pPa
17a90 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69  rse, p, eDest, i
17aa0 50 61 72 6d 29 20 29 7b 0a 20 20 20 20 72 63 20  Parm) ){.    rc 
17ab0 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  = 0;.    goto se
17ac0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
17ad0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
17ae0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 75   if this is a su
17af0 62 71 75 65 72 79 20 74 68 61 74 20 63 61 6e 20  bquery that can 
17b00 62 65 20 22 66 6c 61 74 74 65 6e 65 64 22 20 69  be "flattened" i
17b10 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a  nto its parent..
17b20 20 20 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69    ** If flatteni
17b30 6e 67 20 69 73 20 61 20 70 6f 73 73 69 62 6c 69  ng is a possibli
17b40 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72 65  ty, do so and re
17b50 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
17b60 2e 20 20 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  .  .  */.#ifndef
17b70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
17b80 57 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20  W.  if( pParent 
17b90 26 26 20 70 50 61 72 65 6e 74 41 67 67 20 26 26  && pParentAgg &&
17ba0 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75  .      flattenSu
17bb0 62 71 75 65 72 79 28 70 50 61 72 65 6e 74 2c 20  bquery(pParent, 
17bc0 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72  parentTab, *pPar
17bd0 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20 29  entAgg, isAgg) )
17be0 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  {.    if( isAgg 
17bf0 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20  ) *pParentAgg = 
17c00 31 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  1;.    goto sele
17c10 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
17c20 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  if..  /* If ther
17c30 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
17c40 20 63 6c 61 75 73 65 2c 20 72 65 73 6f 6c 76 65   clause, resolve
17c50 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   any collation s
17c60 65 71 75 65 6e 63 65 73 0a 20 20 2a 2a 20 6e 61  equences.  ** na
17c70 6d 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65  mes that have be
17c80 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  en explicitly sp
17c90 65 63 69 66 69 65 64 20 61 6e 64 20 63 72 65 61  ecified and crea
17ca0 74 65 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  te a sorting ind
17cb0 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ex..  **.  ** Th
17cc0 69 73 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  is sorting index
17cd0 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65   might end up be
17ce0 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68  ing unused if th
17cf0 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20  e data can be . 
17d00 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e   ** extracted in
17d10 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65   pre-sorted orde
17d20 72 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  r.  If that is t
17d30 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
17d40 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70  e.  ** OP_OpenEp
17d50 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
17d60 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ion will be chan
17d70 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  ged to an OP_Noo
17d80 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66  p once.  ** we f
17d90 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74  igure out that t
17da0 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
17db0 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20   is not needed. 
17dc0 20 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64   The addrSortInd
17dd0 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  ex.  ** variable
17de0 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69   is used to faci
17df0 6c 69 74 61 74 65 20 74 68 61 74 20 63 68 61 6e  litate that chan
17e00 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ge..  */.  if( p
17e10 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
17e20 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
17e30 74 65 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20  tem *pTerm;.    
17e40 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
17e50 6f 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  o;.    for(i=0, 
17e60 70 54 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pTerm=pOrderBy->
17e70 61 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  a; i<pOrderBy->n
17e80 45 78 70 72 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Expr; i++, pTerm
17e90 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
17ea0 54 65 72 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Term->zName ){. 
17eb0 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 45         pTerm->pE
17ec0 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c  xpr->pColl = sql
17ed0 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
17ee0 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d  q(pParse, pTerm-
17ef0 3e 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20  >zName, -1);.   
17f00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
17f10 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
17f20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
17f30 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
17f40 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
17f50 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
17f60 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
17f70 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72  rBy);.    pOrder
17f80 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70  By->iECursor = p
17f90 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
17fa0 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
17fb0 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74  hm[2] = addrSort
17fc0 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 20 73  Index =.       s
17fd0 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
17fe0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
17ff0 6c 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  l, pOrderBy->iEC
18000 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d  ursor, pOrderBy-
18010 3e 6e 45 78 70 72 2b 32 2c 20 0a 20 20 20 20 20  >nExpr+2, .     
18020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18030 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
18040 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P3_KEYINFO_H
18050 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65  ANDOFF);.  }else
18060 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e  {.    addrSortIn
18070 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  dex = -1;.  }.. 
18080 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
18090 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
180a0 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
180b0 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
180c0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
180d0 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65   eDest==SRT_Ephe
180e0 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  mTab ){.    sqli
180f0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
18100 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
18110 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  , iParm, pEList-
18120 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
18130 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
18140 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20  er..  */.  iEnd 
18150 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
18160 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d  eLabel(v);.  com
18170 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
18180 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45  rs(pParse, p, iE
18190 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  nd);..  /* Open 
181a0 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
181b0 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
181c0 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
181d0 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e  /.  if( isDistin
181e0 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  ct ){.    KeyInf
181f0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
18200 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72   distinct = pPar
18210 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
18220 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
18230 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
18240 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
18250 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
18260 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
18270 45 70 68 65 6d 65 72 61 6c 2c 20 64 69 73 74 69  Ephemeral, disti
18280 6e 63 74 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  nct, 0, .       
18290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182a0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
182b0 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
182c0 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DOFF);.  }else{.
182d0 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d      distinct = -
182e0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67  1;.  }..  /* Agg
182f0 72 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61  regate and non-a
18300 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
18310 20 61 72 65 20 68 61 6e 64 6c 65 64 20 64 69 66   are handled dif
18320 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66  ferently */.  if
18330 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f  ( !isAgg && pGro
18340 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  upBy==0 ){.    /
18350 2a 20 54 68 69 73 20 63 61 73 65 20 69 73 20 66  * This case is f
18360 6f 72 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  or non-aggregate
18370 20 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2a 20   queries.    ** 
18380 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
18390 73 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20  se scan.    */. 
183a0 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
183b0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
183c0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
183d0 70 57 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42  pWhere, &pOrderB
183e0 79 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  y);.    if( pWIn
183f0 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
18400 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a  ect_end;..    /*
18410 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65   If sorting inde
18420 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74  x that was creat
18430 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50  ed by a prior OP
18440 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a  _OpenEphemeral .
18450 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
18460 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20  on ended up not 
18470 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68  being needed, th
18480 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  en change the OP
18490 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20  _OpenEphemeral. 
184a0 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50     ** into an OP
184b0 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Noop..    */.  
184c0 20 20 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e    if( addrSortIn
184d0 64 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72  dex>=0 && pOrder
184e0 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  By==0 ){.      s
184f0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
18500 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f  ToNoop(v, addrSo
18510 72 74 49 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20  rtIndex, 1);.   
18520 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
18530 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[2] = -1;.    
18540 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  }..    /* Use th
18550 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
18560 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20   loop.    */.   
18570 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72   if( selectInner
18580 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
18590 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
185a0 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74  rderBy, distinct
185b0 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , eDest,.       
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
185d0 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  rm, pWInfo->iCon
185e0 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  tinue, pWInfo->i
185f0 42 72 65 61 6b 2c 20 61 66 66 29 20 29 7b 0a 20  Break, aff) ){. 
18600 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
18610 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  t_end;.    }..  
18620 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
18630 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
18640 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
18650 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
18660 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
18670 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
18680 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
18690 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
186a0 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  s */.    NameCon
186b0 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20  text sNC;    /* 
186c0 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
186d0 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72   processing aggr
186e0 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  egate informatio
186f0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d  n */.    int iAM
18700 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
18710 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
18720 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75  s for storing cu
18730 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a  rrent GROUP BY *
18740 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b  /.    int iBMem;
18750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
18760 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
18770 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55  or previous GROU
18780 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
18790 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20  iUseFlag;       
187a0 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68  /* Mem address h
187b0 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69  olding flag indi
187c0 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c  cating that at l
187d0 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  east.           
187e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
187f0 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69  one row of the i
18800 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72  nput to the aggr
18810 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a  egator has been.
18820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18830 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
18840 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ssed */.    int 
18850 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20  iAbortFlag;     
18860 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77  /* Mem address w
18870 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72  hich causes quer
18880 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74  y abort if posit
18890 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67  ive */.    int g
188a0 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f  roupBySort;    /
188b0 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d  * Rows come from
188c0 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50   source in GROUP
188d0 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 0a 0a 20   BY order */... 
188e0 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
188f0 69 6e 67 20 76 61 72 69 61 62 6c 65 73 20 68 6f  ing variables ho
18900 6c 64 20 61 64 64 72 65 73 73 65 73 20 6f 72 20  ld addresses or 
18910 6c 61 62 65 6c 73 20 66 6f 72 20 70 61 72 74 73  labels for parts
18920 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 76   of the.    ** v
18930 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 70  irtual machine p
18940 72 6f 67 72 61 6d 20 77 65 20 61 72 65 20 70 75  rogram we are pu
18950 74 74 69 6e 67 20 74 6f 67 65 74 68 65 72 20 2a  tting together *
18960 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75  /.    int addrOu
18970 74 70 75 74 52 6f 77 3b 20 20 20 20 20 20 2f 2a  tputRow;      /*
18980 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75   Start of subrou
18990 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
189a0 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a  s a result row *
189b0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 65  /.    int addrSe
189c0 74 41 62 6f 72 74 3b 20 20 20 20 20 20 20 2f 2a  tAbort;       /*
189d0 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66   Set the abort f
189e0 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  lag and return *
189f0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e  /.    int addrIn
18a00 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 3b 20 2f 2a  itializeLoop; /*
18a10 20 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20 74   Start of code t
18a20 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  hat initializes 
18a30 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a  the input loop *
18a40 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f  /.    int addrTo
18a50 70 4f 66 4c 6f 6f 70 3b 20 20 20 20 20 20 2f 2a  pOfLoop;      /*
18a60 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75   Top of the inpu
18a70 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e  t loop */.    in
18a80 74 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61  t addrGroupByCha
18a90 6e 67 65 3b 20 20 2f 2a 20 43 6f 64 65 20 74 68  nge;  /* Code th
18aa0 61 74 20 72 75 6e 73 20 77 68 65 6e 20 61 6e 79  at runs when any
18ab0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 20 63   GROUP BY term c
18ac0 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 69 6e  hanges */.    in
18ad0 74 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77  t addrProcessRow
18ae0 3b 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f  ;     /* Code to
18af0 20 70 72 6f 63 65 73 73 20 61 20 73 69 6e 67 6c   process a singl
18b00 65 20 69 6e 70 75 74 20 72 6f 77 20 2a 2f 0a 20  e input row */. 
18b10 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20     int addrEnd; 
18b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
18b30 64 20 6f 66 20 61 6c 6c 20 70 72 6f 63 65 73 73  d of all process
18b40 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ing */.    int a
18b50 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 20  ddrSortingIdx;  
18b60 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65     /* The OP_Ope
18b70 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
18b80 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
18b90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
18ba0 52 65 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  Reset;          
18bb0 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f  /* Subroutine fo
18bc0 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
18bd0 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 0a  accumulator */..
18be0 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71      addrEnd = sq
18bf0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
18c00 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  el(v);..    /* C
18c10 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e  onvert TK_COLUMN
18c20 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41   nodes into TK_A
18c30 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61  GG_COLUMN and ma
18c40 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ke entries in.  
18c50 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f    ** sAggInfo fo
18c60 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e  r all TK_AGG_FUN
18c70 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65  CTION nodes in e
18c80 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
18c90 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  e.    ** SELECT 
18ca0 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a  statement..    *
18cb0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
18cc0 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
18cd0 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72  ));.    sNC.pPar
18ce0 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
18cf0 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
18d00 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e  pTabList;.    sN
18d10 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41  C.pAggInfo = &sA
18d20 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67  ggInfo;.    sAgg
18d30 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
18d40 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f  umn = pGroupBy ?
18d50 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
18d60 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67  +1 : 0;.    sAgg
18d70 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20  Info.pGroupBy = 
18d80 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 69 66  pGroupBy;.    if
18d90 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  ( sqlite3ExprAna
18da0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
18db0 2c 20 70 45 4c 69 73 74 29 20 29 7b 0a 20 20 20  , pEList) ){.   
18dc0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
18dd0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
18de0 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  ( sqlite3ExprAna
18df0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
18e00 2c 20 70 4f 72 64 65 72 42 79 29 20 29 7b 0a 20  , pOrderBy) ){. 
18e10 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
18e20 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
18e30 69 66 28 20 70 48 61 76 69 6e 67 20 26 26 20 73  if( pHaving && s
18e40 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
18e50 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43  eAggregates(&sNC
18e60 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  , pHaving) ){.  
18e70 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
18e80 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  end;.    }.    s
18e90 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c  AggInfo.nAccumul
18ea0 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e  ator = sAggInfo.
18eb0 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72  nColumn;.    for
18ec0 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
18ed0 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20  .nFunc; i++){.  
18ee0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
18ef0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
18f00 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f  t(&sNC, sAggInfo
18f10 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d  .aFunc[i].pExpr-
18f20 3e 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  >pList) ){.     
18f30 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
18f40 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
18f50 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
18f60 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
18f70 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
18f80 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65  d;..    /* Proce
18f90 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  ssing for aggreg
18fa0 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20  ates with GROUP 
18fb0 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65  BY is very diffe
18fc0 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  rent and.    ** 
18fd0 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  much more comple
18fe0 78 20 74 68 61 20 61 67 67 72 65 67 61 74 65 73  x tha aggregates
18ff0 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
19000 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
19010 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
19020 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
19030 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
19040 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
19050 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
19060 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 20 20   clause */..    
19070 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65    /* Create labe
19080 6c 73 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  ls that we will 
19090 62 65 20 6e 65 65 64 69 6e 67 0a 20 20 20 20 20  be needing.     
190a0 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 20   */.     .      
190b0 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f  addrInitializeLo
190c0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
190d0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
190e0 20 20 20 20 61 64 64 72 47 72 6f 75 70 42 79 43      addrGroupByC
190f0 68 61 6e 67 65 20 3d 20 73 71 6c 69 74 65 33 56  hange = sqlite3V
19100 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
19110 0a 20 20 20 20 20 20 61 64 64 72 50 72 6f 63 65  .      addrProce
19120 73 73 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  ssRow = sqlite3V
19130 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
19140 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
19150 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42  ere is a GROUP B
19160 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68  Y clause we migh
19170 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67  t need a sorting
19180 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20   index to.      
19190 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e  ** implement it.
191a0 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20    Allocate that 
191b0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f  sorting index no
191c0 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20  w.  If it turns 
191d0 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  out.      ** tha
191e0 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  t we do not need
191f0 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74   it after all, t
19200 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  he OpenEphemeral
19210 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20   instruction.   
19220 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f     ** will be co
19230 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e  nverted into a N
19240 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a  oop.  .      */.
19250 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
19260 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72  ortingIdx = pPar
19270 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
19280 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
19290 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
192a0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
192b0 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f  y);.      addrSo
192c0 72 74 69 6e 67 49 64 78 20 3d 0a 20 20 20 20 20  rtingIdx =.     
192d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
192e0 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op3(v, OP_OpenEp
192f0 68 65 6d 65 72 61 6c 2c 20 73 41 67 67 49 6e 66  hemeral, sAggInf
19300 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20  o.sortingIdx,.  
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
19330 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 0a  nSortingColumn,.
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19350 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
19360 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  pKeyInfo, P3_KEY
19370 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a  INFO_HANDOFF);..
19380 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
19390 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  ize memory locat
193a0 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f  ions used by GRO
193b0 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20  UP BY aggregate 
193c0 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20  processing.     
193d0 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c   */.      iUseFl
193e0 61 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ag = pParse->nMe
193f0 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 41 62 6f 72  m++;.      iAbor
19400 74 46 6c 61 67 20 3d 20 70 50 61 72 73 65 2d 3e  tFlag = pParse->
19410 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 41  nMem++;.      iA
19420 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
19430 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  em;.      pParse
19440 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
19450 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
19460 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iBMem = pParse-
19470 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
19480 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
19490 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
194a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
194b0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
194c0 74 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67  t, 0, iAbortFlag
194d0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
194e0 6d 65 6e 74 28 28 76 2c 20 22 23 20 63 6c 65 61  ment((v, "# clea
194f0 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  r abort flag"));
19500 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19510 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
19520 6d 49 6e 74 2c 20 30 2c 20 69 55 73 65 46 6c 61  mInt, 0, iUseFla
19530 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
19540 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 69 6e 64  mment((v, "# ind
19550 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  icate accumulato
19560 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20  r empty"));.    
19570 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19580 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
19590 2c 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65  , addrInitialize
195a0 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Loop);..      /*
195b0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
195c0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
195d0 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  uts a single row
195e0 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
195f0 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68       ** set.  Th
19600 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69  is subroutine fi
19610 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  rst looks at the
19620 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69   iUseFlag.  If i
19630 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a  UseFlag.      **
19640 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
19650 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20   equal to zero, 
19660 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
19670 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20  s a no-op.  If. 
19680 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63       ** the proc
19690 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72  essing calls for
196a0 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62   the query to ab
196b0 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75  ort, this subrou
196c0 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tine.      ** in
196d0 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62  crements the iAb
196e0 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c  ortFlag memory l
196f0 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72  ocation before r
19700 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20  eturning in.    
19710 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69    ** order to si
19720 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20  gnal the caller 
19730 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20  to abort..      
19740 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74  */.      addrSet
19750 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Abort = sqlite3V
19760 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
19770 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19780 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
19790 4d 65 6d 49 6e 74 2c 20 31 2c 20 69 41 62 6f 72  MemInt, 1, iAbor
197a0 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
197b0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
197c0 20 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22   set abort flag"
197d0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
197e0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
197f0 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a  _Return, 0, 0);.
19800 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
19810 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
19820 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
19830 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19840 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
19850 4d 65 6d 50 6f 73 2c 20 69 55 73 65 46 6c 61 67  MemPos, iUseFlag
19860 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
19870 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  2);.      VdbeCo
19880 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 47 72 6f  mment((v, "# Gro
19890 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
198a0 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e  rator entry poin
198b0 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t"));.      sqli
198c0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
198d0 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29  OP_Return, 0, 0)
198e0 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
198f0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
19900 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
19910 0a 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69  .      if( pHavi
19920 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ng ){.        sq
19930 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
19940 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
19950 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
19960 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 1);.      }. 
19970 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74       rc = select
19980 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
19990 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
199a0 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a  0, 0, pOrderBy,.
199b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199c0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69             disti
199d0 6e 63 74 2c 20 65 44 65 73 74 2c 20 69 50 61 72  nct, eDest, iPar
199e0 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
199f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
19a00 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20  ddrOutputRow+1, 
19a10 61 64 64 72 53 65 74 41 62 6f 72 74 2c 20 61 66  addrSetAbort, af
19a20 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  f);.      if( rc
19a30 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
19a40 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
19a50 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
19a60 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
19a70 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b  P_Return, 0, 0);
19a80 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
19a90 6e 74 28 28 76 2c 20 22 23 20 65 6e 64 20 67 72  nt((v, "# end gr
19aa0 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
19ab0 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  erator"));..    
19ac0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
19ad0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
19ae0 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67  will reset the g
19af0 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61  roup-by accumula
19b00 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  tor.      */.   
19b10 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73     addrReset = s
19b20 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
19b30 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
19b40 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
19b50 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
19b60 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
19b70 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
19b80 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b  P_Return, 0, 0);
19b90 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  ..      /* Begin
19ba0 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
19bb0 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f  l extract all so
19bc0 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f  urce rows in GRO
19bd0 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20  UP BY order..   
19be0 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
19bf0 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70   involve two sep
19c00 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68  arate loops with
19c10 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62   an OP_Sort in b
19c20 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20  etween, or.     
19c30 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
19c40 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68  a single loop th
19c50 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  at uses an index
19c60 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f   to extract info
19c70 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  rmation.      **
19c80 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72   in the right or
19c90 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74  der to begin wit
19ca0 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
19cb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
19cc0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
19cd0 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29  rInitializeLoop)
19ce0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19cf0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
19d00 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 52 65 73  osub, 0, addrRes
19d10 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  et);.      pWInf
19d20 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
19d30 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
19d40 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
19d50 26 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  &pGroupBy);.    
19d60 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
19d70 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
19d80 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72  d;.      if( pGr
19d90 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
19da0 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d      /* The optim
19db0 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20  izer is able to 
19dc0 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
19dd0 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73  group by order s
19de0 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20  o.        ** we 
19df0 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73  do not have to s
19e00 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65  ort.  The OP_Ope
19e10 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65  nEphemeral table
19e20 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
19e30 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61   ** cancelled la
19e40 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73  ter because we s
19e50 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65  till need to use
19e60 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20   the pKeyInfo.  
19e70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
19e80 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
19e90 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
19ea0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30   groupBySort = 0
19eb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19ec0 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61         /* Rows a
19ed0 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e  re coming out in
19ee0 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72   undetermined or
19ef0 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f  der.  We have to
19f00 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a   push.        **
19f10 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61   each row into a
19f20 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20   sorting index, 
19f30 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69  terminate the fi
19f40 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20  rst loop,.      
19f50 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f    ** then loop o
19f60 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  ver the sorting 
19f70 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74  index in order t
19f80 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74  o get the output
19f90 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73  .        ** in s
19fa0 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20  orted order.    
19fb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67      */.        g
19fc0 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a  roupBySort = 1;.
19fd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19fe0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
19ff0 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
1a000 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1a010 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1a020 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67  P_Sequence, sAgg
1a030 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
1a040 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d   0);.        j =
1a050 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
1a060 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +1;.        for(
1a070 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
1a080 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
1a090 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
1a0a0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
1a0b0 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43  l = &sAggInfo.aC
1a0c0 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[i];.         
1a0d0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
1a0e0 65 72 43 6f 6c 75 6d 6e 3c 6a 20 29 20 63 6f 6e  erColumn<j ) con
1a0f0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1a100 20 69 66 28 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75   if( pCol->iColu
1a110 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
1a120 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a130 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69 64  ddOp(v, OP_Rowid
1a140 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20  , pCol->iTable, 
1a150 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  0);.          }e
1a160 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1a170 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a180 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
1a190 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 70 43  pCol->iTable, pC
1a1a0 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ol->iColumn);.  
1a1b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a1c0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
1a1d0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1a1e0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1a1f0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6a 2c  P_MakeRecord, j,
1a200 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
1a210 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1a220 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 73   OP_IdxInsert, s
1a230 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
1a240 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  dx, 0);.        
1a250 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
1a260 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
1a270 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a280 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41  p(v, OP_Sort, sA
1a290 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1a2a0 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  x, addrEnd);.   
1a2b0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1a2c0 28 28 76 2c 20 22 23 20 47 52 4f 55 50 20 42 59  ((v, "# GROUP BY
1a2d0 20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20   sort"));.      
1a2e0 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f    sAggInfo.useSo
1a2f0 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20  rtingIdx = 1;.  
1a300 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1a310 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72  Evaluate the cur
1a320 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
1a330 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  rms and store in
1a340 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20   b0, b1, b2.... 
1a350 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d       ** (b0 is m
1a360 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69  emory location i
1a370 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42  BMem+0, b1 is iB
1a380 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f  Mem+1, and so fo
1a390 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68  rth).      ** Th
1a3a0 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63  en compare the c
1a3b0 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
1a3c0 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68  terms against th
1a3d0 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  e GROUP BY terms
1a3e0 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  .      ** from t
1a3f0 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
1a400 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
1a410 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e   in a0, a1, a2..
1a420 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1a430 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d   addrTopOfLoop =
1a440 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1a450 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1a460 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72    for(j=0; j<pGr
1a470 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b  oupBy->nExpr; j+
1a480 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1a490 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
1a4a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1a4b0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1a4c0 43 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e 66 6f  Column, sAggInfo
1a4d0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a 29 3b  .sortingIdx, j);
1a4e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1a4f0 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
1a500 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  fo.directMode = 
1a510 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  1;.          sql
1a520 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1a530 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
1a540 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [j].pExpr);.    
1a550 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
1a560 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1a570 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
1a580 42 4d 65 6d 2b 6a 2c 20 6a 3c 70 47 72 6f 75 70  BMem+j, j<pGroup
1a590 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  By->nExpr-1);.  
1a5a0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
1a5b0 6a 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j=pGroupBy->nExp
1a5c0 72 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b  r-1; j>=0; j--){
1a5d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
1a5e0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31  GroupBy->nExpr-1
1a5f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
1a600 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1a610 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 42  , OP_MemLoad, iB
1a620 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20 20 20  Mem+j, 0);.     
1a630 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
1a640 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1a650 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 41 4d   OP_MemLoad, iAM
1a660 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20  em+j, 0);.      
1a670 20 20 69 66 28 20 6a 3d 3d 30 20 29 7b 0a 20 20    if( j==0 ){.  
1a680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1a690 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 45  dbeAddOp(v, OP_E
1a6a0 71 2c 20 30 78 32 30 30 2c 20 61 64 64 72 50 72  q, 0x200, addrPr
1a6b0 6f 63 65 73 73 52 6f 77 29 3b 0a 20 20 20 20 20  ocessRow);.     
1a6c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a6d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a6e0 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20 30  ddOp(v, OP_Ne, 0
1a6f0 78 32 30 30 2c 20 61 64 64 72 47 72 6f 75 70 42  x200, addrGroupB
1a700 79 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  yChange);.      
1a710 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
1a720 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
1a730 76 2c 20 2d 31 2c 20 28 76 6f 69 64 2a 29 70 4b  v, -1, (void*)pK
1a740 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d  eyInfo->aColl[j]
1a750 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P3_COLLSEQ);. 
1a760 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1a770 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1a780 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65  hat runs wheneve
1a790 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
1a7a0 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a  hanges..      **
1a7b0 20 43 68 61 6e 67 65 20 69 6e 20 74 68 65 20 47   Change in the G
1a7c0 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74 65  ROUP BY are dete
1a7d0 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76  cted by the prev
1a7e0 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20  ious code.      
1a7f0 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68  ** block.  If th
1a800 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e  ere were no chan
1a810 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20  ges, this block 
1a820 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20  is skipped..    
1a830 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
1a840 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63  is code copies c
1a850 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20  urrent group by 
1a860 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62  terms in b0,b1,b
1a870 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f  2,....      ** o
1a880 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e  ver to a0,a1,a2.
1a890 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20    It then calls 
1a8a0 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
1a8b0 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61  utine.      ** a
1a8c0 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61 67  nd resets the ag
1a8d0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
1a8e0 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69 6e  tor registers in
1a8f0 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20   preparation.   
1a900 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65     ** for the ne
1a910 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74 63  xt GROUP BY batc
1a920 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
1a930 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1a940 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
1a950 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29 3b  rGroupByChange);
1a960 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
1a970 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
1a980 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
1a990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a9a0 70 28 76 2c 20 4f 50 5f 4d 65 6d 4d 6f 76 65 2c  p(v, OP_MemMove,
1a9b0 20 69 41 4d 65 6d 2b 6a 2c 20 69 42 4d 65 6d 2b   iAMem+j, iBMem+
1a9c0 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j);.      }.    
1a9d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a9e0 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  Op(v, OP_Gosub, 
1a9f0 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  0, addrOutputRow
1aa00 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1aa10 6d 65 6e 74 28 28 76 2c 20 22 23 20 6f 75 74 70  ment((v, "# outp
1aa20 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20  ut one row"));. 
1aa30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1aa40 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65  AddOp(v, OP_IfMe
1aa50 6d 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67  mPos, iAbortFlag
1aa60 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
1aa70 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1aa80 2c 20 22 23 20 63 68 65 63 6b 20 61 62 6f 72 74  , "# check abort
1aa90 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
1aaa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1aab0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c  (v, OP_Gosub, 0,
1aac0 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
1aad0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1aae0 76 2c 20 22 23 20 72 65 73 65 74 20 61 63 63 75  v, "# reset accu
1aaf0 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
1ab00 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
1ab10 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
1ab20 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e  ulators based on
1ab30 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
1ab40 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72        ** the cur
1ab50 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a  rent row.      *
1ab60 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
1ab70 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1ab80 76 2c 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f  v, addrProcessRo
1ab90 77 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65  w);.      update
1aba0 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
1abb0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
1abc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1abd0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
1abe0 49 6e 74 2c 20 31 2c 20 69 55 73 65 46 6c 61 67  Int, 1, iUseFlag
1abf0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1ac00 6d 65 6e 74 28 28 76 2c 20 22 23 20 69 6e 64 69  ment((v, "# indi
1ac10 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63  cate data in acc
1ac20 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
1ac30 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
1ac40 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a  e loop.      */.
1ac50 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
1ac60 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
1ac70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ac80 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73 41  p(v, OP_Next, sA
1ac90 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1aca0 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70  x, addrTopOfLoop
1acb0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1acc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1acd0 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
1ace0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1acf0 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
1ad00 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49  (v, addrSortingI
1ad10 64 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  dx, 1);.      }.
1ad20 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  .      /* Output
1ad30 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f   the final row o
1ad40 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  f result.      *
1ad50 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
1ad60 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
1ad70 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 4f 75 74  osub, 0, addrOut
1ad80 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
1ad90 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1ada0 23 20 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72  # output final r
1adb0 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 0a 20 20  ow"));.      .  
1adc0 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72    } /* endif pGr
1add0 6f 75 70 42 79 20 2a 2f 0a 20 20 20 20 65 6c 73  oupBy */.    els
1ade0 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  e {.      /* Thi
1adf0 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74  s case runs if t
1ae00 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73  he aggregate has
1ae10 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
1ae20 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  use.  The.      
1ae30 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ** processing is
1ae40 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69   much simpler si
1ae50 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  nce there is onl
1ae60 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20  y a single row. 
1ae70 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75       ** of outpu
1ae80 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
1ae90 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
1aea0 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
1aeb0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 57 49  Info);.      pWI
1aec0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
1aed0 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
1aee0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
1aef0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1af00 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
1af10 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
1af20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
1af30 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
1af40 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
1af50 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
1af60 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 66 69  WInfo);.      fi
1af70 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
1af80 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
1af90 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 4f 72  Info);.      pOr
1afa0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
1afb0 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
1afc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1afd0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1afe0 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
1aff0 45 6e 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  End, 1);.      }
1b000 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
1b010 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
1b020 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20  , p->pEList, 0, 
1b030 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20  0, 0, -1, .     
1b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b050 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 61   eDest, iParm, a
1b060 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 2c  ddrEnd, addrEnd,
1b070 20 61 66 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20   aff);.    }.   
1b080 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1b090 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
1b0a0 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f  End);.    .  } /
1b0b0 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74  * endif aggregat
1b0c0 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a  e query */..  /*
1b0d0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
1b0e0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
1b0f0 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f   then we need to
1b100 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74   sort the result
1b110 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20  s.  ** and send 
1b120 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c  them to the call
1b130 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  back one by one.
1b140 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
1b150 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65  erBy ){.    gene
1b160 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
1b170 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73  rse, p, v, pELis
1b180 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c  t->nExpr, eDest,
1b190 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 23 69   iParm);.  }..#i
1b1a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b1b0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 2f 2a 20  T_SUBQUERY.  /* 
1b1c0 49 66 20 74 68 69 73 20 77 61 73 20 61 20 73 75  If this was a su
1b1d0 62 71 75 65 72 79 2c 20 77 65 20 68 61 76 65 20  bquery, we have 
1b1e0 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68  now converted th
1b1f0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
1b200 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79  a.  ** temporary
1b210 20 74 61 62 6c 65 2e 20 20 53 6f 20 73 65 74 20   table.  So set 
1b220 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  the SrcList_item
1b230 2e 69 73 50 6f 70 75 6c 61 74 65 64 20 66 6c 61  .isPopulated fla
1b240 67 20 74 6f 20 70 72 65 76 65 6e 74 0a 20 20 2a  g to prevent.  *
1b250 2a 20 74 68 69 73 20 73 75 62 71 75 65 72 79 20  * this subquery 
1b260 66 72 6f 6d 20 62 65 69 6e 67 20 65 76 61 6c 75  from being evalu
1b270 61 74 65 64 20 61 67 61 69 6e 20 61 6e 64 20 74  ated again and t
1b280 6f 20 66 6f 72 63 65 20 74 68 65 20 75 73 65 20  o force the use 
1b290 6f 66 0a 20 20 2a 2a 20 74 68 65 20 74 65 6d 70  of.  ** the temp
1b2a0 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a  orary table..  *
1b2b0 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20  /.  if( pParent 
1b2c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1b2d0 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53  Parent->pSrc->nS
1b2e0 72 63 3e 70 61 72 65 6e 74 54 61 62 20 29 3b 0a  rc>parentTab );.
1b2f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1b300 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72  ent->pSrc->a[par
1b310 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d  entTab].pSelect=
1b320 3d 70 20 29 3b 0a 20 20 20 20 70 50 61 72 65 6e  =p );.    pParen
1b330 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e  t->pSrc->a[paren
1b340 74 54 61 62 5d 2e 69 73 50 6f 70 75 6c 61 74 65  tTab].isPopulate
1b350 64 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 1;.  }.#endi
1b360 66 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  f..  /* Jump her
1b370 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71  e to skip this q
1b380 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
1b390 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1b3a0 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20  bel(v, iEnd);.. 
1b3b0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77   /* The SELECT w
1b3c0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
1b3d0 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65  coded.   Set the
1b3e0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20   return code to 
1b3f0 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  0.  ** to indica
1b400 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20  te no errors..  
1b410 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20  */.  rc = 0;..  
1b420 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  /* Control jumps
1b430 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65   to here if an e
1b440 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
1b450 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70  red above, or up
1b460 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  on.  ** successf
1b470 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65  ul coding of the
1b480 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65   SELECT..  */.se
1b490 6c 65 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20  lect_end:..  /* 
1b4a0 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
1b4b0 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c  names if we will
1b4c0 20 62 65 20 75 73 69 6e 67 20 74 68 65 6d 20 69   be using them i
1b4d0 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54  n a callback.  T
1b4e0 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73  his.  ** step is
1b4f0 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
1b500 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20  output is going 
1b510 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 65  to some other de
1b520 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  stination..  */.
1b530 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b540 5f 4f 4b 20 26 26 20 65 44 65 73 74 3d 3d 53 52  _OK && eDest==SR
1b550 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
1b560 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
1b570 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
1b580 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
1b590 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 46 72  .  }..  sqliteFr
1b5a0 65 65 28 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  ee(sAggInfo.aCol
1b5b0 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
1b5c0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b  sAggInfo.aFunc);
1b5d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.