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

Artifact eefb46a67c8d154aa87e9fad2ffb0671f1fe4027:


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 30 39  select.c,v 1.309
0200: 20 32 30 30 36 2f 30 33 2f 31 37 20 31 33 3a 35   2006/03/17 13:5
0210: 36 3a 33 34 20 64 72 68 20 45 78 70 20 24 0a 2a  6:34 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 56 69 72 74  ew->addrOpenVirt
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 56 69 72 74 5b 31  ->addrOpenVirt[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 56 69 72 74 5b 32 5d 20  addrOpenVirt[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 56 69 72 74 75 61 6c 54 61 62 3a 20 7b  RT_VirtualTab: {
4250: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4260: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
4270: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
4280: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  n, 0);.      if(
4290: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
42a0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
42b0: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
42c0: 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20 20  erBy, p);.      
42d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
42e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
42f0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
4300: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
4310: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4320: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
4330: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  1, 0);.        s
4340: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4350: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
4360: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  arm, 0);.      }
4370: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4380: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
4390: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
43a0: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
43b0: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
43c0: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
43d0: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
43e0: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
43f0: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
4400: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
4410: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
4420: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
4430: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
4440: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
4450: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
4460: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4470: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
4480: 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69  int addr1 = sqli
4490: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
44a0: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  dr(v);.      int
44b0: 20 61 64 64 72 32 3b 0a 0a 20 20 20 20 20 20 61   addr2;..      a
44c0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
44d0: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
44e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
44f0: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61  P_NotNull, -1, a
4500: 64 64 72 31 2b 33 29 3b 0a 20 20 20 20 20 20 73  ddr1+3);.      s
4510: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4520: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
4530: 3b 0a 20 20 20 20 20 20 61 64 64 72 32 20 3d 20  ;.      addr2 = 
4540: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4550: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
4560: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  0);.      if( pO
4570: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
4580: 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c    /* At first gl
4590: 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74  ance you would t
45a0: 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70  hink we could op
45b0: 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20  timize out the. 
45c0: 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20         ** ORDER 
45d0: 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  BY in this case 
45e0: 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20  since the order 
45f0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
4600: 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a  e set.        **
4610: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
4620: 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67  .  But there mig
4630: 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c  ht be a LIMIT cl
4640: 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20  ause, in which. 
4650: 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
4660: 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61  he order does ma
4670: 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  tter */.        
4680: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
4690: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
46a0: 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   p);.      }else
46b0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61  {.        char a
46c0: 66 66 69 6e 69 74 79 20 3d 20 28 69 50 61 72 6d  ffinity = (iParm
46d0: 3e 3e 31 36 29 26 30 78 46 46 3b 0a 20 20 20 20  >>16)&0xFF;.    
46e0: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
46f0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
4700: 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b  inity(pEList->a[
4710: 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 69 6e 69  0].pExpr, affini
4720: 74 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ty);.        sql
4730: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
4740: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
4750: 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31   0, &affinity, 1
4760: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4770: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4780: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 28 69 50  P_IdxInsert, (iP
4790: 61 72 6d 26 30 78 30 30 30 30 46 46 46 46 29 2c  arm&0x0000FFFF),
47a0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
47b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
47c0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29  mpHere(v, addr2)
47d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
47e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
47f0: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
4800: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
4810: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
4820: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
4830: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
4840: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
4850: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4860: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20  p(v, OP_MemInt, 
4870: 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  1, iParm);.     
4880: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4890: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f  p(v, OP_Pop, nCo
48a0: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
48b0: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
48c0: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
48d0: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
48e0: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
48f0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
4900: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
4910: 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
4920: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
4930: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
4940: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
4950: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
4960: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
4970: 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
4980: 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
4990: 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
49a0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
49b0: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
49c0: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
49d0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
49e0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
49f0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
4a00: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
4a10: 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d  rBy, p);.      }
4a20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
4a30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4a40: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
4a50: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
4a60: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
4a70: 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20  lause will jump 
4a80: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
4a90: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
4aa0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4ab0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
4ac0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4ad0: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
4ae0: 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20      /* Send the 
4af0: 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c  data to the call
4b00: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72  back function or
4b10: 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
4b20: 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a  .  In the.    **
4b30: 20 63 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f   case of a subro
4b40: 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f  utine, the subro
4b50: 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20  utine itself is 
4b60: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a  responsible for.
4b70: 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74      ** popping t
4b80: 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  he data from the
4b90: 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20   stack..    */. 
4ba0: 20 20 20 63 61 73 65 20 53 52 54 5f 53 75 62 72     case SRT_Subr
4bb0: 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61 73 65  outine:.    case
4bc0: 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b   SRT_Callback: {
4bd0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
4be0: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rBy ){.        s
4bf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4c00: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4c10: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
4c20: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
4c30: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
4c40: 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20  rderBy, p);.    
4c50: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
4c60: 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e  t==SRT_Subroutin
4c70: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
4c80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4c90: 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50   OP_Gosub, 0, iP
4ca0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  arm);.      }els
4cb0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
4cc0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4cd0: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
4ce0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  umn, 0);.      }
4cf0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4d00: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
4d10: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
4d20: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
4d30: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
4d40: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
4d50: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
4d60: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
4d70: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
4d80: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
4d90: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
4da0: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
4db0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
4dc0: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
4dd0: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
4de0: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
4df0: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
4e00: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
4e10: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
4e20: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
4e30: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
4e40: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
4e50: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
4e60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4e70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4e80: 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  Pop, nColumn, 0)
4e90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4ea0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
4eb0: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
4ec0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
4ed0: 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
4ee0: 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
4ef0: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e    if( p->iLimit>
4f00: 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d  =0 && pOrderBy==
4f10: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
4f20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4f30: 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70 2d 3e  MemIncr, -1, p->
4f40: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c  iLimit);.    sql
4f50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4f60: 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70   OP_IfMemZero, p
4f70: 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
4f80: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4f90: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  0;.}../*.** Give
4fa0: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
4fb0: 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61  list, generate a
4fc0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
4fd0: 72 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a  re that records.
4fe0: 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** the collating
4ff0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61   sequence for ea
5000: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
5010: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
5020: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
5030: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
5040: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  an ORDER BY or G
5050: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74  ROUP BY clause t
5060: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e  hen the resultin
5070: 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72  g.** KeyInfo str
5080: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
5090: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
50a0: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
50b0: 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70   index to.** imp
50c0: 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75  lement that clau
50d0: 73 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72  se.  If the Expr
50e0: 4c 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75  List is the resu
50f0: 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45  lt set of a SELE
5100: 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b  CT.** then the K
5110: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5120: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
5130: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
5140: 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e   a virtual.** in
5150: 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  dex to implement
5160: 20 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74   a DISTINCT test
5170: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
5180: 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
5190: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
51a0: 62 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f  btain from mallo
51b0: 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a  c.  The calling.
51c0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ** function is r
51d0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73  esponsible for s
51e0: 65 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  eeing that this 
51f0: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
5200: 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
5210: 2e 20 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e  .  Add the KeyIn
5220: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
5230: 74 68 65 20 50 33 20 66 69 65 6c 64 20 6f 66 20  the P3 field of 
5240: 61 6e 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a  an opcode using.
5250: 2a 2a 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  ** P3_KEYINFO_HA
5260: 4e 44 4f 46 46 20 69 73 20 74 68 65 20 75 73 75  NDOFF is the usu
5270: 61 6c 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e  al way of dealin
5280: 67 20 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a  g with this..*/.
5290: 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a  static KeyInfo *
52a0: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
52b0: 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ist(Parse *pPars
52c0: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  e, ExprList *pLi
52d0: 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  st){.  sqlite3 *
52e0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
52f0: 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20  .  int nExpr;.  
5300: 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a  KeyInfo *pInfo;.
5310: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
5320: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
5330: 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72   int i;..  nExpr
5340: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
5350: 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74  .  pInfo = sqlit
5360: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
5370: 2a 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a  *pInfo) + nExpr*
5380: 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
5390: 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49  )+1) );.  if( pI
53a0: 6e 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f  nfo ){.    pInfo
53b0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
53c0: 75 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c  u8*)&pInfo->aCol
53d0: 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49  l[nExpr];.    pI
53e0: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45  nfo->nField = nE
53f0: 78 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  xpr;.    pInfo->
5400: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
5410: 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
5420: 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45  m=pList->a; i<nE
5430: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
5440: 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  +){.      CollSe
5450: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
5460: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
5470: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
5480: 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
5490: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  ;.      if( !pCo
54a0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
54b0: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
54c0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
54d0: 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b     pInfo->aColl[
54e0: 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
54f0: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
5500: 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  der[i] = pItem->
5510: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
5520: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
5530: 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  nfo;.}.../*.** I
5540: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5550: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75   was generated u
5560: 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20  sing a non-null 
5570: 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e  pOrderBy argumen
5580: 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  t,.** then the r
5590: 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63  esults were plac
55a0: 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20  ed in a sorter. 
55b0: 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   After the loop 
55c0: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
55d0: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20   we need to run 
55e0: 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f  the sorter and o
55f0: 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74  utput the result
5600: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
5610: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  g.** routine gen
5620: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
5630: 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61  needed to do tha
5640: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
5650: 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61  d generateSortTa
5660: 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  il(.  Parse *pPa
5670: 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e  rse,   /* Parsin
5680: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
5690: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
56a0: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
56b0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62  atement */.  Vdb
56c0: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 2f 2a  e *v,         /*
56d0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
56e0: 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f  nto this VDBE */
56f0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
5700: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5710: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61   columns of data
5720: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c   */.  int eDest,
5730: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
5740: 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c  the sorted resul
5750: 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ts here */.  int
5760: 20 69 50 61 72 6d 20 20 20 20 20 20 20 20 2f 2a   iParm        /*
5770: 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65   Optional parame
5780: 74 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77  ter associated w
5790: 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a  ith eDest */.){.
57a0: 20 20 69 6e 74 20 62 72 6b 20 3d 20 73 71 6c 69    int brk = sqli
57b0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
57c0: 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 20  (v);.  int cont 
57d0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
57e0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74  eLabel(v);.  int
57f0: 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54 61   addr;.  int iTa
5800: 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f 54  b;.  int pseudoT
5810: 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  ab;.  ExprList *
5820: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
5830: 72 64 65 72 42 79 3b 0a 0a 20 20 69 54 61 62 20  rderBy;..  iTab 
5840: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  = pOrderBy->iECu
5850: 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73  rsor;.  if( eDes
5860: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
5870: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75  || eDest==SRT_Su
5880: 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  broutine ){.    
5890: 70 73 65 75 64 6f 54 61 62 20 3d 20 70 50 61 72  pseudoTab = pPar
58a0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
58b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
58c0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
58d0: 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29  o, pseudoTab, 0)
58e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
58f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
5900: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 73 65 75  NumColumns, pseu
5910: 64 6f 54 61 62 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  doTab, nColumn);
5920: 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 31 20  .  }.  addr = 1 
5930: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
5940: 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  Op(v, OP_Sort, i
5950: 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f 64  Tab, brk);.  cod
5960: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 63 6f  eOffset(v, p, co
5970: 6e 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 65 44  nt, 0);.  if( eD
5980: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
5990: 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  k || eDest==SRT_
59a0: 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  Subroutine ){.  
59b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
59c0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
59d0: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  , 1, 0);.  }.  s
59e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
59f0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
5a00: 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ab, pOrderBy->nE
5a10: 78 70 72 20 2b 20 31 29 3b 0a 20 20 73 77 69 74  xpr + 1);.  swit
5a20: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
5a30: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
5a40: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 56 69  .    case SRT_Vi
5a50: 72 74 75 61 6c 54 61 62 3a 20 7b 0a 20 20 20 20  rtualTab: {.    
5a60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5a70: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  Op(v, OP_NewRowi
5a80: 64 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  d, iParm, 0);.  
5a90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5aa0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
5ab0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
5ac0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5ad0: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
5ae0: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  rm, 0);.      br
5af0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
5b00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
5b10: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
5b20: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
5b30: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
5b40: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
5b50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5b60: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31  , OP_NotNull, -1
5b70: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
5b80: 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a  rentAddr(v)+3);.
5b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5ba0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
5bb0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
5bc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5bd0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73  v, OP_Goto, 0, s
5be0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
5bf0: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
5c00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
5c10: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
5c20: 72 64 2c 20 31 2c 20 30 2c 20 22 63 22 2c 20 50  rd, 1, 0, "c", P
5c30: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
5c40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5c50: 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  p(v, OP_IdxInser
5c60: 74 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30 30  t, (iParm&0x0000
5c70: 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20 20  FFFF), 0);.     
5c80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5c90: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
5ca0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5cb0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
5cc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5cd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
5ce0: 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ore, iParm, 1);.
5cf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
5d00: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
5d10: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
5d20: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
5d30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
5d40: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 53  endif.    case S
5d50: 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20  RT_Callback:.   
5d60: 20 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75   case SRT_Subrou
5d70: 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  tine: {.      in
5d80: 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t i;.      sqlit
5d90: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5da0: 50 5f 49 6e 73 65 72 74 2c 20 70 73 65 75 64 6f  P_Insert, pseudo
5db0: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  Tab, 0);.      f
5dc0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
5dd0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
5de0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5df0: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
5e00: 70 73 65 75 64 6f 54 61 62 2c 20 69 29 3b 0a 20  pseudoTab, i);. 
5e10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5e20: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
5e30: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
5e40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5e50: 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c  (v, OP_Callback,
5e60: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
5e70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5e80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5e90: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
5ea0: 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20   0, iParm);.    
5eb0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
5ec0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
5ed0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  lt: {.      /* D
5ee0: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
5ef0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5f00: 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
5f10: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
5f20: 20 6c 6f 6f 70 20 77 68 65 6e 20 74 68 65 20 4c   loop when the L
5f30: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 0a  IMIT is reached.
5f40: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
5f50: 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73  imit>=0 ){.    s
5f60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5f70: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d  v, OP_MemIncr, -
5f80: 31 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20  1, p->iLimit);. 
5f90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5fa0: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a  dOp(v, OP_IfMemZ
5fb0: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
5fc0: 62 72 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  brk);.  }..  /* 
5fd0: 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  The bottom of th
5fe0: 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
5ff0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
6000: 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a  Label(v, cont);.
6010: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6020: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  Op(v, OP_Next, i
6030: 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 73 71  Tab, addr);.  sq
6040: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
6050: 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20  Label(v, brk);. 
6060: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
6070: 43 61 6c 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73  Callback || eDes
6080: 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e  t==SRT_Subroutin
6090: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
60a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
60b0: 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62  Close, pseudoTab
60c0: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a  , 0);.  }..}../*
60d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
60e0: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
60f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6100: 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70  'declaration typ
6110: 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  e' of the.** exp
6120: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54  ression pExpr. T
6130: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
6140: 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74   treated as stat
6150: 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ic by the caller
6160: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c  ..**.** The decl
6170: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  aration type is 
6180: 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79  the exact dataty
6190: 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78  pe definition ex
61a0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
61b0: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45  .** original CRE
61c0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
61d0: 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ent if the expre
61e0: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
61f0: 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72  n. The.** declar
6200: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
6210: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
6220: 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79  INTEGER. Exactly
6230: 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73   when an express
6240: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  ion.** is consid
6250: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61  ered a column ca
6260: 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20  n be complex in 
6270: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
6280: 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a  subqueries. The.
6290: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  ** result-set ex
62a0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20  pression in all 
62b0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
62c0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
62d0: 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64  ts is .** consid
62e0: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79  ered a column by
62f0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
6300: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
6310: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
6320: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
6330: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
6340: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
6350: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29  CT col FROM tbl)
6360: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62  ;.**   SELECT ab
6370: 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63  c FROM (SELECT c
6380: 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74  ol AS abc FROM t
6390: 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  bl);.** .** The 
63a0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
63b0: 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73   for any express
63c0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ion other than a
63d0: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e   column is NULL.
63e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
63f0: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
6400: 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  e(.  NameContext
6410: 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a   *pNC, .  Expr *
6420: 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63  pExpr,.  const c
6430: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44 62  har **pzOriginDb
6440: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
6450: 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20 20  *pzOriginTab,.  
6460: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
6470: 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68  riginCol.){.  ch
6480: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20  ar const *zType 
6490: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
64a0: 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20 30  t *zOriginDb = 0
64b0: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
64c0: 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30 3b 0a  zOriginTab = 0;.
64d0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
64e0: 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  riginCol = 0;.  
64f0: 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70 45 78  int j;.  if( pEx
6500: 70 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70 53  pr==0 || pNC->pS
6510: 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75  rcList==0 ) retu
6520: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  rn 0;..  /* The 
6530: 54 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 20 63  TK_AS operator c
6540: 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 6e  an only occur in
6550: 20 4f 52 44 45 52 20 42 59 2c 20 47 52 4f 55 50   ORDER BY, GROUP
6560: 20 42 59 2c 20 48 41 56 49 4e 47 2c 0a 20 20 2a   BY, HAVING,.  *
6570: 2a 20 61 6e 64 20 4c 49 4d 49 54 20 63 6c 61 75  * and LIMIT clau
6580: 73 65 73 2e 20 20 42 75 74 20 70 45 78 70 72 20  ses.  But pExpr 
6590: 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74 68  originates in th
65a0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
65b0: 61 0a 20 20 2a 2a 20 53 45 4c 45 43 54 2e 20 20  a.  ** SELECT.  
65c0: 53 6f 20 70 45 78 70 72 20 63 61 6e 20 6e 65 76  So pExpr can nev
65d0: 65 72 20 63 6f 6e 74 61 69 6e 20 61 6e 20 41 53  er contain an AS
65e0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
65f0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
6600: 3e 6f 70 21 3d 54 4b 5f 41 53 20 29 3b 0a 0a 20  >op!=TK_AS );.. 
6610: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
6620: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
6630: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
6640: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
6650: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
6660: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
6670: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  e the column is 
6680: 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65  being.      ** e
6690: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e  xtracted from in
66a0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72   NameContext.pSr
66b0: 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c  cList. This tabl
66c0: 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20  e may be real.  
66d0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
66e0: 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75  table or a subqu
66f0: 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ery..      */.  
6700: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
6710: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
6720: 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  /* Table structu
6730: 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  re column is ext
6740: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
6750: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
6760: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
6770: 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63   /* Select the c
6780: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
6790: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
67a0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
67b0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20  r->iColumn;  /* 
67c0: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
67d0: 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20  in pTab */.     
67e0: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21   while( pNC && !
67f0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
6800: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
6810: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
6820: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  t;.        for(j
6830: 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  =0;j<pTabList->n
6840: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
6850: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
6860: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b  Expr->iTable;j++
6870: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
6880: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
6890: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
68a0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
68b0: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  j].pTab;.       
68c0: 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74     pS = pTabList
68d0: 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[j].pSelect;.
68e0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
68f0: 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70           pNC = p
6900: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  NC->pNext;.     
6910: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
6920: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
6930: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 49  ){.        /* FI
6940: 58 20 4d 45 3a 0a 20 20 20 20 20 20 20 20 2a 2a  X ME:.        **
6950: 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72 73   This can occurs
6960: 20 69 66 20 79 6f 75 20 68 61 76 65 20 73 6f 6d   if you have som
6970: 65 74 68 69 6e 67 20 6c 69 6b 65 20 22 53 45 4c  ething like "SEL
6980: 45 43 54 20 6e 65 77 2e 78 3b 22 20 69 6e 73 69  ECT new.x;" insi
6990: 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  de.        ** a 
69a0: 74 72 69 67 67 65 72 2e 20 20 49 6e 20 6f 74 68  trigger.  In oth
69b0: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 79 6f 75  er words, if you
69c0: 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
69d0: 70 65 63 69 61 6c 20 22 6e 65 77 22 0a 20 20 20  pecial "new".   
69e0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 6e       ** table in
69f0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
6a00: 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 57 65  of a select.  We
6a10: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 67   do not have a g
6a20: 6f 6f 64 20 77 61 79 0a 20 20 20 20 20 20 20 20  ood way.        
6a30: 2a 2a 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61  ** to find the a
6a40: 63 74 75 61 6c 20 74 61 62 6c 65 20 74 79 70 65  ctual table type
6a50: 2c 20 73 6f 20 63 61 6c 6c 20 69 74 20 22 54 45  , so call it "TE
6a60: 58 54 22 2e 20 20 54 68 69 73 20 69 73 20 72 65  XT".  This is re
6a70: 61 6c 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  ally.        ** 
6a80: 73 6f 6d 65 74 68 69 6e 67 20 6f 66 20 61 20 62  something of a b
6a90: 75 67 2c 20 62 75 74 20 49 20 64 6f 20 6e 6f 74  ug, but I do not
6aa0: 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 66 69 78   know how to fix
6ab0: 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a   it..        **.
6ac0: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
6ad0: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 72  code does not pr
6ae0: 6f 64 75 63 65 20 74 68 65 20 63 6f 72 72 65 63  oduce the correc
6af0: 74 20 61 6e 73 77 65 72 20 2d 20 69 74 20 6a 75  t answer - it ju
6b00: 73 74 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20  st prevents.    
6b10: 20 20 20 20 2a 2a 20 61 20 73 65 67 66 61 75 6c      ** a segfaul
6b20: 74 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  t.  See ticket #
6b30: 31 32 32 39 2e 0a 20 20 20 20 20 20 20 20 2a 2f  1229..        */
6b40: 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  .        zType =
6b50: 20 22 54 45 58 54 22 3b 0a 20 20 20 20 20 20 20   "TEXT";.       
6b60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
6b70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
6b80: 54 61 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  Tab );.#ifndef S
6b90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
6ba0: 45 52 59 0a 20 20 20 20 20 20 69 66 28 20 70 53  ERY.      if( pS
6bb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
6bc0: 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63  he "table" is ac
6bd0: 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c  tually a sub-sel
6be0: 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e  ect or a view in
6bf0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
6c00: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
6c10: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
6c20: 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ent. Return the 
6c30: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
6c40: 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20   and origin.    
6c50: 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20      ** data for 
6c60: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63  the result-set c
6c70: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62  olumn of the sub
6c80: 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20  -select..       
6c90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
6ca0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
6cb0: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  pS->pEList->nExp
6cc0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
6cd0: 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73  * If iCol is les
6ce0: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
6cf0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
6d00: 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20   requests the.  
6d10: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64          ** rowid
6d20: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
6d30: 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73  ct or view. This
6d40: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c   expression is l
6d50: 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20  egal (see .     
6d60: 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73       ** test cas
6d70: 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69  e misc2.2.2) - i
6d80: 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74  t always evaluat
6d90: 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20  es to NULL..    
6da0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
6db0: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
6dc0: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  NC;.          Ex
6dd0: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
6de0: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
6df0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  r;.          sNC
6e00: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
6e10: 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  pSrc;.          
6e20: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  sNC.pNext = 0;. 
6e30: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61           sNC.pPa
6e40: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
6e50: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
6e60: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
6e70: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69  &sNC, p, &zOrigi
6e80: 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62  nDb, &zOriginTab
6e90: 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20  , &zOriginCol); 
6ea0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6eb0: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
6ec0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
6ed0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
6ee0: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
6ef0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
6f00: 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20  rt( !pS );.     
6f10: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
6f20: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
6f30: 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ey;.        asse
6f40: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
6f50: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
6f60: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
6f70: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
6f80: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
6f90: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
6fa0: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  ";.          zOr
6fb0: 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f 77 69 64  iginCol = "rowid
6fc0: 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
6fd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
6fe0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
6ff0: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
7000: 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c        zOriginCol
7010: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
7020: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
7030: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72     }.        zOr
7040: 69 67 69 6e 54 61 62 20 3d 20 70 54 61 62 2d 3e  iginTab = pTab->
7050: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
7060: 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29  f( pNC->pParse )
7070: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
7080: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
7090: 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e  emaToIndex(pNC->
70a0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
70b0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
70c0: 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 44 62 20        zOriginDb 
70d0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pNC->pParse->d
70e0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
70f0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
7100: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7110: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
7120: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
7130: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
7140: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
7150: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
7160: 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  on is a sub-sele
7170: 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  ct. Return the d
7180: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
7190: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69  and.      ** ori
71a0: 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65  gin info for the
71b0: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69   single column i
71c0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
71d0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
71e0: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
71f0: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
7200: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
7210: 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  C;.      Select 
7220: 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 70 53 65  *pS = pExpr->pSe
7230: 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72  lect;.      Expr
7240: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
7250: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
7260: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
7270: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
7280: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
7290: 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50  NC;.      sNC.pP
72a0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
72b0: 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20  se;.      zType 
72c0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
72d0: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62  C, p, &zOriginDb
72e0: 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26  , &zOriginTab, &
72f0: 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20  zOriginCol); .  
7300: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7310: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20  .#endif.  }.  . 
7320: 20 69 66 28 20 70 7a 4f 72 69 67 69 6e 44 62 20   if( pzOriginDb 
7330: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
7340: 7a 4f 72 69 67 69 6e 54 61 62 20 26 26 20 70 7a  zOriginTab && pz
7350: 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20  OriginCol );.   
7360: 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a   *pzOriginDb = z
7370: 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70  OriginDb;.    *p
7380: 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72  zOriginTab = zOr
7390: 69 67 69 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a  iginTab;.    *pz
73a0: 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69  OriginCol = zOri
73b0: 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65  ginCol;.  }.  re
73c0: 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f  turn zType;.}../
73d0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
73e0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
73f0: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64  l the VDBE the d
7400: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73  eclaration types
7410: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
7420: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
7430: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7440: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
7450: 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ypes(.  Parse *p
7460: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
7470: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
7480: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
7490: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
74a0: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
74b0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
74c0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
74d0: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
74e0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20  sult set */.){. 
74f0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
7500: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
7510: 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
7520: 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63   sNC;.  sNC.pSrc
7530: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
7540: 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
7550: 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d  pParse;.  for(i=
7560: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
7570: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
7580: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
7590: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
75a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
75b0: 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  gDb = 0;.    con
75c0: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61  st char *zOrigTa
75d0: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
75e0: 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20   char *zOrigCol 
75f0: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
7600: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 63 6f 6c  har *zType = col
7610: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
7620: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
7630: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29  gTab, &zOrigCol)
7640: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64  ;..    /* The vd
7650: 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 27  be must make it'
7660: 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68  s own copy of th
7670: 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e  e column-type an
7680: 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20  d other .    ** 
7690: 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20  column specific 
76a0: 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65  strings, in case
76b0: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72   the schema is r
76c0: 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73  eset before this
76d0: 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
76e0: 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74  machine is delet
76f0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
7700: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
7710: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
7720: 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79  ME_DECLTYPE, zTy
7730: 70 65 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e 54  pe, P3_TRANSIENT
7740: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7750: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
7760: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42  i, COLNAME_DATAB
7770: 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 50 33  ASE, zOrigDb, P3
7780: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
7790: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
77a0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
77b0: 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69  NAME_TABLE, zOri
77c0: 67 54 61 62 2c 20 50 33 5f 54 52 41 4e 53 49 45  gTab, P3_TRANSIE
77d0: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
77e0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
77f0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c  , i, COLNAME_COL
7800: 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 50  UMN, zOrigCol, P
7810: 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  3_TRANSIENT);.  
7820: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
7830: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
7840: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
7850: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f   the names of co
7860: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
7870: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69  result set.  Thi
7880: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
7890: 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65   used to provide
78a0: 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20   the.** azCol[] 
78b0: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61  values in the ca
78c0: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
78d0: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
78e0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61  olumnNames(.  Pa
78f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7900: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
7910: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
7920: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
7930: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
7940: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
7950: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
7960: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
7970: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
7980: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
7990: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
79a0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71    int i, j;.  sq
79b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
79c0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75  se->db;.  int fu
79d0: 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61  llNames, shortNa
79e0: 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  mes;..#ifndef SQ
79f0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
7a00: 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  N.  /* If this i
7a10: 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
7a20: 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
7a30: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
7a40: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
7a50: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
7a60: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
7a70: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
7a80: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
7a90: 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d  v==0 || sqlite3M
7aa0: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20  allocFailed() ) 
7ab0: 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65  return;.  pParse
7ac0: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
7ad0: 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d  1;.  fullNames =
7ae0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
7af0: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
7b00: 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61  s)!=0;.  shortNa
7b10: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
7b20: 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
7b30: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
7b40: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
7b50: 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Cols(v, pEList->
7b60: 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d  nExpr);.  for(i=
7b70: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
7b80: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
7b90: 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70  pr *p;.    p = p
7ba0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
7bb0: 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  r;.    if( p==0 
7bc0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7bd0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
7be0: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
7bf0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
7c00: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
7c10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7c20: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
7c30: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
7c40: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
7c50: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63  zName));.      c
7c60: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
7c70: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
7c80: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c  _COLUMN && pTabL
7c90: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ist ){.      Tab
7ca0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
7cb0: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
7cc0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
7cd0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
7ce0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69  or(j=0; j<pTabLi
7cf0: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
7d00: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
7d10: 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a  or!=p->iTable; j
7d20: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65  ++){}.      asse
7d30: 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  rt( j<pTabList->
7d40: 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54  nSrc );.      pT
7d50: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
7d60: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
7d70: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
7d80: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
7d90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
7da0: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
7db0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
7dc0: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
7dd0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
7de0: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
7df0: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
7e00: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
7e10: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
7e20: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
7e30: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68   }.      if( !sh
7e40: 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c  ortNames && !ful
7e50: 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61  lNames && p->spa
7e60: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
7e70: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  [0] ){.        s
7e80: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
7e90: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
7ea0: 4d 45 5f 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29  ME_NAME, (char*)
7eb0: 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70  p->span.z, p->sp
7ec0: 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  an.n);.      }el
7ed0: 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73  se if( fullNames
7ee0: 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73   || (!shortNames
7ef0: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   && pTabList->nS
7f00: 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20  rc>1) ){.       
7f10: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
7f20: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
7f30: 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20  zTab;. .        
7f40: 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  zTab = pTabList-
7f50: 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20  >a[j].zAlias;.  
7f60: 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61        if( fullNa
7f70: 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29  mes || zTab==0 )
7f80: 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e   zTab = pTab->zN
7f90: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ame;.        sql
7fa0: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
7fb0: 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c  Name, zTab, ".",
7fc0: 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29   zCol, (char*)0)
7fd0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7fe0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
7ff0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8000: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 50 33 5f 44 59  ME, zName, P3_DY
8010: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  NAMIC);.      }e
8020: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
8030: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
8040: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
8050: 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 73 74 72  _NAME, zCol, str
8060: 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20  len(zCol));.    
8070: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
8080: 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70  ( p->span.z && p
8090: 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  ->span.z[0] ){. 
80a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
80b0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
80c0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28   COLNAME_NAME, (
80d0: 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c  char*)p->span.z,
80e0: 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20   p->span.n);.   
80f0: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62     /* sqlite3Vdb
8100: 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76  eCompressSpace(v
8110: 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20  , addr); */.    
8120: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
8130: 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20  r zName[30];.   
8140: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
8150: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  !=TK_COLUMN || p
8160: 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  TabList==0 );.  
8170: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4e 61 6d      sprintf(zNam
8180: 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  e, "column%d", i
8190: 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
81a0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
81b0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
81c0: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  AME, zName, 0);.
81d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65      }.  }.  gene
81e0: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
81f0: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
8200: 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69  , pEList);.}..#i
8210: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8220: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
8230: 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20  T./*.** Name of 
8240: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
8250: 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f  perator, used fo
8260: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
8270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
8280: 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70  t char *selectOp
8290: 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20  Name(int id){.  
82a0: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
82b0: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73  h( id ){.    cas
82c0: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20  e TK_ALL:       
82d0: 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b  z = "UNION ALL";
82e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
82f0: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
8300: 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22   z = "INTERSECT"
8310: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
8320: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
8330: 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20    z = "EXCEPT"; 
8340: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8350: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
8360: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20     z = "UNION"; 
8370: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
8380: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23  .  return z;.}.#
8390: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
83a0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
83b0: 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46  LECT */../*.** F
83c0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
83d0: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
83e0: 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28   prepSelectStmt(
83f0: 50 61 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a 29  Parse*, Select*)
8400: 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  ;../*.** Given a
8410: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
8420: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61  t, generate a Ta
8430: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
8440: 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20  at describes.** 
8450: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
8460: 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a  f that SELECT..*
8470: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
8480: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
8490: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
84a0: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 2c   char *zTabName,
84b0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
84c0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
84d0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
84e0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
84f0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  ;.  Column *aCol
8500: 2c 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69 66 28 20  , *pCol;..  if( 
8510: 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70  prepSelectStmt(p
8520: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20  Parse, pSelect) 
8530: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
8540: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
8550: 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
8560: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
8570: 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
8580: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20  n 0;.  }.  pTab 
8590: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
85a0: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b  sizeof(Table) );
85b0: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
85c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
85d0: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66    }.  pTab->nRef
85e0: 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e   = 1;.  pTab->zN
85f0: 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f  ame = zTabName ?
8600: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 54   sqliteStrDup(zT
8610: 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70  abName) : 0;.  p
8620: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
8630: 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d  >pEList;.  pTab-
8640: 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e  >nCol = pEList->
8650: 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  nExpr;.  assert(
8660: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b   pTab->nCol>0 );
8670: 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  .  pTab->aCol = 
8680: 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  aCol = sqliteMal
8690: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 54 61 62  loc( sizeof(pTab
86a0: 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d  ->aCol[0])*pTab-
86b0: 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69  >nCol );.  for(i
86c0: 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69  =0, pCol=aCol; i
86d0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
86e0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 45  , pCol++){.    E
86f0: 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a 20 20 20  xpr *p, *pR;.   
8700: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20   char *zType;.  
8710: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
8720: 20 20 20 63 68 61 72 20 2a 7a 42 61 73 65 6e 61     char *zBasena
8730: 6d 65 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  me;.    CollSeq 
8740: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20  *pColl;.    int 
8750: 63 6e 74 3b 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  cnt;.    NameCon
8760: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 0a 20  text sNC;.    . 
8770: 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70     /* Get an app
8780: 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f  ropriate name fo
8790: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  r the column.   
87a0: 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69   */.    p = pELi
87b0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
87c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
87d0: 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  Right==0 || p->p
87e0: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d  Right->token.z==
87f0: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e  0 || p->pRight->
8800: 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b  token.z[0]!=0 );
8810: 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20  .    if( (zName 
8820: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
8830: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
8840: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
8850: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22  mn contains an "
8860: 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73  AS <name>" phras
8870: 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73  e, use <name> as
8880: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
8890: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
88a0: 65 53 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b 0a  eStrDup(zName);.
88b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
88c0: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20  >op==TK_DOT .   
88d0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
88e0: 52 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30 20  R=p->pRight)!=0 
88f0: 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26  && pR->token.z &
8900: 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  & pR->token.z[0]
8910: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72   ){.      /* For
8920: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
8930: 66 72 6f 6d 20 41 2e 42 20 75 73 65 20 42 20 61  from A.B use B a
8940: 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
8950: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
8960: 74 65 33 4d 50 72 69 6e 74 66 28 22 25 54 22 2c  te3MPrintf("%T",
8970: 20 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20   &pR->token);.  
8980: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73    }else if( p->s
8990: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
89a0: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f  .z[0] ){.      /
89b0: 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e  * Use the origin
89c0: 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  al text of the c
89d0: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
89e0: 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a   as its name */.
89f0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
8a00: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 54  lite3MPrintf("%T
8a10: 22 2c 20 26 70 2d 3e 73 70 61 6e 29 3b 0a 20 20  ", &p->span);.  
8a20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
8a30: 2a 20 49 66 20 61 6c 6c 20 65 6c 73 65 20 66 61  * If all else fa
8a40: 69 6c 73 2c 20 6d 61 6b 65 20 75 70 20 61 20 6e  ils, make up a n
8a50: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
8a60: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
8a70: 6e 74 66 28 22 63 6f 6c 75 6d 6e 25 64 22 2c 20  ntf("column%d", 
8a80: 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i+1);.    }.    
8a90: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
8aa0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73  Name);.    if( s
8ab0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
8ac0: 65 64 28 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ed() ){.      sq
8ad0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
8ae0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
8af0: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 54 61  leteTable(0, pTa
8b00: 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  b);.      return
8b10: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
8b20: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
8b30: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75  column name is u
8b40: 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e  nique.  If the n
8b50: 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  ame is not uniqu
8b60: 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64  e,.    ** append
8b70: 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68   a integer to th
8b80: 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69  e name so that i
8b90: 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65  t becomes unique
8ba0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 42 61  ..    */.    zBa
8bb0: 73 65 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  sename = zName;.
8bc0: 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b      for(j=cnt=0;
8bd0: 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<i; j++){.    
8be0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
8bf0: 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  ICmp(aCol[j].zNa
8c00: 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  me, zName)==0 ){
8c10: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
8c20: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8c30: 22 25 73 3a 25 64 22 2c 20 7a 42 61 73 65 6e 61  "%s:%d", zBasena
8c40: 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20  me, ++cnt);.    
8c50: 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20      j = -1;.    
8c60: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
8c70: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
8c80: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
8c90: 7a 42 61 73 65 6e 61 6d 65 21 3d 7a 4e 61 6d 65  zBasename!=zName
8ca0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8cb0: 46 72 65 65 28 7a 42 61 73 65 6e 61 6d 65 29 3b  Free(zBasename);
8cc0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d  .    }.    pCol-
8cd0: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
8ce0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
8cf0: 74 79 70 65 6e 61 6d 65 2c 20 74 79 70 65 20 61  typename, type a
8d00: 66 66 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c  ffinity, and col
8d10: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
8d20: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  for the.    ** c
8d30: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  olumn..    */.  
8d40: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
8d50: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
8d60: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
8d70: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
8d80: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71  ;.    zType = sq
8d90: 6c 69 74 65 53 74 72 44 75 70 28 63 6f 6c 75 6d  liteStrDup(colum
8da0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
8db0: 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70 43  , 0, 0));.    pC
8dc0: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a 54 79 70  ol->zType = zTyp
8dd0: 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  e;.    pCol->aff
8de0: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
8df0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a  xprAffinity(p);.
8e00: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
8e10: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
8e20: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
8e30: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
8e40: 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20    pCol->zColl = 
8e50: 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 43 6f  sqliteStrDup(pCo
8e60: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
8e70: 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50  }.  }.  pTab->iP
8e80: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  Key = -1;.  retu
8e90: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
8ea0: 2a 20 50 72 65 70 61 72 65 20 61 20 53 45 4c 45  * Prepare a SELE
8eb0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  CT statement for
8ec0: 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20 64   processing by d
8ed0: 6f 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  oing the followi
8ee0: 6e 67 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a  ng.** things:.**
8ef0: 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65  .**    (1)  Make
8f00: 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f   sure VDBE curso
8f10: 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
8f20: 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
8f30: 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  every.**        
8f40: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
8f50: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
8f60: 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20  **    (2)  Fill 
8f70: 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
8f80: 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
8f90: 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
8fa0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
8fb0: 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c   defines FROM cl
8fc0: 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77  ause.  When view
8fd0: 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  s appear in the 
8fe0: 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20  FROM clause,.** 
8ff0: 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61          fill pTa
9000: 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65  bList->a[].pSele
9010: 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  ct with a copy o
9020: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
9030: 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
9040: 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74    that implement
9050: 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63  s the view.  A c
9060: 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
9070: 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54  he view's SELECT
9080: 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74  .**         stat
9090: 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65  ement so that we
90a0: 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69   can freely modi
90b0: 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61  fy or delete tha
90c0: 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  t statement.**  
90d0: 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77         without w
90e0: 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65  orrying about me
90f0: 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 72 65  ssing up the pre
9100: 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e  sistent represen
9110: 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tation.**       
9120: 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a    of the view..*
9130: 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64  *.**    (3)  Add
9140: 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48   terms to the WH
9150: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63  ERE clause to ac
9160: 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54  comodate the NAT
9170: 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20  URAL keyword.** 
9180: 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73          on joins
9190: 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20   and the ON and 
91a0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
91b0: 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  joins..**.**    
91c0: 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69  (4)  Scan the li
91d0: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  st of columns in
91e0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
91f0: 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67  (pEList) looking
9200: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20  .**         for 
9210: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
9220: 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72   "*" operator or
9230: 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65   the TABLE.* ope
9240: 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20  rator..**       
9250: 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61    If found, expa
9260: 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62  nd each "*" to b
9270: 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
9280: 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a  n every table.**
9290: 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42           and TAB
92a0: 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79  LE.* to be every
92b0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45   column in TABLE
92c0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
92d0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
92e0: 20 74 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c   there are probl
92f0: 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  ems, leave an er
9300: 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
9310: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
9320: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
9330: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 70  .static int prep
9340: 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65  SelectStmt(Parse
9350: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
9360: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a   *p){.  int i, j
9370: 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69  , k, rc;.  SrcLi
9380: 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
9390: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
93a0: 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
93b0: 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
93c0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
93d0: 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c  ->pSrc==0 || sql
93e0: 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
93f0: 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  () ){.    return
9400: 20 31 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69   1;.  }.  pTabLi
9410: 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
9420: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
9430: 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  st;..  /* Make s
9440: 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ure cursor numbe
9450: 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
9460: 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74  igned to all ent
9470: 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65  ries in.  ** the
9480: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
9490: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
94a0: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ment..  */.  sql
94b0: 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
94c0: 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
94d0: 20 70 2d 3e 70 53 72 63 29 3b 0a 0a 20 20 2f 2a   p->pSrc);..  /*
94e0: 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74   Look up every t
94f0: 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  able named in th
9500: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
9510: 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66   the select.  If
9520: 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f  .  ** an entry o
9530: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
9540: 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  e is a subquery 
9550: 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62  instead of a tab
9560: 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a  le or view,.  **
9570: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74   then create a t
9580: 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
9590: 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63  tructure to desc
95a0: 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72  ribe the subquer
95b0: 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
95c0: 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
95d0: 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
95e0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
95f0: 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
9600: 20 2a 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20   *pTab;.    if( 
9610: 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29  pFrom->pTab!=0 )
9620: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
9630: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c  statement has al
9640: 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 61  ready been prepa
9650: 72 65 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e  red.  There is n
9660: 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20  o need.      ** 
9670: 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a  to go further. *
9680: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
9690: 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65  i==0 );.      re
96a0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
96b0: 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61    if( pFrom->zNa
96c0: 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  me==0 ){.#ifndef
96d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
96e0: 51 55 45 52 59 0a 20 20 20 20 20 20 2f 2a 20 41  QUERY.      /* A
96f0: 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
9700: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
9710: 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
9720: 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
9730: 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ->pSelect!=0 );.
9740: 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
9750: 3e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20  >zAlias==0 ){.  
9760: 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c        pFrom->zAl
9770: 69 61 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20  ias =.          
9780: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
9790: 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f  sqlite_subquery_
97a0: 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 46 72  %p_", (void*)pFr
97b0: 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  om->pSelect);.  
97c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
97d0: 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
97e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  =0 );.      pFro
97f0: 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
9800: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
9810: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
9820: 63 74 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  ct(pParse, pFrom
9830: 2d 3e 7a 41 6c 69 61 73 2c 20 70 46 72 6f 6d 2d  ->zAlias, pFrom-
9840: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
9850: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
9860: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
9870: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9880: 2f 2a 20 54 68 65 20 69 73 54 72 61 6e 73 69 65  /* The isTransie
9890: 6e 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  nt flag indicate
98a0: 73 20 74 68 61 74 20 74 68 65 20 54 61 62 6c 65  s that the Table
98b0: 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20 62   structure has b
98c0: 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e  een.      ** dyn
98d0: 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
98e0: 65 64 20 61 6e 64 20 6d 61 79 20 62 65 20 66 72  ed and may be fr
98f0: 65 65 64 20 61 74 20 61 6e 79 20 74 69 6d 65 2e  eed at any time.
9900: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
9910: 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54 61 62 20  ,.      ** pTab 
9920: 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
9930: 74 6f 20 61 20 70 65 72 73 69 73 74 65 6e 74 20  to a persistent 
9940: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
9950: 74 68 61 74 20 64 65 66 69 6e 65 73 0a 20 20 20  that defines.   
9960: 20 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68     ** part of th
9970: 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20  e schema. */.   
9980: 20 20 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73     pTab->isTrans
9990: 69 65 6e 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66  ient = 1;.#endif
99a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
99b0: 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
99c0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
99d0: 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
99e0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
99f0: 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
9a00: 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
9a10: 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
9a20: 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71  ab = .        sq
9a30: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
9a40: 28 70 50 61 72 73 65 2c 70 46 72 6f 6d 2d 3e 7a  (pParse,pFrom->z
9a50: 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74  Name,pFrom->zDat
9a60: 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66  abase);.      if
9a70: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
9a80: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
9a90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
9aa0: 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 6e 64  b->nRef++;.#ifnd
9ab0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
9ac0: 49 45 57 0a 20 20 20 20 20 20 69 66 28 20 70 54  IEW.      if( pT
9ad0: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
9ae0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61         /* We rea
9af0: 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e  ch here if the n
9b00: 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20  amed table is a 
9b10: 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f  really a view */
9b20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
9b30: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
9b40: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
9b50: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
9b60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
9b70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
9b80: 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65   If pFrom->pSele
9b90: 63 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20 77  ct!=0 it means w
9ba0: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
9bb0: 74 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  th a.        ** 
9bc0: 76 69 65 77 20 77 69 74 68 69 6e 20 61 20 76 69  view within a vi
9bd0: 65 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20  ew.  The SELECT 
9be0: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 61 6c  structure has al
9bf0: 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 20  ready been.     
9c00: 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79 20     ** copied by 
9c10: 74 68 65 20 6f 75 74 65 72 20 76 69 65 77 20 73  the outer view s
9c20: 6f 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74 68  o we can skip th
9c30: 65 20 63 6f 70 79 20 73 74 65 70 20 68 65 72 65  e copy step here
9c40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
9c50: 68 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20  he inner view.. 
9c60: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
9c70: 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 53 65    if( pFrom->pSe
9c80: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
9c90: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c       pFrom->pSel
9ca0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
9cb0: 65 63 74 44 75 70 28 70 54 61 62 2d 3e 70 53 65  ectDup(pTab->pSe
9cc0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  lect);.        }
9cd0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
9ce0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9cf0: 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20  Process NATURAL 
9d00: 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e  keywords, and ON
9d10: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
9d20: 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a  es of joins..  *
9d30: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50 72  /.  if( sqlitePr
9d40: 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65  ocessJoin(pParse
9d50: 2c 20 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , p) ) return 1;
9d60: 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79  ..  /* For every
9d70: 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73   "*" that occurs
9d80: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
9d90: 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ist, insert the 
9da0: 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c  names of.  ** al
9db0: 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
9dc0: 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f   tables.  And fo
9dd0: 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20  r every TABLE.* 
9de0: 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
9df0: 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c  .  ** of all col
9e00: 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20  umns in TABLE.  
9e10: 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72  The parser inser
9e20: 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78  ted a special ex
9e30: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69  pression.  ** wi
9e40: 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70  th the TK_ALL op
9e50: 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
9e60: 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
9e70: 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
9e80: 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66  list..  ** The f
9e90: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
9ea0: 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
9eb0: 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72   the TK_ALL expr
9ec0: 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61  essions and expa
9ed0: 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65  nd.  ** each one
9ee0: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
9ef0: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
9f00: 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ll tables..  **.
9f10: 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c    ** The first l
9f20: 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20  oop just checks 
9f30: 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
9f40: 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72  are any "*" oper
9f50: 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20  ators.  ** that 
9f60: 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a  need expanding..
9f70: 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
9f80: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
9f90: 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   k++){.    Expr 
9fa0: 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  *pE = pEList->a[
9fb0: 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
9fc0: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ( pE->op==TK_ALL
9fd0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
9fe0: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
9ff0: 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26   && pE->pRight &
a000: 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
a010: 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20  ==TK_ALL.       
a020: 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26    && pE->pLeft &
a030: 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
a040: 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a  =TK_ID ) break;.
a050: 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20    }.  rc = 0;.  
a060: 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
a070: 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  xpr ){.    /*.  
a080: 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68    ** If we get h
a090: 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ere it means the
a0a0: 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74   result set cont
a0b0: 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
a0c0: 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72   "*".    ** oper
a0d0: 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ators that need 
a0e0: 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20  to be expanded. 
a0f0: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
a100: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  ch expression.  
a110: 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
a120: 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e  lt set and expan
a130: 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e  d them one by on
a140: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
a150: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
a160: 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e  em *a = pEList->
a170: 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  a;.    ExprList 
a180: 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69  *pNew = 0;.    i
a190: 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73  nt flags = pPars
a1a0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20  e->db->flags;.  
a1b0: 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20    int longNames 
a1c0: 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
a1d0: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
a1e0: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61              (fla
a200: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
a210: 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a  tColNames)==0;..
a220: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
a230: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
a240: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
a250: 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b  pE = a[k].pExpr;
a260: 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
a270: 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20  p!=TK_ALL &&.   
a280: 20 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21          (pE->op!
a290: 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
a2a0: 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  Right==0 || pE->
a2b0: 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41  pRight->op!=TK_A
a2c0: 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  LL) ){.        /
a2d0: 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
a2e0: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
a2f0: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
a300: 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
a310: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
a320: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
a330: 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c  ListAppend(pNew,
a340: 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b   a[k].pExpr, 0);
a350: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
a360: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  w ){.          p
a370: 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
a380: 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b  pr-1].zName = a[
a390: 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  k].zName;.      
a3a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a3b0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
a3c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b     }.        a[k
a3d0: 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ].pExpr = 0;.   
a3e0: 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20       a[k].zName 
a3f0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
a400: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
a410: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
a420: 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c  a "*" or a "TABL
a430: 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74  E.*" and needs t
a440: 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  o be.        ** 
a450: 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20  expanded. */.   
a460: 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65       int tableSe
a470: 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  en = 0;      /* 
a480: 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41  Set to 1 when TA
a490: 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20  BLE matches */. 
a4a0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e         char *zTN
a4b0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
a4c0: 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20  /* text of name 
a4d0: 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  of TABLE */.    
a4e0: 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
a4f0: 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c  TK_DOT && pE->pL
a500: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eft ){.         
a510: 20 7a 54 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65   zTName = sqlite
a520: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26  3NameFromToken(&
a530: 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  pE->pLeft->token
a540: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
a550: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  {.          zTNa
a560: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
a570: 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
a580: 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
a590: 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
a5a0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
a5b0: 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
a5c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
a5d0: 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
a5e0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
a5f0: 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41  Name = pFrom->zA
a600: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
a610: 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
a620: 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d  || zTabName[0]==
a630: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
a640: 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
a650: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
a660: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
a670: 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 28 7a  if( zTName && (z
a680: 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54  TabName==0 || zT
a690: 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20  abName[0]==0 || 
a6a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a6b0: 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70    sqlite3StrICmp
a6c0: 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  (zTName, zTabNam
a6d0: 65 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  e)!=0) ){.      
a6e0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
a6f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a700: 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
a710: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 1;.          f
a720: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
a730: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
a740: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
a750: 78 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20  xpr, *pRight;.  
a760: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
a770: 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
a780: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20  ol[j].zName;..  
a790: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
a7a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
a7b0: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
a7c0: 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20  t_item *pLeft = 
a7d0: 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31  &pTabList->a[i-1
a7e0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
a7f0: 20 69 66 28 20 28 70 4c 65 66 74 2d 3e 6a 6f 69   if( (pLeft->joi
a800: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
a810: 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  AL)!=0 &&.      
a820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a830: 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c    columnIndex(pL
a840: 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65  eft->pTab, zName
a850: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
a860: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
a870: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
a880: 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
a890: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
a8b0: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
a8c0: 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ght */.         
a8d0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
a8e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
a8f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
a900: 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  f( sqlite3IdList
a910: 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 55 73  Index(pLeft->pUs
a920: 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  ing, zName)>=0 )
a930: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
a940: 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77    /* In a join w
a950: 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75  ith a USING clau
a960: 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73  se, omit columns
a970: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
a980: 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67          ** using
a990: 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
a9a0: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
a9b0: 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ght. */.        
a9c0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
a9d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a9e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
aa00: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
aa10: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29  (TK_ID, 0, 0, 0)
aa20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
aa30: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72  ( pRight==0 ) br
aa40: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
aa50: 20 73 65 74 54 6f 6b 65 6e 28 26 70 52 69 67 68   setToken(&pRigh
aa60: 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29  t->token, zName)
aa70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
aa80: 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 28 6c  ( zTabName && (l
aa90: 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62  ongNames || pTab
aaa0: 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b  List->nSrc>1) ){
aab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
aac0: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c  xpr *pLeft = sql
aad0: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
aae0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
aaf0: 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
ab00: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44  sqlite3Expr(TK_D
ab10: 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
ab20: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
ab30: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d       if( pExpr==
ab40: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
ab50: 20 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65           setToke
ab60: 6e 28 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c  n(&pLeft->token,
ab70: 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20   zTabName);.    
ab80: 20 20 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b            setTok
ab90: 65 6e 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c  en(&pExpr->span,
aba0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
abb0: 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
abc0: 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  e, zName));.    
abd0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
abe0: 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20  >span.dyn = 1;. 
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
ac00: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b  pr->token.z = 0;
ac10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
ac20: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  Expr->token.n = 
ac30: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
ac40: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79   pExpr->token.dy
ac50: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
ac60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ac70: 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
ac80: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
ac90: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
aca0: 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  n = pExpr->token
acb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
acc0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
acd0: 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20  longNames ){.   
ace0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
acf0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
ad00: 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 70 45  tAppend(pNew, pE
ad10: 78 70 72 2c 20 26 70 45 78 70 72 2d 3e 73 70 61  xpr, &pExpr->spa
ad20: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
ad30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ad40: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
ad50: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
ad60: 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26  d(pNew, pExpr, &
ad70: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a  pRight->token);.
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
ad90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ada0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
adb0: 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20  !tableSeen ){.  
adc0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
add0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
ade0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
adf0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
ae00: 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a  ch table: %s", z
ae10: 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  TName);.        
ae20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ae30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
ae40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
ae50: 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65   tables specifie
ae60: 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  d");.          }
ae70: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
ae80: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
ae90: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
aea0: 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  zTName);.      }
aeb0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
aec0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
aed0: 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  (pEList);.    p-
aee0: 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
aef0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
af00: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
af10: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
af20: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68  _SELECT./*.** Th
af30: 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 6f 63  is routine assoc
af40: 69 61 74 65 73 20 65 6e 74 72 69 65 73 20 69 6e  iates entries in
af50: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 65 78 70   an ORDER BY exp
af60: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 77 69 74  ression list wit
af70: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  h.** columns in 
af80: 61 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 65  a result.  For e
af90: 61 63 68 20 4f 52 44 45 52 20 42 59 20 65 78 70  ach ORDER BY exp
afa0: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 6f 70 63  ression, the opc
afb0: 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f  ode of.** the to
afc0: 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20  p-level node is 
afd0: 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f  changed to TK_CO
afe0: 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20 69 43 6f  LUMN and the iCo
aff0: 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  lumn value of.**
b000: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e   the top-level n
b010: 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 69 6e  ode is filled in
b020: 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d   with column num
b030: 62 65 72 20 61 6e 64 20 74 68 65 20 69 54 61 62  ber and the iTab
b040: 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74  le.** value of t
b050: 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64  he top-level nod
b060: 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  e is filled with
b070: 20 69 54 61 62 6c 65 20 70 61 72 61 6d 65 74 65   iTable paramete
b080: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  r..**.** If ther
b090: 65 20 61 72 65 20 70 72 69 6f 72 20 53 45 4c 45  e are prior SELE
b0a0: 43 54 20 63 6c 61 75 73 65 73 2c 20 74 68 65 79  CT clauses, they
b0b0: 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 66   are processed f
b0c0: 69 72 73 74 2e 20 20 41 20 6d 61 74 63 68 0a 2a  irst.  A match.*
b0d0: 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69 65 72 20  * in an earlier 
b0e0: 53 45 4c 45 43 54 20 74 61 6b 65 73 20 70 72 65  SELECT takes pre
b0f0: 63 65 64 65 6e 63 65 20 6f 76 65 72 20 61 20 6c  cedence over a l
b100: 61 74 65 72 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  ater SELECT..**.
b110: 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20 74 68 61  ** Any entry tha
b120: 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  t does not match
b130: 20 69 73 20 66 6c 61 67 67 65 64 20 61 73 20 61   is flagged as a
b140: 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6e 75  n error.  The nu
b150: 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
b160: 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s is returned..*
b170: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74  /.static int mat
b180: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
b190: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
b1a0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
b1b0: 41 20 70 6c 61 63 65 20 74 6f 20 6c 65 61 76 65  A place to leave
b1c0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
b1d0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
b1e0: 6c 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  lect,        /* 
b1f0: 4d 61 74 63 68 20 74 6f 20 72 65 73 75 6c 74 20  Match to result 
b200: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 69 73 20  columns of this 
b210: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45 78 70 72  SELECT */.  Expr
b220: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
b230: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
b240: 20 42 59 20 76 61 6c 75 65 73 20 74 6f 20 6d 61   BY values to ma
b250: 74 63 68 20 61 67 61 69 6e 73 74 20 63 6f 6c 75  tch against colu
b260: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  mns */.  int iTa
b270: 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
b280: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 69 73 20   /* Insert this 
b290: 76 61 6c 75 65 20 69 6e 20 69 54 61 62 6c 65 20  value in iTable 
b2a0: 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d  */.  int mustCom
b2b0: 70 6c 65 74 65 20 20 20 20 20 20 20 20 2f 2a 20  plete        /* 
b2c0: 49 66 20 54 52 55 45 20 61 6c 6c 20 4f 52 44 45  If TRUE all ORDE
b2d0: 52 20 42 59 73 20 6d 75 73 74 20 6d 61 74 63 68  R BYs must match
b2e0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72   */.){.  int nEr
b2f0: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20  r = 0;.  int i, 
b300: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
b310: 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 53  EList;..  if( pS
b320: 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64  elect==0 || pOrd
b330: 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  erBy==0 ) return
b340: 20 31 3b 0a 20 20 69 66 28 20 6d 75 73 74 43 6f   1;.  if( mustCo
b350: 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 66 6f  mplete ){.    fo
b360: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
b370: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20  y->nExpr; i++){ 
b380: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
b390: 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20  one = 0; }.  }. 
b3a0: 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53   if( prepSelectS
b3b0: 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  tmt(pParse, pSel
b3c0: 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
b3d0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
b3e0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
b3f0: 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 74 63 68  ){.    if( match
b400: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
b410: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
b420: 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65 72 42  >pPrior, pOrderB
b430: 79 2c 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b  y, iTable, 0) ){
b440: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
b450: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c  .    }.  }.  pEL
b460: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
b470: 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  EList;.  for(i=0
b480: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
b490: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
b4a0: 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72  xpr *pE = pOrder
b4b0: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
b4c0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d      int iCol = -
b4d0: 31 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  1;.    if( pOrde
b4e0: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29  rBy->a[i].done )
b4f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
b500: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
b510: 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
b520: 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l) ){.      if( 
b530: 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e  iCol<=0 || iCol>
b540: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
b550: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b560: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
b570: 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45  .          "ORDE
b580: 52 20 42 59 20 70 6f 73 69 74 69 6f 6e 20 25 64  R BY position %d
b590: 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65   should be betwe
b5a0: 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a 20 20  en 1 and %d",.  
b5b0: 20 20 20 20 20 20 20 20 69 43 6f 6c 2c 20 70 45          iCol, pE
b5c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
b5d0: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
b5e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b5f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
b600: 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 20 63  mustComplete ) c
b610: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
b620: 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Col--;.    }.   
b630: 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30   for(j=0; iCol<0
b640: 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45   && j<pEList->nE
b650: 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
b660: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a   if( pEList->a[j
b670: 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e  ].zName && (pE->
b680: 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d  op==TK_ID || pE-
b690: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20  >op==TK_STRING) 
b6a0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
b6b0: 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b  *zName, *zLabel;
b6c0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
b6d0: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e   pEList->a[j].zN
b6e0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61  ame;.        zLa
b6f0: 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  bel = sqlite3Nam
b700: 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e  eFromToken(&pE->
b710: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  token);.        
b720: 61 73 73 65 72 74 28 20 7a 4c 61 62 65 6c 21 3d  assert( zLabel!=
b730: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
b740: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
b750: 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d  zName, zLabel)==
b760: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
b770: 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20  iCol = j;.      
b780: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
b790: 74 65 46 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a  teFree(zLabel);.
b7a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
b7b0: 28 20 69 43 6f 6c 3c 30 20 26 26 20 73 71 6c 69  ( iCol<0 && sqli
b7c0: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
b7d0: 45 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  E, pEList->a[j].
b7e0: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
b7f0: 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20    iCol = j;.    
b800: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
b810: 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
b820: 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43     pE->op = TK_C
b830: 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45 2d  OLUMN;.      pE-
b840: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b  >iColumn = iCol;
b850: 0a 20 20 20 20 20 20 70 45 2d 3e 69 54 61 62 6c  .      pE->iTabl
b860: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
b870: 20 20 70 45 2d 3e 69 41 67 67 20 3d 20 2d 31 3b    pE->iAgg = -1;
b880: 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d  .      pOrderBy-
b890: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a  >a[i].done = 1;.
b8a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
b8b0: 6f 6c 3c 30 20 26 26 20 6d 75 73 74 43 6f 6d 70  ol<0 && mustComp
b8c0: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71  lete ){.      sq
b8d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
b8e0: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 4f  arse,.        "O
b8f0: 52 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d  RDER BY term num
b900: 62 65 72 20 25 64 20 64 6f 65 73 20 6e 6f 74 20  ber %d does not 
b910: 6d 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74  match any result
b920: 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a   column", i+1);.
b930: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
b940: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b950: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45  .  }.  return nE
b960: 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  rr;  .}.#endif /
b970: 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
b980: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
b990: 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
b9a0: 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
b9b0: 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
b9c0: 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
b9d0: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
b9e0: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
b9f0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
ba00: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
ba10: 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
ba20: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64  in pParse..*/.Vd
ba30: 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64  be *sqlite3GetVd
ba40: 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  be(Parse *pParse
ba50: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
ba60: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
ba70: 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
ba80: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
ba90: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  e = sqlite3VdbeC
baa0: 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62  reate(pParse->db
bab0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
bac0: 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  v;.}.../*.** Com
bad0: 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20  pute the iLimit 
bae0: 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c  and iOffset fiel
baf0: 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ds of the SELECT
bb00: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
bb10: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
bb20: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  set expressions.
bb30: 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66    pLimit and pOf
bb40: 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78  fset hold the ex
bb50: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
bb60: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
bb70: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
bb80: 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65  tement after the
bb90: 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
bba0: 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20  T.** keywords.  
bbb0: 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65  Or NULL if those
bbc0: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d   keywords are om
bbd0: 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e  itted. iLimit an
bbe0: 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72  d iOffset .** ar
bbf0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65  e the integer me
bc00: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75  mory register nu
bc10: 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65  mbers for counte
bc20: 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  rs used to compu
bc30: 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74  te .** the limit
bc40: 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
bc50: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d   there is no lim
bc60: 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74  it and/or offset
bc70: 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69  , then .** iLimi
bc80: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
bc90: 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  e negative..**.*
bca0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
bcb0: 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
bcc0: 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20  s of iLimit and 
bcd0: 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a  iOffset only if.
bce0: 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66  ** a limit or of
bcf0: 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20  fset is defined 
bd00: 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  by pLimit and pO
bd10: 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61  ffset.  iLimit a
bd20: 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68  nd.** iOffset sh
bd30: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
bd40: 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72  reset to appropr
bd50: 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c  iate default val
bd60: 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20  ues.** (usually 
bd70: 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d  but not always -
bd80: 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  1) prior to call
bd90: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
bda0: 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69  ..** Only if pLi
bdb0: 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65  mit!=0 or pOffse
bdc0: 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69  t!=0 do the limi
bdd0: 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a  t registers get.
bde0: 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54  ** redefined.  T
bdf0: 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
be00: 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20  rator uses this 
be10: 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63  property to forc
be20: 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f  e.** the reuse o
be30: 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74  f the same limit
be40: 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69   and offset regi
be50: 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c  sters across mul
be60: 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20  tiple.** SELECT 
be70: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
be80: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
be90: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
bea0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
beb0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
bec0: 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a  Break){.  Vdbe *
bed0: 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69  v = 0;.  int iLi
bee0: 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  mit = 0;.  int i
bef0: 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64  Offset;.  int ad
bf00: 64 72 31 2c 20 61 64 64 72 32 3b 0a 0a 20 20 2f  dr1, addr2;..  /
bf10: 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d  * .  ** "LIMIT -
bf20: 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20  1" always shows 
bf30: 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65  all rows.  There
bf40: 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f   is some.  ** co
bf50: 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20  ntraversy about 
bf60: 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  what the correct
bf70: 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64   behavior should
bf80: 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75   be..  ** The cu
bf90: 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
bfa0: 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
bfb0: 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61  "LIMIT 0" to mea
bfc0: 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a  n.  ** no rows..
bfd0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c    */.  if( p->pL
bfe0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69  imit ){.    p->i
bff0: 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d  Limit = iLimit =
c000: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
c010: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
c020: 2b 3d 20 32 3b 0a 20 20 20 20 76 20 3d 20 73 71  += 2;.    v = sq
c030: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
c040: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
c050: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
c060: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c070: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d  (pParse, p->pLim
c080: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
c090: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c0a0: 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29  MustBeInt, 0, 0)
c0b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c0c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
c0d0: 53 74 6f 72 65 2c 20 69 4c 69 6d 69 74 2c 20 30  Store, iLimit, 0
c0e0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
c0f0: 6e 74 28 28 76 2c 20 22 23 20 4c 49 4d 49 54 20  nt((v, "# LIMIT 
c100: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
c110: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c120: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f  (v, OP_IfMemZero
c130: 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  , iLimit, iBreak
c140: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
c150: 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70  pOffset ){.    p
c160: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  ->iOffset = iOff
c170: 73 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  set = pParse->nM
c180: 65 6d 2b 2b 3b 0a 20 20 20 20 76 20 3d 20 73 71  em++;.    v = sq
c190: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
c1a0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
c1b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
c1c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c1d0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66  (pParse, p->pOff
c1e0: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
c1f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c200: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30  _MustBeInt, 0, 0
c210: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c220: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
c230: 6d 53 74 6f 72 65 2c 20 69 4f 66 66 73 65 74 2c  mStore, iOffset,
c240: 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 29 3b 0a   p->pLimit==0);.
c250: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
c260: 28 76 2c 20 22 23 20 4f 46 46 53 45 54 20 63 6f  (v, "# OFFSET co
c270: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 61 64  unter"));.    ad
c280: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
c290: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d  eAddOp(v, OP_IfM
c2a0: 65 6d 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20  emPos, iOffset, 
c2b0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
c2c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
c2d0: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  op, 1, 0);.    s
c2e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c2f0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
c300: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
c310: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
c320: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 69 66 28   addr1);.    if(
c330: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
c340: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c350: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 2c 20  ddOp(v, OP_Add, 
c360: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
c370: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
c380: 20 29 7b 0a 20 20 20 20 61 64 64 72 31 20 3d 20   ){.    addr1 = 
c390: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c3a0: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c  (v, OP_IfMemPos,
c3b0: 20 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20   iLimit, 0);.   
c3c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c3d0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
c3e0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
c3f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
c400: 65 6d 49 6e 74 2c 20 2d 31 2c 20 69 4c 69 6d 69  emInt, -1, iLimi
c410: 74 2b 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20  t+1);.    addr2 
c420: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c430: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
c440: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
c450: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
c460: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c   addr1);.    sql
c470: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c480: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4c   OP_MemStore, iL
c490: 69 6d 69 74 2b 31 2c 20 31 29 3b 0a 20 20 20 20  imit+1, 1);.    
c4a0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
c4b0: 22 23 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  "# LIMIT+OFFSET"
c4c0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
c4d0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
c4e0: 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ddr2);.  }.}../*
c4f0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 76  .** Allocate a v
c500: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20  irtual index to 
c510: 75 73 65 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e  use for sorting.
c520: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c530: 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64  createSortingInd
c540: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
c550: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 45 78 70  , Select *p, Exp
c560: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 29  rList *pOrderBy)
c570: 7b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  {.  if( pOrderBy
c580: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
c590: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
c5a0: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
c5b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 64 65  ==0 );.    pOrde
c5c0: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  rBy->iECursor = 
c5d0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
c5e0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
c5f0: 65 33 56 64 62 65 41 64 64 4f 70 28 70 50 61 72  e3VdbeAddOp(pPar
c600: 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4f 70  se->pVdbe, OP_Op
c610: 65 6e 56 69 72 74 75 61 6c 2c 0a 20 20 20 20 20  enVirtual,.     
c620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c630: 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
c640: 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65  >iECursor, pOrde
c650: 72 42 79 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a 20  rBy->nExpr+1);. 
c660: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
c670: 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20 3d 3d  drOpenVirt[2] ==
c680: 20 2d 31 20 29 3b 0a 20 20 20 20 70 2d 3e 61 64   -1 );.    p->ad
c690: 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20 3d 20  drOpenVirt[2] = 
c6a0: 61 64 64 72 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  addr;.  }.}..#if
c6b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c6c0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
c6d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
c6e0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
c6f0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
c700: 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
c710: 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
c720: 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
c730: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
c740: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
c750: 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
c760: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
c770: 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
c780: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
c790: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
c7a0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
c7b0: 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
c7c0: 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
c7d0: 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
c7e0: 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
c7f0: 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
c800: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
c810: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
c820: 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
c830: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
c840: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c850: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
c860: 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
c870: 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
c880: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
c890: 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
c8a0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
c8b0: 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
c8c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
c8d0: 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  Ret = 0;.  }.  i
c8e0: 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20  f( pRet==0 ){.  
c8f0: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
c900: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
c910: 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
c920: 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
c930: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
c940: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
c950: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
c960: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69  ND_SELECT */..#i
c970: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c980: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
c990: 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  T./*.** This rou
c9a0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
c9b0: 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75 65 72  o process a quer
c9c0: 79 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79  y that is really
c9d0: 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72   the union.** or
c9e0: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
c9f0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
ca00: 61 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a  arate queries..*
ca10: 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
ca20: 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
ca30: 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
ca40: 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
ca50: 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
ca60: 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
ca70: 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
ca80: 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
ca90: 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
caa0: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
cab0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
cac0: 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
cad0: 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
cae0: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
caf0: 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
cb00: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
cb10: 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
cb20: 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
cb30: 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
cb40: 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
cb50: 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
cb60: 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
cb70: 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
cb80: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
cb90: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
cba0: 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
cbb0: 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
cbc0: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
cbd0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
cbe0: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
cbf0: 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
cc00: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
cc10: 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
cc20: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
cc30: 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
cc40: 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
cc50: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
cc60: 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
cc70: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46  --->  SELECT a F
cc80: 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
cc90: 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
cca0: 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
ccb0: 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
ccc0: 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
ccd0: 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
cce0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
ccf0: 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
cd00: 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
cd10: 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
cd20: 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
cd30: 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
cd40: 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
cd50: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
cd60: 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
cd70: 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
cd80: 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
cd90: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
cda0: 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
cdb0: 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
cdc0: 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
cdd0: 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
cde0: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
cdf0: 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
ce00: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
ce10: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
ce20: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ce40: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
ce50: 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
ce60: 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 65 44  oded */.  int eD
ce70: 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  est,            
ce80: 2f 2a 20 5c 5f 5f 5f 20 20 53 74 6f 72 65 20 71  /* \___  Store q
ce90: 75 65 72 79 20 72 65 73 75 6c 74 73 20 61 73 20  uery results as 
cea0: 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 20 20 69  specified */.  i
ceb0: 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20  nt iParm,       
cec0: 20 20 20 20 20 2f 2a 20 2f 20 20 20 20 20 62 79       /* /     by
ced0: 20 74 68 65 73 65 20 74 77 6f 20 70 61 72 61 6d   these two param
cee0: 65 74 65 72 73 2e 20 20 20 20 20 20 20 20 20 2a  eters.         *
cef0: 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20  /.  char *aff   
cf00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
cf10: 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69  eDest is SRT_Uni
cf20: 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79  on, the affinity
cf30: 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
cf40: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
cf50: 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73  OK;   /* Success
cf60: 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62   code from a sub
cf70: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c  routine */.  Sel
cf80: 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
cf90: 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
cfa0: 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
cfb0: 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
cfc0: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
cfd0: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
cfe0: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
cff0: 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e   VDBE */.  int n
d000: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
d010: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
d020: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
d030: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70  ult set */.  Exp
d040: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
d050: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
d060: 42 59 20 63 6c 61 75 73 65 20 6f 6e 20 70 20 2a  BY clause on p *
d070: 2f 0a 20 20 69 6e 74 20 61 53 65 74 50 32 5b 32  /.  int aSetP2[2
d080: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ];        /* Set
d090: 20 50 32 20 76 61 6c 75 65 20 6f 66 20 74 68 65   P2 value of the
d0a0: 73 65 20 6f 70 20 74 6f 20 6e 75 6d 62 65 72 20  se op to number 
d0b0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  of columns */.  
d0c0: 69 6e 74 20 6e 53 65 74 50 32 20 3d 20 30 3b 20  int nSetP2 = 0; 
d0d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d0e0: 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61 53 65 74  of slots in aSet
d0f0: 50 32 5b 5d 20 75 73 65 64 20 2a 2f 0a 0a 20 20  P2[] used */..  
d100: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
d110: 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
d120: 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
d130: 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
d140: 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
d150: 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d  he last (right-m
d160: 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74  ost) SELECT in t
d170: 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61  he series may ha
d180: 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  ve an ORDER BY o
d190: 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20  r LIMIT..  */.  
d1a0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
d1b0: 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
d1c0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
d1d0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
d1e0: 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 20  d;.  }.  pPrior 
d1f0: 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61  = p->pPrior;.  a
d200: 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
d210: 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f  Rightmost!=pPrio
d220: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
d230: 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
d240: 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t==p->pRightmost
d250: 20 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72   );.  if( pPrior
d260: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
d270: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d280: 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20  g(pParse,"ORDER 
d290: 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  BY clause should
d2a0: 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
d2b0: 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
d2c0: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
d2d0: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
d2e0: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
d2f0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d300: 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d   }.  if( pPrior-
d310: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >pLimit ){.    s
d320: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d330: 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61  Parse,"LIMIT cla
d340: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
d350: 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
d360: 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
d370: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
d380: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
d390: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
d3a0: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
d3b0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
d3c0: 68 61 76 65 20 61 20 76 61 6c 69 64 20 71 75 65  have a valid que
d3d0: 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e  ry engine.  If n
d3e0: 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ot, create a new
d3f0: 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d   one..  */.  v =
d400: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
d410: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
d420: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
d430: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
d440: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
d450: 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  }..  /* Create t
d460: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
d470: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
d480: 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
d490: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
d4a0: 54 5f 56 69 72 74 75 61 6c 54 61 62 20 29 7b 0a  T_VirtualTab ){.
d4b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
d4c0: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 61 73 73  EList );.    ass
d4d0: 65 72 74 28 20 6e 53 65 74 50 32 3c 73 69 7a 65  ert( nSetP2<size
d4e0: 6f 66 28 61 53 65 74 50 32 29 2f 73 69 7a 65 6f  of(aSetP2)/sizeo
d4f0: 66 28 61 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a  f(aSetP2[0]) );.
d500: 20 20 20 20 61 53 65 74 50 32 5b 6e 53 65 74 50      aSetP2[nSetP
d510: 32 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64  2++] = sqlite3Vd
d520: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
d530: 65 6e 56 69 72 74 75 61 6c 2c 20 69 50 61 72 6d  enVirtual, iParm
d540: 2c 20 30 29 3b 0a 20 20 20 20 65 44 65 73 74 20  , 0);.    eDest 
d550: 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  = SRT_Table;.  }
d560: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
d570: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66  code for the lef
d580: 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45  t and right SELE
d590: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
d5a0: 20 2a 2f 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   */.  pOrderBy =
d5b0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
d5c0: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
d5d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
d5e0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  : {.      if( pO
d5f0: 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
d600: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
d610: 30 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  0;.        asser
d620: 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  t( !pPrior->pLim
d630: 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  it );.        pP
d640: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rior->pLimit = p
d650: 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
d660: 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65    pPrior->pOffse
d670: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
d680: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
d690: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
d6a0: 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74  e, pPrior, eDest
d6b0: 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30  , iParm, 0, 0, 0
d6c0: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  , aff);.        
d6d0: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
d6e0: 20 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65         p->pOffse
d6f0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  t = 0;.        i
d700: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
d710: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
d720: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
d730: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70    }.        p->p
d740: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
d750: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70     p->iLimit = p
d760: 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20  Prior->iLimit;. 
d770: 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65         p->iOffse
d780: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66  t = pPrior->iOff
d790: 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  set;.        if(
d7a0: 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b   p->iLimit>=0 ){
d7b0: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20  .          addr 
d7c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d7d0: 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65  Op(v, OP_IfMemZe
d7e0: 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 30  ro, p->iLimit, 0
d7f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
d800: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
d810: 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49  Jump ahead if LI
d820: 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a  MIT reached"));.
d830: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d840: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
d850: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
d860: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c  eDest, iParm, 0,
d870: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
d880: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
d890: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20   pPrior;.       
d8a0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
d8b0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
d8c0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
d8d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
d8e0: 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20  ( addr ){.      
d8f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
d900: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
d910: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d920: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d930: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20   }.      /* For 
d940: 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52  UNION ALL ... OR
d950: 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68 72 6f  DER BY fall thro
d960: 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
d970: 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
d980: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
d990: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e  :.    case TK_UN
d9a0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
d9b0: 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a   unionTab;    /*
d9c0: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
d9d0: 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
d9e0: 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65  table holding re
d9f0: 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  sult */.      in
da00: 74 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 2f  t op = 0;      /
da10: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54  * One of the SRT
da20: 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  _ operations to 
da30: 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f  apply to self */
da40: 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
da50: 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53  Op;     /* The S
da60: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  RT_ operation to
da70: 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20   apply to prior 
da80: 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20  selects */.     
da90: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
daa0: 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65  pOffset; /* Save
dab0: 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e  d values of p->n
dac0: 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66  Limit and p->nOf
dad0: 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  fset */.      in
dae0: 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 70  t addr;..      p
daf0: 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d  riorOp = p->op==
db00: 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62  TK_ALL ? SRT_Tab
db10: 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a  le : SRT_Union;.
db20: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
db30: 3d 70 72 69 6f 72 4f 70 20 26 26 20 70 4f 72 64  =priorOp && pOrd
db40: 65 72 42 79 3d 3d 30 20 26 26 20 21 70 2d 3e 70  erBy==0 && !p->p
db50: 4c 69 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f 66  Limit && !p->pOf
db60: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  fset ){.        
db70: 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20  /* We can reuse 
db80: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
db90: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
dba0: 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20   SELECT to our. 
dbb0: 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e         ** right.
dbc0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
dbd0: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69      unionTab = i
dbe0: 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Parm;.      }els
dbf0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  e{.        /* We
dc00: 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72   will need to cr
dc10: 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d  eate our own tem
dc20: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
dc30: 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20  hold the.       
dc40: 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65   ** intermediate
dc50: 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20   results..      
dc60: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
dc70: 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  onTab = pParse->
dc80: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
dc90: 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  if( pOrderBy && 
dca0: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
dcb0: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20  lumn(pParse, p, 
dcc0: 70 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54  pOrderBy, unionT
dcd0: 61 62 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ab,1) ){.       
dce0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
dcf0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
dd00: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
dd10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
dd20: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
dd30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
dd40: 56 69 72 74 75 61 6c 2c 20 75 6e 69 6f 6e 54 61  Virtual, unionTa
dd50: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 0);.        i
dd60: 66 28 20 70 72 69 6f 72 4f 70 3d 3d 53 52 54 5f  f( priorOp==SRT_
dd70: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
dd80: 20 20 20 61 73 73 65 72 74 28 20 6e 53 65 74 50     assert( nSetP
dd90: 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29  2<sizeof(aSetP2)
dda0: 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30  /sizeof(aSetP2[0
ddb0: 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ]) );.          
ddc0: 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d  aSetP2[nSetP2++]
ddd0: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
dde0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ddf0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
de00: 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20 3d 3d 20  rOpenVirt[0] == 
de10: 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1 );.          
de20: 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b  p->addrOpenVirt[
de30: 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
de40: 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f       p->pRightmo
de50: 73 74 2d 3e 75 73 65 73 56 69 72 74 20 3d 20 31  st->usesVirt = 1
de60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
de70: 20 20 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e      createSortin
de80: 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  gIndex(pParse, p
de90: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
dea0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
deb0: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
dec0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
ded0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
dee0: 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65  ements to our le
def0: 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ft.      */.    
df00: 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
df10: 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  r->pOrderBy );. 
df20: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
df30: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
df40: 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c  pPrior, priorOp,
df50: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c   unionTab, 0, 0,
df60: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
df70: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
df80: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
df90: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
dfa0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
dfb0: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
dfc0: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
dfd0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74     */.      swit
dfe0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
dff0: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58        case TK_EX
e000: 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f  CEPT:  op = SRT_
e010: 45 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b  Except;   break;
e020: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
e030: 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20  K_UNION:   op = 
e040: 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72  SRT_Union;    br
e050: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61  eak;.         ca
e060: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f  se TK_ALL:     o
e070: 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20  p = SRT_Table;  
e080: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
e090: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
e0a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
e0b0: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
e0c0: 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72     p->disallowOr
e0d0: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
e0e0: 21 3d 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  !=0;.      pLimi
e0f0: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
e100: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
e110: 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
e120: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
e130: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
e140: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
e150: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
e160: 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e  Parse, p, op, un
e170: 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c  ionTab, 0, 0, 0,
e180: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e   aff);.      p->
e190: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
e1a0: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
e1b0: 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
e1c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e1d0: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74  Delete(p->pLimit
e1e0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
e1f0: 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
e200: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
e210: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
e220: 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ->iLimit = -1;. 
e230: 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
e240: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20  = -1;.      if( 
e250: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
e260: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
e270: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20  end;.      }... 
e280: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
e290: 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
e2a0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
e2b0: 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
e2c0: 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  rm.      ** it i
e2d0: 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e  s that we curren
e2e0: 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  tly need..      
e2f0: 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  */      .      i
e300: 66 28 20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  f( eDest!=priorO
e310: 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 69  p || unionTab!=i
e320: 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Parm ){.        
e330: 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
e340: 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
e350: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
e360: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
e370: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
e380: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
e390: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
e3a0: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
e3b0: 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a   0, p->pEList);.
e3c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e3d0: 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
e3e0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
e3f0: 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
e400: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
e410: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
e420: 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
e430: 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
e440: 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
e450: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e460: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
e470: 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  wind, unionTab, 
e480: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
e490: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
e4a0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
e4b0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  (v);.        rc 
e4c0: 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  = selectInnerLoo
e4d0: 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
e4e0: 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62  pEList, unionTab
e4f0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
e500: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
e510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e520: 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65   pOrderBy, -1, e
e530: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20  Dest, iParm, .  
e540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e550: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74             iCont
e560: 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20  , iBreak, 0);.  
e570: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
e580: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
e590: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
e5a0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
e5b0: 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
e5c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e5d0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
e5e0: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
e5f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e600: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
e610: 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a  onTab, iStart);.
e620: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e630: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
e640: 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
e650: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e660: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
e670: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
e680: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
e690: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
e6a0: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
e6b0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61  : {.      int ta
e6c0: 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
e6d0: 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
e6e0: 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
e6f0: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
e700: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
e710: 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20  nt addr;..      
e720: 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
e730: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
e740: 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
e750: 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
e760: 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
e770: 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
e780: 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
e790: 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
e7a0: 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
e7b0: 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
e7c0: 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
e7d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
e7e0: 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
e7f0: 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
e800: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
e810: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
e820: 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65  rBy && matchOrde
e830: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
e840: 73 65 2c 70 2c 70 4f 72 64 65 72 42 79 2c 74 61  se,p,pOrderBy,ta
e850: 62 31 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20  b1,1) ){.       
e860: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
e870: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
e880: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
e890: 20 20 20 20 20 20 63 72 65 61 74 65 53 6f 72 74        createSort
e8a0: 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ingIndex(pParse,
e8b0: 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 0a   p, pOrderBy);..
e8c0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
e8d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
e8e0: 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c   OP_OpenVirtual,
e8f0: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
e900: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
e910: 4f 70 65 6e 56 69 72 74 5b 30 5d 20 3d 3d 20 2d  OpenVirt[0] == -
e920: 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
e930: 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20 3d 20  drOpenVirt[0] = 
e940: 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  addr;.      p->p
e950: 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 56  Rightmost->usesV
e960: 69 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 61  irt = 1;.      a
e970: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
e980: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
e990: 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
e9a0: 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
e9b0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
e9c0: 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
e9d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e9e0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
e9f0: 2c 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e  , pPrior, SRT_Un
ea00: 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c  ion, tab1, 0, 0,
ea10: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
ea20: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
ea30: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
ea40: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
ea50: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
ea60: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
ea70: 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  CT into temporar
ea80: 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20  y table "tab2". 
ea90: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
eaa0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
eab0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
eac0: 56 69 72 74 75 61 6c 2c 20 74 61 62 32 2c 20 30  Virtual, tab2, 0
ead0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
eae0: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74   p->addrOpenVirt
eaf0: 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [1] == -1 );.   
eb00: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69     p->addrOpenVi
eb10: 72 74 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20  rt[1] = addr;.  
eb20: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
eb30: 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
eb40: 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
eb50: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
eb60: 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
eb70: 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
eb80: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
eb90: 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
eba0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
ebb0: 72 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69 6f  rse, p, SRT_Unio
ebc0: 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c 20 30  n, tab2, 0, 0, 0
ebd0: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d  , aff);.      p-
ebe0: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
ebf0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
ec00: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69  xprDelete(p->pLi
ec10: 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
ec20: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
ec30: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
ec40: 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
ec50: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
ec60: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
ec70: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
ec80: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e   }..      /* Gen
ec90: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
eca0: 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
ecb0: 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
ecc0: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
ecd0: 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
ece0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
ecf0: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
ed00: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
ed10: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
ed20: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
ed30: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
ed40: 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29  e, 0, p->pEList)
ed50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ed60: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
ed70: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
ed80: 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20  ;.      iCont = 
ed90: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
eda0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63  abel(v);.      c
edb0: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
edc0: 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
edd0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
ede0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
edf0: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
ee00: 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  b1, iBreak);.   
ee10: 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
ee20: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ee30: 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c  OP_RowKey, tab1,
ee40: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
ee50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ee60: 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32  P_NotFound, tab2
ee70: 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
ee80: 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72  rc = selectInner
ee90: 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
eea0: 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c  p->pEList, tab1,
eeb0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
eec0: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eee0: 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44  pOrderBy, -1, eD
eef0: 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20  est, iParm, .   
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef10: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c            iCont,
ef20: 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20   iBreak, 0);.   
ef30: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
ef40: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
ef50: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
ef60: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
ef70: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
ef80: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
ef90: 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
efa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
efb0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
efc0: 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20  tab1, iStart);. 
efd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
efe0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
eff0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
f000: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f010: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
f020: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
f030: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f040: 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
f050: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
f060: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f070: 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
f080: 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
f090: 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
f0a0: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
f0b0: 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
f0c0: 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
f0d0: 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
f0e0: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
f0f0: 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
f100: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  );.  if( p->pELi
f110: 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f  st->nExpr!=pPrio
f120: 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  r->pEList->nExpr
f130: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
f140: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
f150: 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
f160: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
f170: 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f  f %s".      " do
f180: 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61   not have the sa
f190: 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  me number of res
f1a0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65  ult columns", se
f1b0: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
f1c0: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
f1d0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
f1e0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
f1f0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d    /* Set the num
f200: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
f210: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
f220: 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d  es.  */.  nCol =
f230: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
f240: 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 65 74  r;.  while( nSet
f250: 50 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  P2 ){.    sqlite
f260: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
f270: 20 61 53 65 74 50 32 5b 2d 2d 6e 53 65 74 50 32   aSetP2[--nSetP2
f280: 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20  ], nCol);.  }.. 
f290: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c   /* Compute coll
f2a0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
f2b0: 75 73 65 64 20 62 79 20 65 69 74 68 65 72 20 74  used by either t
f2c0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
f2d0: 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e  se or.  ** by an
f2e0: 79 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  y temporary tabl
f2f0: 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70  es needed to imp
f300: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f  lement the compo
f310: 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a  und select..  **
f320: 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49   Attach the KeyI
f330: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f  nfo structure to
f340: 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74   all temporary t
f350: 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74  ables.  Invoke t
f360: 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59  he.  ** ORDER BY
f370: 20 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74   processing if t
f380: 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
f390: 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a   BY clause..  **
f3a0: 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
f3b0: 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
f3c0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
f3d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
f3e0: 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
f3f0: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
f400: 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
f410: 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
f420: 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
f430: 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
f440: 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
f450: 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
f460: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
f470: 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
f480: 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
f490: 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
f4a0: 20 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e   pOrderBy || p->
f4b0: 75 73 65 73 56 69 72 74 20 29 7b 0a 20 20 20 20  usesVirt ){.    
f4c0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f4e0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
f4f0: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
f500: 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
f510: 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
f520: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
f530: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
f540: 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
f550: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f560: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
f570: 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73  through SELECT s
f580: 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
f590: 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c   CollSeq **apCol
f5a0: 6c 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  l;.    CollSeq *
f5b0: 2a 61 43 6f 70 79 3b 0a 0a 20 20 20 20 61 73 73  *aCopy;..    ass
f5c0: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f  ert( p->pRightmo
f5d0: 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 4b 65  st==p );.    pKe
f5e0: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61  yInfo = sqliteMa
f5f0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4b 65  lloc(sizeof(*pKe
f600: 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 32 2a 73 69  yInfo)+nCol*2*si
f610: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b  zeof(CollSeq*) +
f620: 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   nCol);.    if( 
f630: 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20  !pKeyInfo ){.   
f640: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
f650: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
f660: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
f670: 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b  d;.    }..    pK
f680: 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e  eyInfo->enc = EN
f690: 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  C(pParse->db);. 
f6a0: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69     pKeyInfo->nFi
f6b0: 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20  eld = nCol;..   
f6c0: 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c   for(i=0, apColl
f6d0: 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  =pKeyInfo->aColl
f6e0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61  ; i<nCol; i++, a
f6f0: 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  pColl++){.      
f700: 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53  *apColl = multiS
f710: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
f720: 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
f730: 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c    if( 0==*apColl
f740: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43   ){.        *apC
f750: 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
f760: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
f770: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
f780: 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f  for(pLoop=p; pLo
f790: 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
f7a0: 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
f7b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
f7c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
f7d0: 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64  addr = pLoop->ad
f7e0: 64 72 4f 70 65 6e 56 69 72 74 5b 69 5d 3b 0a 20  drOpenVirt[i];. 
f7f0: 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72 3c         if( addr<
f800: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
f810: 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73  * If [0] is unus
f820: 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61  ed then [1] is a
f830: 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20  lso unused.  So 
f840: 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20  we can.         
f850: 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c   ** always safel
f860: 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20  y abort as soon 
f870: 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e 75  as the first unu
f880: 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e  sed slot is foun
f890: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  d */.          a
f8a0: 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64  ssert( pLoop->ad
f8b0: 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d 3c 30 20  drOpenVirt[1]<0 
f8c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
f8d0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
f8e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f8f0: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
f900: 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  r, nCol);.      
f910: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
f920: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28  ngeP3(v, addr, (
f930: 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
f940: 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P3_KEYINFO);.   
f950: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
f960: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
f970: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
f980: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 54 65  rList_item *pOTe
f990: 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  rm = pOrderBy->a
f9a0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64  ;.      int nOrd
f9b0: 65 72 42 79 45 78 70 72 20 3d 20 70 4f 72 64 65  erByExpr = pOrde
f9c0: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
f9d0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
f9e0: 20 20 75 38 20 2a 70 53 6f 72 74 4f 72 64 65 72    u8 *pSortOrder
f9f0: 3b 0a 0a 20 20 20 20 20 20 61 43 6f 70 79 20 3d  ;..      aCopy =
fa00: 20 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c   &pKeyInfo->aCol
fa10: 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 70  l[nCol];.      p
fa20: 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79  SortOrder = pKey
fa30: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
fa40: 20 3d 20 28 75 38 2a 29 26 61 43 6f 70 79 5b 6e   = (u8*)&aCopy[n
fa50: 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63  Col];.      memc
fa60: 70 79 28 61 43 6f 70 79 2c 20 70 4b 65 79 49 6e  py(aCopy, pKeyIn
fa70: 66 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a  fo->aColl, nCol*
fa80: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
fa90: 29 3b 0a 20 20 20 20 20 20 61 70 43 6f 6c 6c 20  );.      apColl 
faa0: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  = pKeyInfo->aCol
fab0: 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  l;.      for(i=0
fac0: 3b 20 69 3c 6e 4f 72 64 65 72 42 79 45 78 70 72  ; i<nOrderByExpr
fad0: 3b 20 69 2b 2b 2c 20 70 4f 54 65 72 6d 2b 2b 2c  ; i++, pOTerm++,
fae0: 20 61 70 43 6f 6c 6c 2b 2b 2c 20 70 53 6f 72 74   apColl++, pSort
faf0: 4f 72 64 65 72 2b 2b 29 7b 0a 20 20 20 20 20 20  Order++){.      
fb00: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
fb10: 70 4f 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20  pOTerm->pExpr;. 
fb20: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
fb30: 6d 65 20 3d 20 70 4f 54 65 72 6d 2d 3e 7a 4e 61  me = pOTerm->zNa
fb40: 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  me;.        asse
fb50: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
fb60: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
fb70: 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c 20  r->iColumn<nCol 
fb80: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
fb90: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
fba0: 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 73 71 6c 69    *apColl = sqli
fbb0: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
fbc0: 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20  (pParse, zName, 
fbd0: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  -1);.        }el
fbe0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 61  se{.          *a
fbf0: 70 43 6f 6c 6c 20 3d 20 61 43 6f 70 79 5b 70 45  pColl = aCopy[pE
fc00: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20  xpr->iColumn];. 
fc10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fc20: 20 2a 70 53 6f 72 74 4f 72 64 65 72 20 3d 20 70   *pSortOrder = p
fc30: 4f 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  OTerm->sortOrder
fc40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fc50: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
fc60: 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20  tmost==p );.    
fc70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
fc80: 72 4f 70 65 6e 56 69 72 74 5b 32 5d 3e 3d 30 20  rOpenVirt[2]>=0 
fc90: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
fca0: 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b  p->addrOpenVirt[
fcb0: 32 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2];.      sqlite
fcc0: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
fcd0: 20 61 64 64 72 2c 20 70 2d 3e 70 45 4c 69 73 74   addr, p->pEList
fce0: 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20 20  ->nExpr+2);.    
fcf0: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65    pKeyInfo->nFie
fd00: 6c 64 20 3d 20 6e 4f 72 64 65 72 42 79 45 78 70  ld = nOrderByExp
fd10: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
fd20: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
fd30: 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65  addr, (char*)pKe
fd40: 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  yInfo, P3_KEYINF
fd50: 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
fd60: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a    pKeyInfo = 0;.
fd70: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f        generateSo
fd80: 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
fd90: 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  , v, p->pEList->
fda0: 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50  nExpr, eDest, iP
fdb0: 61 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  arm);.    }..   
fdc0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65 79   sqliteFree(pKey
fdd0: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
fde0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
fdf0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
fe00: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
fe10: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
fe20: 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CT */..#ifndef S
fe30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
fe40: 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75  /*.** Scan throu
fe50: 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  gh the expressio
fe60: 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63  n pExpr.  Replac
fe70: 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63  e every referenc
fe80: 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e  e to.** a column
fe90: 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72   in table number
fea0: 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63   iTable with a c
feb0: 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75  opy of the iColu
fec0: 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69  mn-th.** entry i
fed0: 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20  n pEList.  (But 
fee0: 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73  leave references
fef0: 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f   to the ROWID co
ff00: 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  lumn .** unchang
ff10: 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ed.).**.** This 
ff20: 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20  routine is part 
ff30: 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e  of the flattenin
ff40: 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20  g procedure.  A 
ff50: 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73  subquery.** whos
ff60: 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20  e result set is 
ff70: 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73  defined by pELis
ff80: 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74  t appears as ent
ff90: 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f  ry in the.** FRO
ffa0: 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
ffb0: 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74  LECT such that t
ffc0: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61  he VDBE cursor a
ffd0: 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a  ssigned to that.
ffe0: 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65  ** FORM clause e
fff0: 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20  ntry is iTable. 
10000 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
10010 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ke the necessary
10020 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
10030 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74  pExpr so that it
10040 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
10050 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74   to the source t
10060 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73  able.** of the s
10070 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74  ubquery rather t
10080 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
10090 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a   the subquery..*
100a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
100b0 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70 72  bstExprList(Expr
100c0 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72 4c 69  List*,int,ExprLi
100d0 73 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72  st*);  /* Forwar
100e0 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63  d Decl */.static
100f0 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
10100 74 28 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c  t(Select *, int,
10110 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 20 20 2f   ExprList *);  /
10120 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20 2a  * Forward Decl *
10130 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
10140 62 73 74 45 78 70 72 28 45 78 70 72 20 2a 70 45  bstExpr(Expr *pE
10150 78 70 72 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c  xpr, int iTable,
10160 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
10170 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  t){.  if( pExpr=
10180 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
10190 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
101a0 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
101b0 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
101c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70   ){.    if( pExp
101d0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
101e0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
101f0 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d  = TK_NULL;.    }
10200 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
10210 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73   *pNew;.      as
10220 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
10230 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
10240 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  n<pEList->nExpr 
10250 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10260 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
10270 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
10280 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
10290 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
102a0 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e   pNew = pEList->
102b0 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
102c0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ].pExpr;.      a
102d0 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29  ssert( pNew!=0 )
102e0 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  ;.      pExpr->o
102f0 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20  p = pNew->op;.  
10300 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
10310 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20  r->pLeft==0 );. 
10320 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66       pExpr->pLef
10330 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
10340 75 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b  up(pNew->pLeft);
10350 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10360 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
10370 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
10380 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
10390 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 52  ExprDup(pNew->pR
103a0 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73  ight);.      ass
103b0 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73  ert( pExpr->pLis
103c0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  t==0 );.      pE
103d0 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c  xpr->pList = sql
103e0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
103f0 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  pNew->pList);.  
10400 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
10410 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65  e = pNew->iTable
10420 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
10430 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69  Column = pNew->i
10440 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45  Column;.      pE
10450 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77  xpr->iAgg = pNew
10460 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73 71  ->iAgg;.      sq
10470 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26  lite3TokenCopy(&
10480 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70  pExpr->token, &p
10490 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  New->token);.   
104a0 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43     sqlite3TokenC
104b0 6f 70 79 28 26 70 45 78 70 72 2d 3e 73 70 61 6e  opy(&pExpr->span
104c0 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a  , &pNew->span);.
104d0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 53 65        pExpr->pSe
104e0 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
104f0 6c 65 63 74 44 75 70 28 70 4e 65 77 2d 3e 70 53  lectDup(pNew->pS
10500 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 70 45  elect);.      pE
10510 78 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65  xpr->flags = pNe
10520 77 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  w->flags;.    }.
10530 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62    }else{.    sub
10540 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 4c  stExpr(pExpr->pL
10550 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  eft, iTable, pEL
10560 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
10570 78 70 72 28 70 45 78 70 72 2d 3e 70 52 69 67 68  xpr(pExpr->pRigh
10580 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
10590 74 29 3b 0a 20 20 20 20 73 75 62 73 74 53 65 6c  t);.    substSel
105a0 65 63 74 28 70 45 78 70 72 2d 3e 70 53 65 6c 65  ect(pExpr->pSele
105b0 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ct, iTable, pELi
105c0 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
105d0 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c  prList(pExpr->pL
105e0 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
105f0 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  ist);.  }.}.stat
10600 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
10610 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
10620 70 4c 69 73 74 2c 20 69 6e 74 20 69 54 61 62 6c  pList, int iTabl
10630 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  e, ExprList *pEL
10640 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
10650 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
10660 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
10670 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
10680 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62  r; i++){.    sub
10690 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b  stExpr(pList->a[
106a0 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
106b0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
106c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
106d0 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  stSelect(Select 
106e0 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  *p, int iTable, 
106f0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
10700 29 7b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  ){.  if( !p ) re
10710 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70  turn;.  substExp
10720 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
10730 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
10740 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
10750 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  t(p->pGroupBy, i
10760 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
10770 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
10780 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61  p->pOrderBy, iTa
10790 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
107a0 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61  substExpr(p->pHa
107b0 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45  ving, iTable, pE
107c0 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
107d0 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69 54  pr(p->pWhere, iT
107e0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  able, pEList);.}
107f0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
10800 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
10810 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  VIEW) */..#ifnde
10820 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10830 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  EW./*.** This ro
10840 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
10850 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65  o flatten subque
10860 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  ries in order to
10870 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74   speed.** execut
10880 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ion.  It returns
10890 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63   1 if it makes c
108a0 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20  hanges and 0 if 
108b0 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a  no flattening.**
108c0 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
108d0 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  o understand the
108e0 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74   concept of flat
108f0 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72  tening, consider
10900 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
10910 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  * query:.**.**  
10920 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
10930 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20   (SELECT x+y AS 
10940 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
10950 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35  z<100) WHERE a>5
10960 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
10970 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d  lt way of implem
10980 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72  enting this quer
10990 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  y is to execute 
109a0 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  the.** subquery 
109b0 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20  first and store 
109c0 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
109d0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
109e0 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68  , then.** run th
109f0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e  e outer query on
10a00 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
10a10 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71  table.  This req
10a20 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73  uires two.** pas
10a30 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74  ses over the dat
10a40 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  a.  Furthermore,
10a50 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d   because the tem
10a60 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20  porary table.** 
10a70 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20  has no indices, 
10a80 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
10a90 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   on the outer qu
10aa0 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ery cannot be.**
10ab0 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a   optimized..**.*
10ac0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
10ad0 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69  ttempts to rewri
10ae0 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20  te queries such 
10af0 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74  as the above int
10b00 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c  o.** a single fl
10b10 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20  at select, like 
10b20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
10b30 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
10b40 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
10b50 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a  100 AND a>5.**.*
10b60 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
10b70 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69  ated for this si
10b80 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  mpification give
10b90 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
10ba0 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
10bb0 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
10bc0 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
10bd0 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
10be0 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
10bf0 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
10c00 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
10c10 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
10c20 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
10c30 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
10c40 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
10c50 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
10c60 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
10c70 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  rue:.**.**   (1)
10c80 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
10c90 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
10ca0 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
10cb0 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  se aggregates..*
10cc0 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20  *.**   (2)  The 
10cd0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
10ce0 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
10cf0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
10d00 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
10d10 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20  *.**   (3)  The 
10d20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
10d30 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
10d40 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65  d of a left oute
10d50 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20  r join, or.**   
10d60 20 20 20 20 20 74 68 65 20 73 75 62 71 75 65 72       the subquer
10d70 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  y is not itself 
10d80 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74  a join.  (Ticket
10d90 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28   #306).**.**   (
10da0 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
10db0 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
10dc0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
10dd0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
10de0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20  n..**.**   (5)  
10df0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
10e00 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
10e10 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
10e20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
10e30 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65         aggregate
10e40 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20  s..**.**   (6)  
10e50 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
10e60 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
10e70 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
10e80 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
10e90 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
10ea0 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20  T..**.**   (7)  
10eb0 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  The subquery has
10ec0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a   a FROM clause..
10ed0 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65  **.**   (8)  The
10ee0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
10ef0 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
10f00 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
10f10 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
10f20 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20  *.**   (9)  The 
10f30 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
10f40 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
10f50 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
10f60 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  oes not use.**  
10f70 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73        aggregates
10f80 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54  ..**.**  (10)  T
10f90 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
10fa0 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
10fb0 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
10fc0 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a   query does not.
10fd0 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49  **        use LI
10fe0 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29  MIT..**.**  (11)
10ff0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
11000 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
11010 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68  ry do not both h
11020 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  ave ORDER BY cla
11030 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32  uses..**.**  (12
11040 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
11050 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
11060 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
11070 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68  OUTER JOIN or th
11080 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71  e.**        subq
11090 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
110a0 45 20 63 6c 61 75 73 65 2e 20 20 28 61 64 64 65  E clause.  (adde
110b0 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 30  d by ticket #350
110c0 29 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54  ).**.**  (13)  T
110d0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
110e0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
110f0 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
11100 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54  T.**.**  (14)  T
11110 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
11120 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 0a   not use OFFSET.
11130 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f  **.** In this ro
11140 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70  utine, the "p" p
11150 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
11160 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74  inter to the out
11170 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  er query..** The
11180 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e   subquery is p->
11190 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20  pSrc->a[iFrom]. 
111a0 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69   isAgg is true i
111b0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
111c0 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67  y.** uses aggreg
111d0 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72  ates and subquer
111e0 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69  yIsAgg is true i
111f0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
11200 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a  ses aggregates..
11210 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  **.** If flatten
11220 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  ing is not attem
11230 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  pted, this routi
11240 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e  ne is a no-op an
11250 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20  d returns 0..** 
11260 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
11270 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20   attempted this 
11280 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
11290 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  1..**.** All of 
112a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
112b0 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63  nalysis must occ
112c0 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f  ur on both the o
112d0 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a  uter query and.*
112e0 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62  * the subquery b
112f0 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
11300 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74  ne runs..*/.stat
11310 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75  ic int flattenSu
11320 62 71 75 65 72 79 28 0a 20 20 53 65 6c 65 63 74  bquery(.  Select
11330 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
11340 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20  * The parent or 
11350 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61  outer SELECT sta
11360 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
11370 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
11380 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e   /* Index in p->
11390 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65  pSrc->a[] of the
113a0 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20   inner subquery 
113b0 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20  */.  int isAgg, 
113c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
113d0 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43  e if outer SELEC
113e0 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  T uses aggregate
113f0 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
11400 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67  int subqueryIsAg
11410 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  g    /* True if 
11420 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
11430 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
11440 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65  tions */.){.  Se
11450 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20  lect *pSub;     
11460 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71    /* The inner q
11470 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72  uery or "subquer
11480 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  y" */.  SrcList 
11490 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
114a0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
114b0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
114c0 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
114d0 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68  pSubSrc;   /* Th
114e0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
114f0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
11500 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
11510 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65  st;    /* The re
11520 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
11530 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
11540 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
11550 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
11560 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
11570 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65  e pSub result se
11580 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  t temp table */.
11590 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
115a0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
115b0 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20  unter */.  Expr 
115c0 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
115d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
115e0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
115f0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
11600 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74  ist_item *pSubit
11610 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62  em;   /* The sub
11620 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 43  query */..  /* C
11630 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66  heck to see if f
11640 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
11650 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20  mitted.  Return 
11660 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  0 if not..  */. 
11670 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
11680 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
11690 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
116a0 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e  ( pSrc && iFrom>
116b0 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63  =0 && iFrom<pSrc
116c0 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62  ->nSrc );.  pSub
116d0 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  item = &pSrc->a[
116e0 69 46 72 6f 6d 5d 3b 0a 20 20 70 53 75 62 20 3d  iFrom];.  pSub =
116f0 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
11700 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
11710 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  ub!=0 );.  if( i
11720 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79  sAgg && subquery
11730 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
11740 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11750 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
11760 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73   (1)  */.  if( s
11770 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20  ubqueryIsAgg && 
11780 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72  pSrc->nSrc>1 ) r
11790 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
117a0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
117b0 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53   (2)  */.  pSubS
117c0 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
117d0 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53  .  assert( pSubS
117e0 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72  rc );.  /* Prior
117f0 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e   to version 3.1.
11800 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  2, when LIMIT an
11810 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20  d OFFSET had to 
11820 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61  be simple consta
11830 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72  nts,.  ** not ar
11840 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 73  bitrary expresss
11850 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
11860 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
11870 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
11880 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
11890 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
118a0 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
118b0 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
118c0 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
118d0 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
118e0 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
118f0 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
11900 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
11910 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
11920 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
11930 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
11940 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
11950 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
11960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
11970 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
11980 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66  .  if( pSub->pOf
11990 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b  fset ) return 0;
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
119c0 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
119d0 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
119e0 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSrc==0 ) return
119f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
11a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
11a10 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f  triction (7)  */
11a20 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e 69 73  .  if( (pSub->is
11a30 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62  Distinct || pSub
11a40 2d 3e 70 4c 69 6d 69 74 29 20 0a 20 20 20 20 20  ->pLimit) .     
11a50 20 20 20 20 26 26 20 28 70 53 72 63 2d 3e 6e 53      && (pSrc->nS
11a60 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
11a70 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  {          /* Re
11a80 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29 28 35  strictions (4)(5
11a90 29 28 38 29 28 39 29 20 2a 2f 0a 20 20 20 20 20  )(8)(9) */.     
11aa0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
11ab0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69 73  .  }.  if( p->is
11ac0 44 69 73 74 69 6e 63 74 20 26 26 20 73 75 62 71  Distinct && subq
11ad0 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
11ae0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
11af0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29   Restriction (6)
11b00 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 64    */.  if( (p->d
11b10 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 7c  isallowOrderBy |
11b20 7c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 20 26  | p->pOrderBy) &
11b30 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
11b40 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
11b50 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
11b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b70 20 20 20 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 20 28 31 31 29  Restriction (11)
11b90 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   */.  }..  /* Re
11ba0 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66  striction 3:  If
11bb0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
11bc0 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75   a join, make su
11bd0 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
11be0 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65  is .  ** not use
11bf0 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f  d as the right o
11c00 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74  perand of an out
11c10 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c  er join.  Exampl
11c20 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  es of why this. 
11c30 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77   ** is not allow
11c40 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
11c50 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
11c60 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49  TER JOIN (t2 JOI
11c70 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N t3).  **.  ** 
11c80 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
11c90 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
11ca0 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
11cb0 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
11cc0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
11cd0 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a  JOIN t3.  **.  *
11ce0 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61  * which is not a
11cf0 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74  t all the same t
11d00 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  hing..  */.  if(
11d10 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31   pSubSrc->nSrc>1
11d20 20 26 26 20 69 46 72 6f 6d 3e 30 20 26 26 20 28   && iFrom>0 && (
11d30 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d  pSrc->a[iFrom-1]
11d40 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
11d50 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20  UTER)!=0 ){.    
11d60 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
11d70 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
11d80 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71  12:  If the subq
11d90 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
11da0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
11db0 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a  eft outer.  ** j
11dc0 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
11dd0 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
11de0 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
11df0 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65  .  ** An example
11e00 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  s of why this is
11e10 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
11e20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
11e30 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
11e40 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
11e50 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e  M t2 WHERE t2.x>
11e60 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  0).  **.  ** If 
11e70 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
11e80 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
11e90 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
11ea0 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
11eb0 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45  TER JOIN t2) WHE
11ec0 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20  RE t2.x>0.  **. 
11ed0 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78   ** But the t2.x
11ee0 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77  >0 test will alw
11ef0 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55  ays fail on a NU
11f00 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68  LL row of t2, wh
11f10 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69  ich.  ** effecti
11f20 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68  vely converts th
11f30 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74  e OUTER JOIN int
11f40 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e  o an INNER JOIN.
11f50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 46 72 6f  .  */.  if( iFro
11f60 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b  m>0 && (pSrc->a[
11f70 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70  iFrom-1].jointyp
11f80 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
11f90 20 0a 20 20 20 20 20 20 26 26 20 70 53 75 62 2d   .      && pSub-
11fa0 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a 20 20  >pWhere!=0 ){.  
11fb0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
11fc0 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
11fd0 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
11fe0 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e   means flattenin
11ff0 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 66  g is permitted f
12000 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f  or the.  ** iFro
12010 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  m-th entry of th
12020 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  e FROM clause in
12030 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
12040 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76  ..  */..  /* Mov
12050 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  e all of the FRO
12060 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
12070 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
12080 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
12090 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
120a0 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
120b0 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
120c0 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
120d0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
120e0 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
120f0 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
12100 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
12110 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
12120 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
12130 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
12140 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
12150 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
12160 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
12170 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
12180 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
12190 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
121a0 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
121b0 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
121c0 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
121d0 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
121e0 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
121f0 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
12200 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
12210 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74  iParent = pSubit
12220 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 7b  em->iCursor;.  {
12230 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
12240 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
12250 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79  ;.    int jointy
12260 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a  pe = pSubitem->j
12270 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20 20 73 71  ointype;..    sq
12280 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
12290 28 30 2c 20 70 53 75 62 69 74 65 6d 2d 3e 70 54  (0, pSubitem->pT
122a0 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  ab);.    sqliteF
122b0 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ree(pSubitem->zD
122c0 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
122d0 6c 69 74 65 46 72 65 65 28 70 53 75 62 69 74 65  liteFree(pSubite
122e0 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
122f0 71 6c 69 74 65 46 72 65 65 28 70 53 75 62 69 74  qliteFree(pSubit
12300 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
12310 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
12320 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 74 72  {.      int extr
12330 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20 31 3b  a = nSubSrc - 1;
12340 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
12350 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
12360 0a 20 20 20 20 20 20 20 20 70 53 72 63 20 3d 20  .        pSrc = 
12370 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
12380 70 65 6e 64 28 70 53 72 63 2c 20 30 2c 20 30 29  pend(pSrc, 0, 0)
12390 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
123a0 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
123b0 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63        for(i=pSrc
123c0 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78 74 72  ->nSrc-1; i-extr
123d0 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a  a>=iFrom; i--){.
123e0 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b          pSrc->a[
123f0 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65  i] = pSrc->a[i-e
12400 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  xtra];.      }. 
12410 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
12420 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
12430 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  ){.      pSrc->a
12440 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
12450 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
12460 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
12470 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
12480 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
12490 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
124a0 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e 53 75 62 53  c->a[iFrom+nSubS
124b0 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  rc-1].jointype =
124c0 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a   jointype;.  }..
124d0 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73    /* Now begin s
124e0 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71  ubstituting subq
124f0 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20  uery result set 
12500 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
12510 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  .  ** references
12520 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20   to the iParent 
12530 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
12540 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45  ry..  ** .  ** E
12550 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
12560 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
12570 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
12580 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
12590 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
125a0 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20  HERE a>b;.  **  
125b0 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
125c0 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
125d0 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f  _____ subquery _
125e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  _________/      
125f0 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f      /.  **    \_
12600 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
12610 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79  ____ outer query
12620 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   _______________
12630 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
12640 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f  .  **.  ** We lo
12650 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72  ok at every expr
12660 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75  ession in the ou
12670 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76  ter query and ev
12680 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
12690 0a 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62  .  ** "a" we sub
126a0 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
126b0 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
126c0 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
126d0 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
126e0 20 2a 2f 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d   */.  pList = p-
126f0 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
12700 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
12710 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
12720 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69  pr *pExpr;.    i
12730 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  f( pList->a[i].z
12740 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70  Name==0 && (pExp
12750 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
12760 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d  pExpr)->span.z!=
12770 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  0 ){.      pList
12780 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
12790 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63 68  qliteStrNDup((ch
127a0 61 72 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e  ar*)pExpr->span.
127b0 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e  z, pExpr->span.n
127c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
127d0 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
127e0 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c  pEList, iParent,
127f0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
12800 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
12810 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
12820 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  (p->pGroupBy, iP
12830 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
12840 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
12850 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
12860 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
12870 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66  EList);.  }.  if
12880 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
12890 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
128a0 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
128b0 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
128c0 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  y = pSub->pOrder
128d0 42 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f  By;.    pSub->pO
128e0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65  rderBy = 0;.  }e
128f0 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  lse if( p->pOrde
12900 72 42 79 20 29 7b 0a 20 20 20 20 73 75 62 73 74  rBy ){.    subst
12910 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
12920 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  erBy, iParent, p
12930 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
12940 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57  }.  if( pSub->pW
12950 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65  here ){.    pWhe
12960 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
12970 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65 72 65  Dup(pSub->pWhere
12980 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12990 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
129a0 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
129b0 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Agg ){.    asser
129c0 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  t( p->pHaving==0
129d0 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69   );.    p->pHavi
129e0 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  ng = p->pWhere;.
129f0 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
12a00 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73  pWhere;.    subs
12a10 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
12a20 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
12a30 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  >pEList);.    p-
12a40 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
12a50 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 48 61  e3ExprAnd(p->pHa
12a60 76 69 6e 67 2c 20 73 71 6c 69 74 65 33 45 78 70  ving, sqlite3Exp
12a70 72 44 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69  rDup(pSub->pHavi
12a80 6e 67 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ng));.    assert
12a90 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
12aa0 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75   );.    p->pGrou
12ab0 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
12ac0 72 4c 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70  rListDup(pSub->p
12ad0 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73  GroupBy);.  }els
12ae0 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e{.    substExpr
12af0 28 70 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72  (p->pWhere, iPar
12b00 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
12b10 74 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72  t);.    p->pWher
12b20 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
12b30 6e 64 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 57  nd(p->pWhere, pW
12b40 68 65 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  here);.  }..  /*
12b50 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
12b60 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
12b70 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
12b80 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a  nner or the.  **
12b90 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
12ba0 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a  distinct. .  */.
12bb0 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20    p->isDistinct 
12bc0 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  = p->isDistinct 
12bd0 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69  || pSub->isDisti
12be0 6e 63 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  nct;..  /*.  ** 
12bf0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
12c00 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49  (SELECT ... LIMI
12c10 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49  T a OFFSET b) LI
12c20 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a  MIT x OFFSET y;.
12c30 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 65 20 69 73    **.  ** One is
12c40 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
12c50 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
12c60 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
12c70 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
12c80 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f    ** does not wo
12c90 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d  rk if either lim
12ca0 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
12cb0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
12cc0 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
12cd0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
12ce0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 53 75  >pLimit;.    pSu
12cf0 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
12d00 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
12d10 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
12d20 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
12d30 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
12d40 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
12d50 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
12d60 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75 62 29  lectDelete(pSub)
12d70 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
12d80 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
12d90 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
12da0 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
12db0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
12dc0 74 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 61  t passed in as a
12dd0 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65  n argument to se
12de0 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20  e if it.** is a 
12df0 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
12e00 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 49 66  max() query.  If
12e10 20 69 74 20 69 73 20 61 6e 64 20 74 68 69 73 20   it is and this 
12e20 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20  query can be.** 
12e30 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
12e40 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f  a single seek to
12e50 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
12e60 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65  r end of an inde
12e70 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72  x,.** then gener
12e80 61 74 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72  ate the code for
12e90 20 74 68 69 73 20 53 45 4c 45 43 54 20 61 6e 64   this SELECT and
12ea0 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74   return 1.  If t
12eb0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a  his is not a .**
12ec0 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72   simple min() or
12ed0 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20 74 68   max() query, th
12ee0 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a  en return 0;.**.
12ef0 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28  ** A simply min(
12f00 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
12f10 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73   looks like this
12f20 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
12f30 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61  T min(a) FROM ta
12f40 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ble;.**    SELEC
12f50 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61  T max(a) FROM ta
12f60 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71  ble;.**.** The q
12f70 75 65 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e  uery may have on
12f80 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
12f90 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72  e in its FROM ar
12fa0 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a  gument.  There.*
12fb0 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55  * can be no GROU
12fc0 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f  P BY or HAVING o
12fd0 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  r WHERE clauses.
12fe0 20 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74    The result set
12ff0 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20   must.** be the 
13000 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f  min() or max() o
13010 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  f a single colum
13020 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  n of the table. 
13030 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   The column.** i
13040 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d  n the min() or m
13050 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ax() function mu
13060 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a  st be indexed..*
13070 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74  *.** The paramet
13080 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ers to this rout
13090 69 6e 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ine are the same
130a0 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65 33 53   as for sqlite3S
130b0 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20  elect()..** See 
130c0 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
130d0 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69  nt on that routi
130e0 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
130f0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
13100 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d  /.static int sim
13110 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50  pleMinMaxQuery(P
13120 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
13130 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65  lect *p, int eDe
13140 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a  st, int iParm){.
13150 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
13160 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62   int iCol;.  Tab
13170 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
13180 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62  x *pIdx;.  int b
13190 61 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ase;.  Vdbe *v;.
131a0 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20    int seekOp;.  
131b0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
131c0 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b  , *pList, eList;
131d0 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
131e0 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65  st_item eListIte
131f0 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  m;.  SrcList *pS
13200 72 63 3b 0a 20 20 69 6e 74 20 62 72 6b 3b 0a 20  rc;.  int brk;. 
13210 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 2f 2a 20   int iDb;..  /* 
13220 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
13230 74 68 69 73 20 71 75 65 72 79 20 69 73 20 61 20  this query is a 
13240 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
13250 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 52 65  max() query.  Re
13260 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69  turn.  ** zero i
13270 66 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20  f it is  not..  
13280 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f  */.  if( p->pGro
13290 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69  upBy || p->pHavi
132a0 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20  ng || p->pWhere 
132b0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
132c0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
132d0 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d  if( pSrc->nSrc!=
132e0 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
132f0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
13300 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
13310 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
13320 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72 20 3d  urn 0;.  pExpr =
13330 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
13340 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  xpr;.  if( pExpr
13350 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
13360 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30  CTION ) return 0
13370 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  ;.  pList = pExp
13380 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  r->pList;.  if( 
13390 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73  pList==0 || pLis
133a0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
133b0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
133c0 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20  xpr->token.n!=3 
133d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
133e0 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
133f0 70 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  p((char*)pExpr->
13400 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29  token.z,"min",3)
13410 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f  ==0 ){.    seekO
13420 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20  p = OP_Rewind;. 
13430 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
13440 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
13450 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
13460 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"max",3)==0 ){.
13470 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f      seekOp = OP_
13480 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Last;.  }else{. 
13490 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
134a0 0a 20 20 70 45 78 70 72 20 3d 20 70 4c 69 73 74  .  pExpr = pList
134b0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
134c0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
134d0 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
134e0 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45  n 0;.  iCol = pE
134f0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
13500 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30  pTab = pSrc->a[0
13510 5d 2e 70 54 61 62 3b 0a 0a 0a 20 20 2f 2a 20 49  ].pTab;...  /* I
13520 66 20 77 65 20 67 65 74 20 74 6f 20 68 65 72 65  f we get to here
13530 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 71  , it means the q
13540 75 65 72 79 20 69 73 20 6f 66 20 74 68 65 20 63  uery is of the c
13550 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a  orrect form..  *
13560 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  * Check to make 
13570 73 75 72 65 20 77 65 20 68 61 76 65 20 61 6e 20  sure we have an 
13580 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65 20 70  index and make p
13590 49 64 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  Idx point to the
135a0 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  .  ** appropriat
135b0 65 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65  e index.  If the
135c0 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
135d0 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52  is on an INTEGER
135e0 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65   PRIMARY.  ** ke
135f0 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64  y column, no ind
13600 65 78 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  ex is necessary 
13610 73 6f 20 73 65 74 20 70 49 64 78 20 74 6f 20 4e  so set pIdx to N
13620 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a  ULL.  If no.  **
13630 20 75 73 61 62 6c 65 20 69 6e 64 65 78 20 69 73   usable index is
13640 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 30   found, return 0
13650 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f  ..  */.  if( iCo
13660 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49 64 78 20  l<0 ){.    pIdx 
13670 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
13680 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
13690 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
136a0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
136b0 78 70 72 29 3b 0a 20 20 20 20 66 6f 72 28 70 49  xpr);.    for(pI
136c0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
136d0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
136e0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
136f0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
13700 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20  olumn>=1 );.    
13710 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
13720 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26  lumn[0]==iCol &&
13730 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73   .          0==s
13740 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
13750 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 70  dx->azColl[0], p
13760 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a  Coll->zName) ){.
13770 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13780 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13790 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72   if( pIdx==0 ) r
137a0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
137b0 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
137c0 6d 6e 20 74 79 70 65 73 20 69 66 20 77 65 20 77  mn types if we w
137d0 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65  ill be using the
137e0 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73   callback.  This
137f0 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b  .  ** step is sk
13800 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74  ipped if the out
13810 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20  put is going to 
13820 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d  a table or a mem
13830 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54  ory cell..  ** T
13840 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
13850 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
13860 6e 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74  n generated in t
13870 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
13880 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ion..  */.  v = 
13890 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
138a0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
138b0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
138c0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
138d0 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
138e0 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
138f0 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
13900 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
13910 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 56 69 72  ( eDest==SRT_Vir
13920 74 75 61 6c 54 61 62 20 29 7b 0a 20 20 20 20 73  tualTab ){.    s
13930 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13940 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  v, OP_OpenVirtua
13950 6c 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  l, iParm, 1);.  
13960 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 69  }..  /* Generati
13970 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20  ng code to find 
13980 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d  the min or the m
13990 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20 61  ax.  Basically a
139a0 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  ll we have.  ** 
139b0 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74 68  to do is find th
139c0 65 20 66 69 72 73 74 20 6f 72 20 74 68 65 20 6c  e first or the l
139d0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
139e0 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20   chosen index.  
139f0 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28  If.  ** the min(
13a00 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
13a10 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
13a20 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 66  MARY KEY, then f
13a30 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20 20  ind the first.  
13a40 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72 79  ** or last entry
13a50 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62   in the main tab
13a60 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d  le..  */.  iDb =
13a70 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
13a80 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
13a90 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
13aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
13ab0 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 69 73 54 72  =0 || pTab->isTr
13ac0 61 6e 73 69 65 6e 74 20 29 3b 0a 20 20 73 71 6c  ansient );.  sql
13ad0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
13ae0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
13af0 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  );.  sqlite3Tabl
13b00 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
13b10 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
13b20 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
13b30 20 20 62 61 73 65 20 3d 20 70 53 72 63 2d 3e 61    base = pSrc->a
13b40 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 62  [0].iCursor;.  b
13b50 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rk = sqlite3Vdbe
13b60 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
13b70 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
13b80 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
13b90 20 62 72 6b 29 3b 0a 20 20 69 66 28 20 70 53 72   brk);.  if( pSr
13ba0 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d  c->a[0].pSelect=
13bb0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
13bc0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
13bd0 65 2c 20 62 61 73 65 2c 20 69 44 62 2c 20 70 54  e, base, iDb, pT
13be0 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
13bf0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78  ;.  }.  if( pIdx
13c00 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
13c10 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73  e3VdbeAddOp(v, s
13c20 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b  eekOp, base, 0);
13c30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
13c40 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   Even though the
13c50 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20   cursor used to 
13c60 6f 70 65 6e 20 74 68 65 20 69 6e 64 65 78 20 68  open the index h
13c70 65 72 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20  ere is closed.  
13c80 20 20 2a 2a 20 61 73 20 73 6f 6f 6e 20 61 73 20    ** as soon as 
13c90 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20 68  a single value h
13ca0 61 73 20 62 65 65 6e 20 72 65 61 64 20 66 72 6f  as been read fro
13cb0 6d 20 69 74 2c 20 61 6c 6c 6f 63 61 74 65 20 69  m it, allocate i
13cc0 74 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 28  t.    ** using (
13cd0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 29 20  pParse->nTab++) 
13ce0 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 63  to prevent the c
13cf0 75 72 73 6f 72 20 69 64 20 66 72 6f 6d 20 62 65  ursor id from be
13d00 69 6e 67 20 0a 20 20 20 20 2a 2a 20 72 65 75 73  ing .    ** reus
13d10 65 64 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f  ed. This is impo
13d20 72 74 61 6e 74 20 66 6f 72 20 73 74 61 74 65 6d  rtant for statem
13d30 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ents of the form
13d40 20 0a 20 20 20 20 2a 2a 20 22 49 4e 53 45 52 54   .    ** "INSERT
13d50 20 49 4e 54 4f 20 78 20 53 45 4c 45 43 54 20 6d   INTO x SELECT m
13d60 61 78 28 29 20 46 52 4f 4d 20 78 22 2e 0a 20 20  ax() FROM x"..  
13d70 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64    */.    int iId
13d80 78 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  x;.    KeyInfo *
13d90 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
13da0 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
13db0 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69 49  e, pIdx);.    iI
13dc0 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
13dd0 62 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b++;.    assert(
13de0 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
13df0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
13e00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13e10 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
13e20 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  ger, iDb, 0);.  
13e30 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
13e40 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
13e50 20 69 49 64 78 2c 20 70 49 64 78 2d 3e 74 6e 75   iIdx, pIdx->tnu
13e60 6d 2c 20 0a 20 20 20 20 20 20 20 20 28 63 68 61  m, .        (cha
13e70 72 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45 59 49  r*)pKey, P3_KEYI
13e80 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
13e90 20 20 69 66 28 20 73 65 65 6b 4f 70 3d 3d 4f 50    if( seekOp==OP
13ea0 5f 52 65 77 69 6e 64 20 29 7b 0a 20 20 20 20 20  _Rewind ){.     
13eb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13ec0 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  p(v, OP_Null, 0,
13ed0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
13ee0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13ef0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
13f00 20 30 29 3b 0a 20 20 20 20 20 20 73 65 65 6b 4f   0);.      seekO
13f10 70 20 3d 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20  p = OP_MoveGt;. 
13f20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
13f30 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65  VdbeAddOp(v, see
13f40 6b 4f 70 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20  kOp, iIdx, 0);. 
13f50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13f60 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  dOp(v, OP_IdxRow
13f70 69 64 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20  id, iIdx, 0);.  
13f80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13f90 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
13fa0 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71  iIdx, 0);.    sq
13fb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13fc0 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 62 61 73  , OP_MoveGe, bas
13fd0 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69  e, 0);.  }.  eLi
13fe0 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20  st.nExpr = 1;.  
13ff0 6d 65 6d 73 65 74 28 26 65 4c 69 73 74 49 74 65  memset(&eListIte
14000 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69  m, 0, sizeof(eLi
14010 73 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73  stItem));.  eLis
14020 74 2e 61 20 3d 20 26 65 4c 69 73 74 49 74 65 6d  t.a = &eListItem
14030 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70  ;.  eList.a[0].p
14040 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
14050 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
14060 70 50 61 72 73 65 2c 20 70 2c 20 26 65 4c 69 73  pParse, p, &eLis
14070 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20  t, 0, 0, 0, -1, 
14080 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 62 72  eDest, iParm, br
14090 6b 2c 20 62 72 6b 2c 20 30 29 3b 0a 20 20 73 71  k, brk, 0);.  sq
140a0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
140b0 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20  Label(v, brk);. 
140c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
140d0 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62  p(v, OP_Close, b
140e0 61 73 65 2c 20 30 29 3b 0a 20 20 0a 20 20 72 65  ase, 0);.  .  re
140f0 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
14100 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f 52 44   Analyze and ORD
14110 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
14120 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20 53 45  Y clause in a SE
14130 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
14140 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e   Return.** the n
14150 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
14160 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f  seen..**.** An O
14170 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
14180 20 42 59 20 69 73 20 61 20 6c 69 73 74 20 6f 66   BY is a list of
14190 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 49   expressions.  I
141a0 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
141b0 0a 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65  .** is an intege
141c0 72 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e  r constant, then
141d0 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
141e0 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20   is replaced by 
141f0 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
14200 64 69 6e 67 20 65 6e 74 72 79 20 69 6e 20 74 68  ding entry in th
14210 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f  e result set..*/
14220 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63  .static int proc
14230 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28  essOrderGroupBy(
14240 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
14250 70 4e 43 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  pNC,     /* Name
14260 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20   context of the 
14270 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
14280 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  . */.  ExprList 
14290 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
142a0 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20  The ORDER BY or 
142b0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
142c0 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  to be processed 
142d0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
142e0 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 45 69  *zType     /* Ei
142f0 74 68 65 72 20 22 4f 52 44 45 52 22 20 6f 72 20  ther "ORDER" or 
14300 22 47 52 4f 55 50 22 2c 20 61 73 20 61 70 70 72  "GROUP", as appr
14310 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opriate */.){.  
14320 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73  int i;.  ExprLis
14330 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 4e 43 2d  t *pEList = pNC-
14340 3e 70 45 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  >pEList;     /* 
14350 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  The result set o
14360 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a  f the SELECT */.
14370 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
14380 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 20 20  = pNC->pParse;  
14390 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
143a0 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
143b0 43 54 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  CT */.  assert( 
143c0 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 69 66 28  pEList );..  if(
143d0 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72   pOrderBy==0 ) r
143e0 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
143f0 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
14400 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
14410 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 45   int iCol;.    E
14420 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72  xpr *pE = pOrder
14430 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
14440 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
14450 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
14460 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20   &iCol) ){.     
14470 20 69 66 28 20 69 43 6f 6c 3e 30 20 26 26 20 69   if( iCol>0 && i
14480 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78  Col<=pEList->nEx
14490 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
144a0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
144b0 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45 20  pE);.        pE 
144c0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
144d0 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
144e0 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e  ExprDup(pEList->
144f0 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29  a[iCol-1].pExpr)
14500 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14510 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
14520 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
14530 20 20 20 20 20 20 20 20 20 20 20 22 25 73 20 42             "%s B
14540 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  Y column number 
14550 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  %d out of range 
14560 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20  - should be ".  
14570 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65           "betwee
14580 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 7a 54 79  n 1 and %d", zTy
14590 70 65 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74  pe, iCol, pEList
145a0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
145b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
145c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
145d0 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
145e0 6f 6c 76 65 4e 61 6d 65 73 28 70 4e 43 2c 20 70  olveNames(pNC, p
145f0 45 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  E) ){.      retu
14600 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
14610 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
14620 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b  sConstant(pE) ){
14630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
14640 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
14650 20 20 20 20 20 20 20 20 20 22 25 73 20 42 59 20           "%s BY 
14660 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62  terms must not b
14670 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f  e non-integer co
14680 6e 73 74 61 6e 74 73 22 2c 20 7a 54 79 70 65 29  nstants", zType)
14690 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
146a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
146b0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
146c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
146d0 73 6f 6c 76 65 73 20 61 6e 79 20 6e 61 6d 65 73  solves any names
146e0 20 75 73 65 64 20 69 6e 20 74 68 65 20 72 65 73   used in the res
146f0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 0a 2a  ult set of the.*
14700 2a 20 73 75 70 70 6c 69 65 64 20 53 45 4c 45 43  * supplied SELEC
14710 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20  T statement. If 
14720 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
14730 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 73 6f 6c  ment being resol
14740 76 65 64 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d  ved.** is a sub-
14750 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 70 4f 75  select, then pOu
14760 74 65 72 4e 43 20 69 73 20 61 20 70 6f 69 6e 74  terNC is a point
14770 65 72 20 74 6f 20 74 68 65 20 4e 61 6d 65 43 6f  er to the NameCo
14780 6e 74 65 78 74 20 0a 2a 2a 20 6f 66 20 74 68 65  ntext .** of the
14790 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54 2e 0a   parent SELECT..
147a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
147b0 6c 65 63 74 52 65 73 6f 6c 76 65 28 0a 20 20 50  lectResolve(.  P
147c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
147d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
147e0 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
147f0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
14800 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
14810 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
14820 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
14830 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
14840 4f 75 74 65 72 4e 43 20 20 2f 2a 20 54 68 65 20  OuterNC  /* The 
14850 6f 75 74 65 72 20 6e 61 6d 65 20 63 6f 6e 74 65  outer name conte
14860 78 74 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e  xt. May be NULL.
14870 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73   */.){.  ExprLis
14880 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
14890 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 73 65      /* Result se
148a0 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  t. */.  int i;  
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148c0 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76     /* For-loop v
148d0 61 72 69 61 62 6c 65 20 75 73 65 64 20 69 6e 20  ariable used in 
148e0 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 20  multiple places 
148f0 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
14900 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20   sNC;           
14910 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f  /* Local name-co
14920 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
14930 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
14940 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67 72 6f        /* The gro
14950 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  up by clause */.
14960 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 72 6f  .  /* If this ro
14970 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65  utine has run be
14980 66 6f 72 65 2c 20 72 65 74 75 72 6e 20 69 6d 6d  fore, return imm
14990 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 69  ediately. */.  i
149a0 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64  f( p->isResolved
149b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
149c0 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a 20 20 20  !pOuterNC );.   
149d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
149e0 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 73 52 65  K;.  }.  p->isRe
149f0 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a 20 20 2f  solved = 1;..  /
14a00 2a 20 49 66 20 74 68 65 72 65 20 68 61 76 65 20  * If there have 
14a10 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65 72 72  already been err
14a20 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ors, do nothing.
14a30 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
14a40 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20  ->nErr>0 ){.    
14a50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
14a60 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ROR;.  }..  /* P
14a70 72 65 70 61 72 65 20 74 68 65 20 73 65 6c 65 63  repare the selec
14a80 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  t statement. Thi
14a90 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f  s call will allo
14aa0 63 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  cate all cursors
14ab0 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 74  .  ** required t
14ac0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 74 61 62  o handle the tab
14ad0 6c 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  les and subqueri
14ae0 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
14af0 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  lause..  */.  if
14b00 28 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74  ( prepSelectStmt
14b10 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
14b20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14b30 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
14b40 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 65 78  * Resolve the ex
14b50 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
14b60 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
14b70 54 20 63 6c 61 75 73 65 73 2e 20 54 68 65 73 65  T clauses. These
14b80 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c  .  ** are not al
14b90 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72 20 74  lowed to refer t
14ba0 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20  o any names, so 
14bb0 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20 4e 61  pass an empty Na
14bc0 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a  meContext..  */.
14bd0 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
14be0 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
14bf0 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
14c00 50 61 72 73 65 3b 0a 20 20 69 66 28 20 73 71 6c  Parse;.  if( sql
14c10 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
14c20 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c  ames(&sNC, p->pL
14c30 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20 20 73  imit) ||.      s
14c40 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
14c50 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
14c60 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20  pOffset) ){.    
14c70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
14c80 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ROR;.  }..  /* S
14c90 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61 6c 20  et up the local 
14ca0 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20  name-context to 
14cb0 70 61 73 73 20 74 6f 20 45 78 70 72 52 65 73 6f  pass to ExprReso
14cc0 6c 76 65 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20  lveNames() to.  
14cd0 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 65 20 65  ** resolve the e
14ce0 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a  xpression-list..
14cf0 20 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77    */.  sNC.allow
14d00 41 67 67 20 3d 20 31 3b 0a 20 20 73 4e 43 2e 70  Agg = 1;.  sNC.p
14d10 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  SrcList = p->pSr
14d20 63 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d  c;.  sNC.pNext =
14d30 20 70 4f 75 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a   pOuterNC;..  /*
14d40 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69   Resolve names i
14d50 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
14d60 2e 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  . */.  pEList = 
14d70 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
14d80 20 21 70 45 4c 69 73 74 20 29 20 72 65 74 75 72   !pEList ) retur
14d90 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
14da0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
14db0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
14dc0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d  {.    Expr *pX =
14dd0 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
14de0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  xpr;.    if( sql
14df0 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
14e00 61 6d 65 73 28 26 73 4e 43 2c 20 70 58 29 20 29  ames(&sNC, pX) )
14e10 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
14e20 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
14e30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
14e40 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 67 67  there are no agg
14e50 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
14e60 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73   in the result-s
14e70 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50  et, and no GROUP
14e80 20 42 59 20 0a 20 20 2a 2a 20 65 78 70 72 65 73   BY .  ** expres
14e90 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c  sion, do not all
14ea0 6f 77 20 61 67 67 72 65 67 61 74 65 73 20 69 6e  ow aggregates in
14eb0 20 61 6e 79 20 6f 66 20 74 68 65 20 6f 74 68 65   any of the othe
14ec0 72 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  r expressions.. 
14ed0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
14ee0 2d 3e 69 73 41 67 67 20 29 3b 0a 20 20 70 47 72  ->isAgg );.  pGr
14ef0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
14f00 70 42 79 3b 0a 20 20 69 66 28 20 70 47 72 6f 75  pBy;.  if( pGrou
14f10 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61 73 41 67  pBy || sNC.hasAg
14f20 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73 41 67  g ){.    p->isAg
14f30 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 1;.  }else{.
14f40 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67      sNC.allowAgg
14f50 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
14f60 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75  If a HAVING clau
14f70 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74  se is present, t
14f80 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
14f90 65 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  e a GROUP BY cla
14fa0 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
14fb0 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20 21 70  p->pHaving && !p
14fc0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
14fd0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14fe0 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20  Parse, "a GROUP 
14ff0 42 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  BY clause is req
15000 75 69 72 65 64 20 62 65 66 6f 72 65 20 48 41 56  uired before HAV
15010 49 4e 47 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ING");.    retur
15020 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
15030 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
15040 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
15050 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f  t to the name-co
15060 6e 74 65 78 74 20 62 65 66 6f 72 65 20 70 61 72  ntext before par
15070 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6f 74  sing the.  ** ot
15080 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20  her expressions 
15090 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
150a0 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
150b0 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 65 78   so that.  ** ex
150c0 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
150d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 28 65   WHERE clause (e
150e0 74 63 2e 29 20 63 61 6e 20 72 65 66 65 72 20 74  tc.) can refer t
150f0 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79  o expressions by
15100 0a 20 20 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e  .  ** aliases in
15110 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
15120 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72  .  **.  ** Minor
15130 20 70 6f 69 6e 74 3a 20 49 66 20 74 68 69 73 20   point: If this 
15140 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
15150 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
15160 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 72 65   will be.  ** re
15170 2d 65 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65  -evaluated for e
15180 61 63 68 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ach reference to
15190 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e   it..  */.  sNC.
151a0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
151b0 73 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  st;.  if( sqlite
151c0 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
151d0 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72  s(&sNC, p->pWher
151e0 65 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69  e) ||.      sqli
151f0 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
15200 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61  mes(&sNC, p->pHa
15210 76 69 6e 67 29 20 7c 7c 0a 20 20 20 20 20 20 70  ving) ||.      p
15220 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70  rocessOrderGroup
15230 42 79 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 72 64  By(&sNC, p->pOrd
15240 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 20 7c  erBy, "ORDER") |
15250 7c 0a 20 20 20 20 20 20 70 72 6f 63 65 73 73 4f  |.      processO
15260 72 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43  rderGroupBy(&sNC
15270 2c 20 70 47 72 6f 75 70 42 79 2c 20 22 47 52 4f  , pGroupBy, "GRO
15280 55 50 22 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  UP").  ){.    re
15290 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
152a0 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  R;.  }..  /* Mak
152b0 65 20 73 75 72 65 20 74 68 65 20 47 52 4f 55 50  e sure the GROUP
152c0 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20   BY clause does 
152d0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 67 72  not contain aggr
152e0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e  egate functions.
152f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 47 72 6f  .  */.  if( pGro
15300 75 70 42 79 20 29 7b 0a 20 20 20 20 73 74 72 75  upBy ){.    stru
15310 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
15320 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 20 20   *pItem;.  .    
15330 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
15340 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47  GroupBy->a; i<pG
15350 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
15360 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
15370 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
15380 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d 3e 70  roperty(pItem->p
15390 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20 29 7b  Expr, EP_Agg) ){
153a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
153b0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
153c0 20 22 61 67 67 72 65 67 61 74 65 20 66 75 6e 63   "aggregate func
153d0 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c  tions are not al
153e0 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20 20  lowed in ".     
153f0 20 20 20 20 20 20 20 22 74 68 65 20 47 52 4f 55         "the GROU
15400 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20  P BY clause");. 
15410 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
15420 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
15430 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
15440 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15450 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65  K;.}../*.** Rese
15460 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  t the aggregate 
15470 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a  accumulator..**.
15480 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65  ** The aggregate
15490 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20   accumulator is 
154a0 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20  a set of memory 
154b0 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a  cells that hold.
154c0 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
154d0 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61  results while ca
154e0 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67  lculating an agg
154f0 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a  regate.  This.**
15500 20 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20   routine simply 
15510 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
15520 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
15530 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74  ory cells..*/.st
15540 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41  atic void resetA
15550 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
15560 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
15570 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
15580 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
15590 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
155a0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
155b0 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a  fo_func *pFunc;.
155c0 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
155d0 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e  nFunc+pAggInfo->
155e0 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20  nColumn==0 ){.  
155f0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
15600 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
15610 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  nfo->nColumn; i+
15620 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
15630 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
15640 65 6d 4e 75 6c 6c 2c 20 70 41 67 67 49 6e 66 6f  emNull, pAggInfo
15650 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 2c 20  ->aCol[i].iMem, 
15660 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46  0);.  }.  for(pF
15670 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46  unc=pAggInfo->aF
15680 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67  unc, i=0; i<pAgg
15690 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
156a0 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20  , pFunc++){.    
156b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
156c0 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20  (v, OP_MemNull, 
156d0 70 46 75 6e 63 2d 3e 69 4d 65 6d 2c 20 30 29 3b  pFunc->iMem, 0);
156e0 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
156f0 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
15700 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
15710 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
15720 20 20 20 20 20 69 66 28 20 70 45 2d 3e 70 4c 69       if( pE->pLi
15730 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 4c 69  st==0 || pE->pLi
15740 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  st->nExpr!=1 ){.
15750 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15760 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15770 22 44 49 53 54 49 4e 43 54 20 69 6e 20 61 67 67  "DISTINCT in agg
15780 72 65 67 61 74 65 20 6d 75 73 74 20 62 65 20 66  regate must be f
15790 6f 6c 6c 6f 77 65 64 20 22 0a 20 20 20 20 20 20  ollowed ".      
157a0 20 20 20 20 20 22 62 79 20 61 6e 20 65 78 70 72       "by an expr
157b0 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20  ession");.      
157c0 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e    pFunc->iDistin
157d0 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  ct = -1;.      }
157e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65  else{.        Ke
157f0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
15800 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
15810 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
15820 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
15830 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
15840 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  (v, OP_OpenVirtu
15850 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  al, pFunc->iDist
15860 69 6e 63 74 2c 20 30 2c 20 0a 20 20 20 20 20 20  inct, 0, .      
15870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15880 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
15890 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  nfo, P3_KEYINFO_
158a0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
158b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
158c0 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
158d0 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f  OP_AggFinalize o
158e0 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  pcode for every 
158f0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
15900 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67  on.** in the Agg
15910 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
15920 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
15930 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
15940 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ons(Parse *pPars
15950 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
15960 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
15970 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
15980 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
15990 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
159a0 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   *pF;.  for(i=0,
159b0 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
159c0 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
159d0 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
159e0 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  +){.    ExprList
159f0 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
15a00 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
15a10 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
15a20 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70  , OP_AggFinal, p
15a30 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f  F->iMem, pList ?
15a40 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
15a50 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
15a60 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
15a70 70 46 2d 3e 70 46 75 6e 63 2c 20 50 33 5f 46 55  pF->pFunc, P3_FU
15a80 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NCDEF);.  }.}../
15a90 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
15aa0 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f  accumulator memo
15ab0 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20  ry cells for an 
15ac0 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20  aggregate based 
15ad0 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  on.** the curren
15ae0 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
15af0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
15b00 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61  d updateAccumula
15b10 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
15b20 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
15b30 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
15b40 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
15b50 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
15b60 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
15b70 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
15b80 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
15b90 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
15ba0 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
15bb0 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
15bc0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
15bd0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
15be0 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
15bf0 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
15c00 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
15c10 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
15c20 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
15c30 70 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70  pList;.    if( p
15c40 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41  List ){.      nA
15c50 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rg = pList->nExp
15c60 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
15c70 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
15c80 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b  (pParse, pList);
15c90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15ca0 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20    nArg = 0;.    
15cb0 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44  }.    if( pF->iD
15cc0 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
15cd0 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73      addrNext = s
15ce0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15cf0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73  bel(v);.      as
15d00 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b  sert( nArg==1 );
15d10 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69  .      codeDisti
15d20 6e 63 74 28 76 2c 20 70 46 2d 3e 69 44 69 73 74  nct(v, pF->iDist
15d30 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20  inct, addrNext, 
15d40 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
15d50 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65  ( pF->pFunc->nee
15d60 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  dCollSeq ){.    
15d70 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
15d80 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75   = 0;.      stru
15d90 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
15da0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69   *pItem;.      i
15db0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65  nt j;.      asse
15dc0 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20  rt( pList!=0 ); 
15dd0 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20   /* pList!=0 if 
15de0 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43  pF->pFunc->needC
15df0 6f 6c 6c 53 65 71 20 69 73 20 74 72 75 65 20 2a  ollSeq is true *
15e00 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  /.      for(j=0,
15e10 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
15e20 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72   !pColl && j<nAr
15e30 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  g; j++, pItem++)
15e40 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
15e50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
15e60 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
15e70 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
15e80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
15e90 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
15ea0 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
15eb0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
15ec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
15ed0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
15ee0 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
15ef0 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
15f00 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P3_COLLSEQ);.   
15f10 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
15f20 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53  beOp3(v, OP_AggS
15f30 74 65 70 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 6e  tep, pF->iMem, n
15f40 41 72 67 2c 20 28 76 6f 69 64 2a 29 70 46 2d 3e  Arg, (void*)pF->
15f50 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45  pFunc, P3_FUNCDE
15f60 46 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  F);.    if( addr
15f70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71  Next ){.      sq
15f80 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
15f90 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78  Label(v, addrNex
15fa0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
15fb0 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67  for(i=0, pC=pAgg
15fc0 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41  Info->aCol; i<pA
15fd0 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
15fe0 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29  ator; i++, pC++)
15ff0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
16000 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43  rCode(pParse, pC
16010 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
16020 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
16030 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70  , OP_MemStore, p
16040 43 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 7d  C->iMem, 1);.  }
16050 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
16060 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a  ectMode = 0;.}..
16070 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
16080 63 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69 76  code for the giv
16090 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  en SELECT statem
160a0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ent..**.** The r
160b0 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 72  esults are distr
160c0 69 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75  ibuted in variou
160d0 73 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67  s ways depending
160e0 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65   on the.** value
160f0 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 69 50   of eDest and iP
16100 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65  arm..**.**     e
16110 44 65 73 74 20 56 61 6c 75 65 20 20 20 20 20 20  Dest Value      
16120 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d   Result.**     -
16130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
16140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
16170 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20    SRT_Callback  
16180 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c    Invoke the cal
16190 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72  lback for each r
161a0 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
161b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
161c0 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72  Mem         Stor
161d0 65 20 66 69 72 73 74 20 72 65 73 75 6c 74 20 69  e first result i
161e0 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50  n memory cell iP
161f0 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  arm.**.**     SR
16200 54 5f 53 65 74 20 20 20 20 20 20 20 20 20 53 74  T_Set         St
16210 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b  ore results as k
16220 65 79 73 20 6f 66 20 74 61 62 6c 65 20 69 50 61  eys of table iPa
16230 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
16240 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74  T_Union       St
16250 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61  ore results as a
16260 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72   key in a tempor
16270 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a  ary table iParm.
16280 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
16290 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65  cept      Remove
162a0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68   results from th
162b0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
162c0 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  e iParm..**.**  
162d0 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20     SRT_Table    
162e0 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
162f0 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   in temporary ta
16300 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  ble iParm.**.** 
16310 54 68 65 20 74 61 62 6c 65 20 61 62 6f 76 65 20  The table above 
16320 69 73 20 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20  is incomplete.  
16330 41 64 64 69 74 69 6f 6e 61 6c 20 65 44 69 73 74  Additional eDist
16340 20 76 61 6c 75 65 20 68 61 76 65 20 62 65 20 61   value have be a
16350 64 64 65 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68  dded.** since th
16360 69 73 20 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77  is comment was w
16370 72 69 74 74 65 6e 2e 20 20 53 65 65 20 74 68 65  ritten.  See the
16380 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
16390 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a  () function for.
163a0 2a 2a 20 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69  ** a complete li
163b0 73 74 69 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c  sting of the all
163c0 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65  owed values of e
163d0 44 65 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d  Dest and their m
163e0 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  eanings..**.** T
163f0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
16400 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
16410 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
16420 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20  y errors are.** 
16430 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
16440 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
16450 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
16460 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61  s left in.** pPa
16470 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
16480 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16490 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74   does NOT free t
164a0 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
164b0 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20  ure passed in.  
164c0 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  The.** calling f
164d0 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  unction needs to
164e0 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20   do that..**.** 
164f0 54 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72  The pParent, par
16500 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61  entTab, and *pPa
16510 72 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61  rentAgg fields a
16520 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20  re filled in if 
16530 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69  this.** SELECT i
16540 73 20 61 20 73 75 62 71 75 65 72 79 2e 20 20 54  s a subquery.  T
16550 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
16560 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  try to combine t
16570 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69  his SELECT.** wi
16580 74 68 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f  th its parent to
16590 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66   form a single f
165a0 6c 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73  lat query.  In s
165b0 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68  o doing, it migh
165c0 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20  t.** change the 
165d0 70 61 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f  parent query fro
165e0 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74  m a non-aggregat
165f0 65 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74  e to an aggregat
16600 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20  e query..** For 
16610 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65  that reason, the
16620 20 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67   pParentAgg flag
16630 20 69 73 20 70 61 73 73 65 64 20 61 73 20 61 20   is passed as a 
16640 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a  pointer, so it.*
16650 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64  * can be changed
16660 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20  ..**.** Example 
16670 31 3a 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  1:   The meaning
16680 20 6f 66 20 74 68 65 20 70 50 61 72 65 6e 74 20   of the pParent 
16690 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
166a0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
166b0 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43  M t1 JOIN (SELEC
166c0 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52  T x, count(*) FR
166d0 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a  OM t2) JOIN t3;.
166e0 2a 2a 20 20 20 20 5c 20 20 20 20 20 20 20 20 20  **    \         
166f0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
16700 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f  _____ subquery _
16710 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f  ______/        /
16720 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20 20 20 20  .**     \       
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16760 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  .**      \______
16770 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
16780 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
16790 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
167a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
167b0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
167c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
167d0 20 66 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68   first.   For th
167e0 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72  at call,.** pPar
167f0 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ent will be NULL
16800 2e 20 20 44 75 72 69 6e 67 20 74 68 65 20 70 72  .  During the pr
16810 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20  ocessing of the 
16820 6f 75 74 65 72 20 71 75 65 72 79 2c 20 74 68 69  outer query, thi
16830 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  s .** routine is
16840 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
16850 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ely to handle th
16860 65 20 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72  e subquery.  For
16870 20 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a   the recursive.*
16880 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20  * call, pParent 
16890 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68  will point to th
168a0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
168b0 42 65 63 61 75 73 65 20 74 68 65 20 73 75 62 71  Because the subq
168c0 75 65 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73  uery is.** the s
168d0 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e  econd element in
168e0 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
168f0 6e 2c 20 74 68 65 20 70 61 72 65 6e 74 54 61 62  n, the parentTab
16900 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a   parameter will.
16910 2a 2a 20 62 65 20 31 20 28 74 68 65 20 32 6e 64  ** be 1 (the 2nd
16920 20 76 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e   value of a 0-in
16930 64 65 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f  dexed array.).*/
16940 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
16950 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
16960 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
16970 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
16980 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
16990 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
169a0 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
169b0 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
169c0 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ed. */.  int eDe
169d0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
169e0 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
169f0 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
16a00 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c   */.  int iParm,
16a10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16a20 41 20 70 61 72 61 6d 65 74 65 72 20 75 73 65 64  A parameter used
16a30 20 62 79 20 74 68 65 20 65 44 65 73 74 20 64 69   by the eDest di
16a40 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f  sposal method */
16a50 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65  .  Select *pPare
16a60 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  nt,       /* Ano
16a70 74 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20  ther SELECT for 
16a80 77 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20  which this is a 
16a90 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69  sub-query */.  i
16aa0 6e 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20  nt parentTab,   
16ab0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
16ac0 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20  n pParent->pSrc 
16ad0 6f 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  of this query */
16ae0 0a 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41  .  int *pParentA
16af0 67 67 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75  gg,       /* Tru
16b00 65 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65  e if pParent use
16b10 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
16b20 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20  tions */.  char 
16b30 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20  *aff            
16b40 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73    /* If eDest is
16b50 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20   SRT_Union, the 
16b60 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
16b70 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
16b80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
16b90 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
16ba0 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
16bb0 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52  pWInfo;     /* R
16bc0 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74  eturn from sqlit
16bd0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
16be0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
16bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16c00 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
16c10 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
16c20 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tion */.  int is
16c30 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Agg;            
16c40 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
16c50 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
16c60 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
16c70 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
16c80 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
16c90 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
16ca0 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
16cb0 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
16cc0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
16cd0 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
16ce0 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
16cf0 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
16d00 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
16d10 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
16d20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
16d30 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54  OrderBy;    /* T
16d40 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
16d50 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
16d60 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
16d70 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
16d80 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
16d90 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
16da0 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
16db0 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
16dc0 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
16dd0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
16de0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74   */.  int isDist
16df0 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  inct;        /* 
16e00 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
16e10 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
16e20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
16e30 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20   distinct;      
16e40 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
16e50 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
16e60 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e  inct set */.  in
16e70 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20  t rc = 1;       
16e80 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
16e90 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69   return from thi
16ea0 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
16eb0 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65  int addrSortInde
16ec0 78 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  x;     /* Addres
16ed0 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 56  s of an OP_OpenV
16ee0 69 72 74 75 61 6c 20 69 6e 73 74 72 75 63 74 69  irtual instructi
16ef0 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20  on */.  AggInfo 
16f00 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f  sAggInfo;      /
16f10 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73  * Information us
16f20 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20  ed by aggregate 
16f30 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74  queries */.  int
16f40 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   iEnd;          
16f50 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
16f60 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
16f70 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28   query */..  if(
16f80 20 70 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33   p==0 || sqlite3
16f90 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 7c  MallocFailed() |
16fa0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
16fb0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
16fc0 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
16fd0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
16fe0 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
16ff0 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74  , 0, 0, 0) ) ret
17000 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  urn 1;.  memset(
17010 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69  &sAggInfo, 0, si
17020 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b  zeof(sAggInfo));
17030 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
17040 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
17050 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68  ELECT.  /* If th
17060 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71  ere is are a seq
17070 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73  uence of queries
17080 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72  , do the earlier
17090 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a   ones first..  *
170a0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
170b0 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r ){.    if( p->
170c0 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b  pRightmost==0 ){
170d0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
170e0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  Loop;.      for(
170f0 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
17100 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
17110 69 6f 72 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  ior){.        pL
17120 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  oop->pRightmost 
17130 3d 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = p;.      }.   
17140 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75   }.    return mu
17150 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
17160 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72  , p, eDest, iPar
17170 6d 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 23 65 6e  m, aff);.  }.#en
17180 64 69 66 0a 0a 20 20 70 4f 72 64 65 72 42 79 20  dif..  pOrderBy 
17190 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
171a0 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
171b0 64 65 72 62 79 28 65 44 65 73 74 29 20 29 7b 0a  derby(eDest) ){.
171c0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
171d0 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
171e0 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f  qlite3SelectReso
171f0 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2c 20 30  lve(pParse, p, 0
17200 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  ) ){.    goto se
17210 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
17220 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
17230 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4d 61  rderBy;..  /* Ma
17240 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20  ke local copies 
17250 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  of the parameter
17260 73 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  s for this query
17270 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73  ..  */.  pTabLis
17280 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
17290 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
172a0 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20  e;.  pGroupBy = 
172b0 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70  p->pGroupBy;.  p
172c0 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
172d0 69 6e 67 3b 0a 20 20 69 73 41 67 67 20 3d 20 70  ing;.  isAgg = p
172e0 2d 3e 69 73 41 67 67 3b 0a 20 20 69 73 44 69 73  ->isAgg;.  isDis
172f0 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
17300 74 69 6e 63 74 3b 0a 20 20 70 45 4c 69 73 74 20  tinct;.  pEList 
17310 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
17320 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67  f( pEList==0 ) g
17330 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
17340 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e  .  /* .  ** Do n
17350 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20  ot even attempt 
17360 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20  to generate any 
17370 63 6f 64 65 20 69 66 20 77 65 20 68 61 76 65 20  code if we have 
17380 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a  already seen.  *
17390 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20  * errors before 
173a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61  this routine sta
173b0 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rts..  */.  if( 
173c0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
173d0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
173e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  ;..  /* If writi
173f0 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
17400 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
17410 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
17420 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
17430 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23  e output..  */.#
17440 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17450 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
17460 28 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  ( (eDest==SRT_Me
17470 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
17480 53 65 74 29 20 26 26 20 70 45 4c 69 73 74 2d 3e  Set) && pEList->
17490 6e 45 78 70 72 3e 31 20 29 7b 0a 20 20 20 20 73  nExpr>1 ){.    s
174a0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
174b0 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73  Parse, "only a s
174c0 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c  ingle result all
174d0 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20  owed for ".     
174e0 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61 74    "a SELECT that
174f0 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
17500 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20  xpression");.   
17510 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
17520 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
17530 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20 69  /* ORDER BY is i
17540 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20  gnored for some 
17550 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20  destinations..  
17560 2a 2f 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  */.  if( Ignorab
17570 6c 65 4f 72 64 65 72 62 79 28 65 44 65 73 74 29  leOrderby(eDest)
17580 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79   ){.    pOrderBy
17590 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
175a0 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
175b0 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20   code..  */.  v 
175c0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
175d0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
175e0 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  v==0 ) goto sele
175f0 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 47 65  ct_end;..  /* Ge
17600 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
17610 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20  all sub-queries 
17620 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
17630 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  se.  */.#if !def
17640 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
17650 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
17660 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
17670 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69  IT_VIEW).  for(i
17680 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
17690 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
176a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
176b0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
176c0 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 52  0;.    int needR
176d0 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 20  estoreContext;. 
176e0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
176f0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
17700 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
17710 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ..    if( pItem-
17720 3e 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70  >pSelect==0 || p
17730 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65  Item->isPopulate
17740 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  d ) continue;.  
17750 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61    if( pItem->zNa
17760 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  me!=0 ){.      z
17770 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
17780 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
17790 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 70  Context;.      p
177a0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
177b0 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61  ext = pItem->zNa
177c0 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65  me;.      needRe
177d0 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31  storeContext = 1
177e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
177f0 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f     needRestoreCo
17800 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ntext = 0;.    }
17810 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
17820 63 74 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  ct(pParse, pItem
17830 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 56  ->pSelect, SRT_V
17840 69 72 74 75 61 6c 54 61 62 2c 20 0a 20 20 20 20  irtualTab, .    
17850 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
17860 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 2c 20  em->iCursor, p, 
17870 69 2c 20 26 69 73 41 67 67 2c 20 30 29 3b 0a 20  i, &isAgg, 0);. 
17880 20 20 20 69 66 28 20 6e 65 65 64 52 65 73 74 6f     if( needResto
17890 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20  reContext ){.   
178a0 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68     pParse->zAuth
178b0 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64  Context = zSaved
178c0 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20  AuthContext;.   
178d0 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20   }.    pTabList 
178e0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70  = p->pSrc;.    p
178f0 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
17900 65 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f  e;.    if( !Igno
17910 72 61 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65  rableOrderby(eDe
17920 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72  st) ){.      pOr
17930 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
17940 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rBy;.    }.    p
17950 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
17960 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69  oupBy;.    pHavi
17970 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
17980 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20  .    isDistinct 
17990 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  = p->isDistinct;
179a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
179b0 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20  * Check for the 
179c0 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20  special case of 
179d0 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  a min() or max()
179e0 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 69 74 73   function by its
179f0 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  elf.  ** in the 
17a00 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f  result set..  */
17a10 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e  .  if( simpleMin
17a20 4d 61 78 51 75 65 72 79 28 70 50 61 72 73 65 2c  MaxQuery(pParse,
17a30 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d   p, eDest, iParm
17a40 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  ) ){.    rc = 0;
17a50 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
17a60 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
17a70 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
17a80 74 68 69 73 20 69 73 20 61 20 73 75 62 71 75 65  this is a subque
17a90 72 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 22  ry that can be "
17aa0 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20  flattened" into 
17ab0 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a  its parent..  **
17ac0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
17ad0 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20  s a possiblity, 
17ae0 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e  do so and return
17af0 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a   immediately.  .
17b00 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
17b10 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
17b20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20 70  if( pParent && p
17b30 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20  ParentAgg &&.   
17b40 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65     flattenSubque
17b50 72 79 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65  ry(pParent, pare
17b60 6e 74 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41  ntTab, *pParentA
17b70 67 67 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20  gg, isAgg) ){.  
17b80 20 20 69 66 28 20 69 73 41 67 67 20 29 20 2a 70    if( isAgg ) *p
17b90 50 61 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20  ParentAgg = 1;. 
17ba0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
17bb0 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  nd;.  }.#endif..
17bc0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
17bd0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
17be0 75 73 65 2c 20 72 65 73 6f 6c 76 65 20 61 6e 79  use, resolve any
17bf0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
17c00 6e 63 65 73 0a 20 20 2a 2a 20 6e 61 6d 65 73 20  nces.  ** names 
17c10 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 65  that have been e
17c20 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
17c30 69 65 64 20 61 6e 64 20 63 72 65 61 74 65 20 61  ied and create a
17c40 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2e 0a   sorting index..
17c50 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73    **.  ** This s
17c60 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6d 69 67  orting index mig
17c70 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
17c80 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61  unused if the da
17c90 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20  ta can be .  ** 
17ca0 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65  extracted in pre
17cb0 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20  -sorted order.  
17cc0 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
17cd0 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ase, then the.  
17ce0 2a 2a 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  ** OP_OpenVirtua
17cf0 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  l instruction wi
17d00 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  ll be changed to
17d10 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65   an OP_Noop once
17d20 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20  .  ** we figure 
17d30 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72  out that the sor
17d40 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f  ting index is no
17d50 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61  t needed.  The a
17d60 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a  ddrSortIndex.  *
17d70 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  * variable is us
17d80 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  ed to facilitate
17d90 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
17da0 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
17db0 79 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  y ){.    struct 
17dc0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
17dd0 54 65 72 6d 3b 0a 20 20 20 20 4b 65 79 49 6e 66  Term;.    KeyInf
17de0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
17df0 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d   for(i=0, pTerm=
17e00 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70  pOrderBy->a; i<p
17e10 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
17e20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
17e30 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
17e40 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
17e50 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
17e60 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Coll = sqlite3Lo
17e70 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
17e80 73 65 2c 20 70 54 65 72 6d 2d 3e 7a 4e 61 6d 65  se, pTerm->zName
17e90 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , -1);.      }. 
17ea0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
17eb0 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
17ec0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
17ed0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b  nd;.    }.    pK
17ee0 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
17ef0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
17f00 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  rse, pOrderBy);.
17f10 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45      pOrderBy->iE
17f20 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
17f30 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e  >nTab++;.    p->
17f40 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20  addrOpenVirt[2] 
17f50 3d 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  = addrSortIndex 
17f60 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  =.       sqlite3
17f70 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
17f80 65 6e 56 69 72 74 75 61 6c 2c 20 70 4f 72 64 65  enVirtual, pOrde
17f90 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70  rBy->iECursor, p
17fa0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32  OrderBy->nExpr+2
17fb0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
17fc0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
17fd0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  *)pKeyInfo, P3_K
17fe0 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
17ff0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64  .  }else{.    ad
18000 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31  drSortIndex = -1
18010 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
18020 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a  the limiter..  *
18030 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74  /.  iEnd = sqlit
18040 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
18050 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d  v);.  computeLim
18060 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
18070 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20  se, p, iEnd);.. 
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 56 69 72 74   eDest==SRT_Virt
180e0 75 61 6c 54 61 62 20 29 7b 0a 20 20 20 20 73 71  ualTab ){.    sq
180f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
18100 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c  , OP_OpenVirtual
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 4f 70 65 6e 20 61 20 76 69 72 74 75 61  /* Open a virtua
18140 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
18150 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
18160 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
18170 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  isDistinct ){.  
18180 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
18190 6e 66 6f 3b 0a 20 20 20 20 64 69 73 74 69 6e 63  nfo;.    distinc
181a0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
181b0 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  ++;.    pKeyInfo
181c0 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
181d0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
181e0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  ->pEList);.    s
181f0 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
18200 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c   OP_OpenVirtual,
18210 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20 0a 20   distinct, 0, . 
18220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18230 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
18240 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
18250 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d  FO_HANDOFF);.  }
18260 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e  else{.    distin
18270 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ct = -1;.  }..  
18280 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e 64  /* Aggregate and
18290 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71   non-aggregate q
182a0 75 65 72 69 65 73 20 61 72 65 20 68 61 6e 64 6c  ueries are handl
182b0 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 2a  ed differently *
182c0 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26  /.  if( !isAgg &
182d0 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  & pGroupBy==0 ){
182e0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
182f0 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67  e is for non-agg
18300 72 65 67 61 74 65 20 71 75 65 72 69 65 73 0a 20  regate queries. 
18310 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68 65 20     ** Begin the 
18320 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20  database scan.  
18330 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20    */.    pWInfo 
18340 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
18350 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
18360 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70  List, pWhere, &p
18370 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
18380 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
18390 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
183a0 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e      /* If sortin
183b0 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73  g index that was
183c0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
183d0 69 6f 72 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  ior OP_OpenVirtu
183e0 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72  al .    ** instr
183f0 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20  uction ended up 
18400 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64  not being needed
18410 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68  , then change th
18420 65 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c  e OP_OpenVirtual
18430 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20  .    ** into an 
18440 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  OP_Noop..    */.
18450 20 20 20 20 69 66 28 20 61 64 64 72 53 6f 72 74      if( addrSort
18460 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f 72 64  Index>=0 && pOrd
18470 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
18480 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
18490 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
184a0 53 6f 72 74 49 6e 64 65 78 2c 20 31 29 3b 0a 20  SortIndex, 1);. 
184b0 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
184c0 56 69 72 74 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20  Virt[2] = -1;.  
184d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20    }..    /* Use 
184e0 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e  the standard inn
184f0 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20  er loop.    */. 
18500 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e     if( selectInn
18510 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
18520 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , pEList, 0, 0, 
18530 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e  pOrderBy, distin
18540 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20  ct, eDest,.     
18550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
18560 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43  Parm, pWInfo->iC
18570 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d  ontinue, pWInfo-
18580 3e 69 42 72 65 61 6b 2c 20 61 66 66 29 20 29 7b  >iBreak, aff) ){
18590 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  .       goto sel
185a0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
185b0 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64      /* End the d
185c0 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
185d0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  p..    */.    sq
185e0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
185f0 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Info);.  }else{.
18600 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
18610 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  he processing fo
18620 72 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  r aggregate quer
18630 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  ies */.    NameC
18640 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f  ontext sNC;    /
18650 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
18660 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67  or processing ag
18670 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74  gregate informat
18680 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ion */.    int i
18690 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  AMem;          /
186a0 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
186b0 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ess for storing 
186c0 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
186d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65   */.    int iBMe
186e0 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
186f0 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
18700 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52   for previous GR
18710 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
18720 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20  t iUseFlag;     
18730 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
18740 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e   holding flag in
18750 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74  dicating that at
18760 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20   least.         
18770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
18780 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  * one row of the
18790 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67   input to the ag
187a0 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65  gregator has bee
187b0 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
187c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
187d0 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e  cessed */.    in
187e0 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20  t iAbortFlag;   
187f0 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
18800 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75   which causes qu
18810 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73  ery abort if pos
18820 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74  itive */.    int
18830 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20   groupBySort;   
18840 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72   /* Rows come fr
18850 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f  om source in GRO
18860 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 0a  UP BY order */..
18870 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
18880 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 20  owing variables 
18890 68 6f 6c 64 20 61 64 64 72 65 73 73 65 73 20 6f  hold addresses o
188a0 72 20 6c 61 62 65 6c 73 20 66 6f 72 20 70 61 72  r labels for par
188b0 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
188c0 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
188d0 20 70 72 6f 67 72 61 6d 20 77 65 20 61 72 65 20   program we are 
188e0 70 75 74 74 69 6e 67 20 74 6f 67 65 74 68 65 72  putting together
188f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
18900 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 20 20 20  OutputRow;      
18910 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
18920 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
18930 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
18940 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
18950 53 65 74 41 62 6f 72 74 3b 20 20 20 20 20 20 20  SetAbort;       
18960 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74  /* Set the abort
18970 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e   flag and return
18980 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
18990 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 3b 20  InitializeLoop; 
189a0 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64 65  /* Start of code
189b0 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65   that initialize
189c0 73 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  s the input loop
189d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
189e0 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20 20 20 20  TopOfLoop;      
189f0 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
18a00 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
18a10 69 6e 74 20 61 64 64 72 47 72 6f 75 70 42 79 43  int addrGroupByC
18a20 68 61 6e 67 65 3b 20 20 2f 2a 20 43 6f 64 65 20  hange;  /* Code 
18a30 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 20 61  that runs when a
18a40 6e 79 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  ny GROUP BY term
18a50 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20   changes */.    
18a60 69 6e 74 20 61 64 64 72 50 72 6f 63 65 73 73 52  int addrProcessR
18a70 6f 77 3b 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ow;     /* Code 
18a80 74 6f 20 70 72 6f 63 65 73 73 20 61 20 73 69 6e  to process a sin
18a90 67 6c 65 20 69 6e 70 75 74 20 72 6f 77 20 2a 2f  gle input row */
18aa0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64  .    int addrEnd
18ab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18ac0 45 6e 64 20 6f 66 20 61 6c 6c 20 70 72 6f 63 65  End of all proce
18ad0 73 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  ssing */.    int
18ae0 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b   addrSortingIdx;
18af0 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 4f       /* The OP_O
18b00 70 65 6e 56 69 72 74 75 61 6c 20 66 6f 72 20 74  penVirtual for t
18b10 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
18b20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
18b30 52 65 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  Reset;          
18b40 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f  /* Subroutine fo
18b50 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
18b60 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 0a  accumulator */..
18b70 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71      addrEnd = sq
18b80 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
18b90 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  el(v);..    /* C
18ba0 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e  onvert TK_COLUMN
18bb0 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41   nodes into TK_A
18bc0 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61  GG_COLUMN and ma
18bd0 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ke entries in.  
18be0 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f    ** sAggInfo fo
18bf0 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e  r all TK_AGG_FUN
18c00 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65  CTION nodes in e
18c10 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
18c20 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  e.    ** SELECT 
18c30 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a  statement..    *
18c40 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
18c50 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
18c60 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72  ));.    sNC.pPar
18c70 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
18c80 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
18c90 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e  pTabList;.    sN
18ca0 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41  C.pAggInfo = &sA
18cb0 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67  ggInfo;.    sAgg
18cc0 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
18cd0 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f  umn = pGroupBy ?
18ce0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
18cf0 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67  +1 : 0;.    sAgg
18d00 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20  Info.pGroupBy = 
18d10 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 69 66  pGroupBy;.    if
18d20 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  ( sqlite3ExprAna
18d30 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
18d40 2c 20 70 45 4c 69 73 74 29 20 29 7b 0a 20 20 20  , pEList) ){.   
18d50 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
18d60 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
18d70 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  ( sqlite3ExprAna
18d80 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
18d90 2c 20 70 4f 72 64 65 72 42 79 29 20 29 7b 0a 20  , pOrderBy) ){. 
18da0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
18db0 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
18dc0 69 66 28 20 70 48 61 76 69 6e 67 20 26 26 20 73  if( pHaving && s
18dd0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
18de0 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43  eAggregates(&sNC
18df0 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  , pHaving) ){.  
18e00 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
18e10 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  end;.    }.    s
18e20 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c  AggInfo.nAccumul
18e30 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e  ator = sAggInfo.
18e40 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72  nColumn;.    for
18e50 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
18e60 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20  .nFunc; i++){.  
18e70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
18e80 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
18e90 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f  t(&sNC, sAggInfo
18ea0 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d  .aFunc[i].pExpr-
18eb0 3e 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  >pList) ){.     
18ec0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
18ed0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
18ee0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
18ef0 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
18f00 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
18f10 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65  d;..    /* Proce
18f20 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  ssing for aggreg
18f30 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20  ates with GROUP 
18f40 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65  BY is very diffe
18f50 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  rent and.    ** 
18f60 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  much more comple
18f70 78 20 74 68 61 20 61 67 67 72 65 67 61 74 65 73  x tha aggregates
18f80 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
18f90 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
18fa0 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
18fb0 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
18fc0 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
18fd0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
18fe0 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
18ff0 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 20 20   clause */..    
19000 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65    /* Create labe
19010 6c 73 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  ls that we will 
19020 62 65 20 6e 65 65 64 69 6e 67 0a 20 20 20 20 20  be needing.     
19030 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 20   */.     .      
19040 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f  addrInitializeLo
19050 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
19060 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
19070 20 20 20 20 61 64 64 72 47 72 6f 75 70 42 79 43      addrGroupByC
19080 68 61 6e 67 65 20 3d 20 73 71 6c 69 74 65 33 56  hange = sqlite3V
19090 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
190a0 0a 20 20 20 20 20 20 61 64 64 72 50 72 6f 63 65  .      addrProce
190b0 73 73 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  ssRow = sqlite3V
190c0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
190d0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
190e0 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42  ere is a GROUP B
190f0 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68  Y clause we migh
19100 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67  t need a sorting
19110 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20   index to.      
19120 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e  ** implement it.
19130 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20    Allocate that 
19140 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f  sorting index no
19150 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20  w.  If it turns 
19160 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  out.      ** tha
19170 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  t we do not need
19180 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74   it after all, t
19190 68 65 20 4f 70 65 6e 56 69 72 74 75 61 6c 20 69  he OpenVirtual i
191a0 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20  nstruction.     
191b0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76   ** will be conv
191c0 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f  erted into a Noo
191d0 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  p.  .      */.  
191e0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
191f0 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65  tingIdx = pParse
19200 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
19210 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
19220 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
19230 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29  Parse, pGroupBy)
19240 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
19250 69 6e 67 49 64 78 20 3d 0a 20 20 20 20 20 20 20  ingIdx =.       
19260 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
19270 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74  3(v, OP_OpenVirt
19280 75 61 6c 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ual, sAggInfo.so
19290 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20  rtingIdx,.      
192a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192b0 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72     sAggInfo.nSor
192c0 74 69 6e 67 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  tingColumn,.    
192d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192e0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
192f0 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
19300 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20  _HANDOFF);..    
19310 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
19320 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
19330 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42   used by GROUP B
19340 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63  Y aggregate proc
19350 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  essing.      */.
19360 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d        iUseFlag =
19370 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
19380 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61  .      iAbortFla
19390 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
193a0 2b 2b 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20  ++;.      iAMem 
193b0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
193c0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
193d0 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
193e0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d  nExpr;.      iBM
193f0 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
19400 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  m;.      pParse-
19410 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
19420 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
19430 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19440 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30  (v, OP_MemInt, 0
19450 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
19460 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
19470 28 28 76 2c 20 22 23 20 63 6c 65 61 72 20 61 62  ((v, "# clear ab
19480 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
19490 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
194a0 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74  dOp(v, OP_MemInt
194b0 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 0, iUseFlag);.
194c0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
194d0 74 28 28 76 2c 20 22 23 20 69 6e 64 69 63 61 74  t((v, "# indicat
194e0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d  e accumulator em
194f0 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71  pty"));.      sq
19500 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
19510 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
19520 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70  drInitializeLoop
19530 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
19540 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
19550 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
19560 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
19570 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
19580 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73   ** set.  This s
19590 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20  ubroutine first 
195a0 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73  looks at the iUs
195b0 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46  eFlag.  If iUseF
195c0 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  lag.      ** is 
195d0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
195e0 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20  al to zero, the 
195f0 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20  subroutine is a 
19600 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20  no-op.  If.     
19610 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69   ** the processi
19620 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  ng calls for the
19630 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c   query to abort,
19640 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
19650 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d  .      ** increm
19660 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46  ents the iAbortF
19670 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lag memory locat
19680 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ion before retur
19690 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a  ning in.      **
196a0 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c   order to signal
196b0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61   the caller to a
196c0 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bort..      */. 
196d0 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72       addrSetAbor
196e0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
196f0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
19700 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19710 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
19720 6e 74 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61  nt, 1, iAbortFla
19730 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
19740 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 65 74  mment((v, "# set
19750 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
19760 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19770 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74  eAddOp(v, OP_Ret
19780 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  urn, 0, 0);.    
19790 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
197a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
197b0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
197c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
197d0 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50  dOp(v, OP_IfMemP
197e0 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64  os, iUseFlag, ad
197f0 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a  drOutputRow+2);.
19800 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
19810 74 28 28 76 2c 20 22 23 20 47 72 6f 75 70 62 79  t((v, "# Groupby
19820 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
19830 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29  r entry point"))
19840 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19850 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
19860 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  eturn, 0, 0);.  
19870 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
19880 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
19890 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
198a0 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
198b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
198c0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
198d0 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
198e0 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 31  drOutputRow+1, 1
198f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19900 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65   rc = selectInne
19910 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
19920 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30   p->pEList, 0, 0
19930 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , pOrderBy,.    
19940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19950 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c         distinct,
19960 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a   eDest, iParm, .
19970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19980 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f             addrO
19990 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72  utputRow+1, addr
199a0 53 65 74 41 62 6f 72 74 2c 20 61 66 66 29 3b 0a  SetAbort, aff);.
199b0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
199c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
199d0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
199e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
199f0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
19a00 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  turn, 0, 0);.   
19a10 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
19a20 76 2c 20 22 23 20 65 6e 64 20 67 72 6f 75 70 62  v, "# end groupb
19a30 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
19a40 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
19a50 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
19a60 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
19a70 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70   reset the group
19a80 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a  -by accumulator.
19a90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
19aa0 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74  ddrReset = sqlit
19ab0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
19ac0 72 28 76 29 3b 0a 20 20 20 20 20 20 72 65 73 65  r(v);.      rese
19ad0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
19ae0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
19af0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19b00 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
19b10 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  turn, 0, 0);..  
19b20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
19b30 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
19b40 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
19b50 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
19b60 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
19b70 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
19b80 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
19b90 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
19ba0 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
19bb0 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
19bc0 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
19bd0 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
19be0 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
19bf0 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
19c00 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
19c10 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
19c20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
19c30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
19c40 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
19c50 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 49 6e 69  Label(v, addrIni
19c60 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20  tializeLoop);.  
19c70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19c80 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62  ddOp(v, OP_Gosub
19c90 2c 20 30 2c 20 61 64 64 72 52 65 73 65 74 29 3b  , 0, addrReset);
19ca0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  .      pWInfo = 
19cb0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
19cc0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
19cd0 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 47 72  st, pWhere, &pGr
19ce0 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 69 66  oupBy);.      if
19cf0 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
19d00 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
19d10 20 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42       if( pGroupB
19d20 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
19d30 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
19d40 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
19d50 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
19d60 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
19d70 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
19d80 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
19d90 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 56 69 72    The OP_OpenVir
19da0 74 75 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20  tual table will 
19db0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  be.        ** ca
19dc0 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65  ncelled later be
19dd0 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e  cause we still n
19de0 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70  eed to use the p
19df0 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20  KeyInfo.        
19e00 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72 6f 75  */.        pGrou
19e10 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
19e20 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  y;.        group
19e30 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20  BySort = 0;.    
19e40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19e50 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d   /* Rows are com
19e60 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74  ing out in undet
19e70 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20  ermined order.  
19e80 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a  We have to push.
19e90 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20          ** each 
19ea0 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69  row into a sorti
19eb0 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e  ng index, termin
19ec0 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f  ate the first lo
19ed0 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  op,.        ** t
19ee0 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68  hen loop over th
19ef0 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
19f00 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
19f10 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20  the output.     
19f20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20     ** in sorted 
19f30 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f  order.        */
19f40 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
19f50 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sort = 1;.      
19f60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
19f70 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
19f80 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  , pGroupBy);.   
19f90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19fa0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71 75  AddOp(v, OP_Sequ
19fb0 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73  ence, sAggInfo.s
19fc0 6f 72 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a 20  ortingIdx, 0);. 
19fd0 20 20 20 20 20 20 20 6a 20 3d 20 70 47 72 6f 75         j = pGrou
19fe0 70 42 79 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20 20  pBy->nExpr+1;.  
19ff0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1a000 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
1a010 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
1a020 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
1a030 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73  o_col *pCol = &s
1a040 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b  AggInfo.aCol[i];
1a050 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1a060 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
1a070 6d 6e 3c 6a 20 29 20 63 6f 6e 74 69 6e 75 65 3b  mn<j ) continue;
1a080 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1a090 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  Col->iColumn<0 )
1a0a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1a0b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1a0c0 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 70 43 6f 6c  , OP_Rowid, pCol
1a0d0 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  ->iTable, 0);.  
1a0e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1a0f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1a100 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1a110 50 5f 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e  P_Column, pCol->
1a120 69 54 61 62 6c 65 2c 20 70 43 6f 6c 2d 3e 69 43  iTable, pCol->iC
1a130 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
1a140 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6a 2b    }.          j+
1a150 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
1a160 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a170 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
1a180 52 65 63 6f 72 64 2c 20 6a 2c 20 30 29 3b 0a 20  Record, j, 0);. 
1a190 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1a1a0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
1a1b0 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66  xInsert, sAggInf
1a1c0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 30 29  o.sortingIdx, 0)
1a1d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1a1e0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
1a1f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1a200 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1a210 50 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f  P_Sort, sAggInfo
1a220 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
1a230 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56  rEnd);.        V
1a240 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1a250 23 20 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22  # GROUP BY sort"
1a260 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  ));.        sAgg
1a270 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49  Info.useSortingI
1a280 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  dx = 1;.      }.
1a290 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61  .      /* Evalua
1a2a0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  te the current G
1a2b0 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e  ROUP BY terms an
1a2c0 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62  d store in b0, b
1a2d0 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, b2....      *
1a2e0 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20  * (b0 is memory 
1a2f0 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30  location iBMem+0
1a300 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c  , b1 is iBMem+1,
1a310 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20   and so forth). 
1a320 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d       ** Then com
1a330 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  pare the current
1a340 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
1a350 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55  against the GROU
1a360 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20  P BY terms.     
1a370 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65   ** from the pre
1a380 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e  vious row curren
1a390 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30  tly stored in a0
1a3a0 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20  , a1, a2....    
1a3b0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54    */.      addrT
1a3c0 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  opOfLoop = sqlit
1a3d0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1a3e0 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  r(v);.      for(
1a3f0 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d  j=0; j<pGroupBy-
1a400 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
1a410 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
1a420 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
1a430 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a440 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
1a450 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
1a460 6e 67 49 64 78 2c 20 6a 29 3b 0a 20 20 20 20 20  ngIdx, j);.     
1a470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a480 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72      sAggInfo.dir
1a490 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ectMode = 1;.   
1a4a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1a4b0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1a4c0 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45  GroupBy->a[j].pE
1a4d0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
1a4e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1a4f0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
1a500 65 6d 53 74 6f 72 65 2c 20 69 42 4d 65 6d 2b 6a  emStore, iBMem+j
1a510 2c 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  , j<pGroupBy->nE
1a520 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  xpr-1);.      }.
1a530 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 47 72 6f        for(j=pGro
1a540 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 6a  upBy->nExpr-1; j
1a550 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  >=0; j--){.     
1a560 20 20 20 69 66 28 20 6a 3c 70 47 72 6f 75 70 42     if( j<pGroupB
1a570 79 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20  y->nExpr-1 ){.  
1a580 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1a590 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
1a5a0 65 6d 4c 6f 61 64 2c 20 69 42 4d 65 6d 2b 6a 2c  emLoad, iBMem+j,
1a5b0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
1a5c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1a5d0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
1a5e0 6d 4c 6f 61 64 2c 20 69 41 4d 65 6d 2b 6a 2c 20  mLoad, iAMem+j, 
1a5f0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
1a600 6a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  j==0 ){.        
1a610 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a620 4f 70 28 76 2c 20 4f 50 5f 45 71 2c 20 30 78 32  Op(v, OP_Eq, 0x2
1a630 30 30 2c 20 61 64 64 72 50 72 6f 63 65 73 73 52  00, addrProcessR
1a640 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ow);.        }el
1a650 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
1a660 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1a670 2c 20 4f 50 5f 4e 65 2c 20 30 78 32 30 30 2c 20  , OP_Ne, 0x200, 
1a680 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67  addrGroupByChang
1a690 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1a6a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a6b0 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
1a6c0 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f   (void*)pKeyInfo
1a6d0 2d 3e 61 43 6f 6c 6c 5b 6a 5d 2c 20 50 33 5f 43  ->aColl[j], P3_C
1a6e0 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d  OLLSEQ);.      }
1a6f0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
1a700 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75  ate code that ru
1a710 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ns whenever the 
1a720 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73  GROUP BY changes
1a730 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67  ..      ** Chang
1a740 65 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  e in the GROUP B
1a750 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  Y are detected b
1a760 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  y the previous c
1a770 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  ode.      ** blo
1a780 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65  ck.  If there we
1a790 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74  re no changes, t
1a7a0 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69  his block is ski
1a7b0 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  pped..      **. 
1a7c0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
1a7d0 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74  e copies current
1a7e0 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20   group by terms 
1a7f0 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a  in b0,b1,b2,....
1a800 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f        ** over to
1a810 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74   a0,a1,a2.  It t
1a820 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75  hen calls the ou
1a830 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a  tput subroutine.
1a840 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
1a850 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74  ets the aggregat
1a860 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
1a870 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61  gisters in prepa
1a880 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ration.      ** 
1a890 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f  for the next GRO
1a8a0 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20  UP BY batch..   
1a8b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
1a8c0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1a8d0 62 65 6c 28 76 2c 20 61 64 64 72 47 72 6f 75 70  bel(v, addrGroup
1a8e0 42 79 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  ByChange);.     
1a8f0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f   for(j=0; j<pGro
1a900 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  upBy->nExpr; j++
1a910 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1a920 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1a930 50 5f 4d 65 6d 4d 6f 76 65 2c 20 69 41 4d 65 6d  P_MemMove, iAMem
1a940 2b 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20  +j, iBMem+j);.  
1a950 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1a960 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1a970 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64  OP_Gosub, 0, add
1a980 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
1a990 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1a9a0 76 2c 20 22 23 20 6f 75 74 70 75 74 20 6f 6e 65  v, "# output one
1a9b0 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73   row"));.      s
1a9c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1a9d0 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20  v, OP_IfMemPos, 
1a9e0 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72  iAbortFlag, addr
1a9f0 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65  End);.      Vdbe
1aa00 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 63  Comment((v, "# c
1aa10 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22  heck abort flag"
1aa20 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
1aa30 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1aa40 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 52  _Gosub, 0, addrR
1aa50 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  eset);.      Vdb
1aa60 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
1aa70 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f  reset accumulato
1aa80 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
1aa90 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65  Update the aggre
1aaa0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
1aab0 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
1aac0 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20  ontent of.      
1aad0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ** the current r
1aae0 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ow.      */.    
1aaf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1ab00 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
1ab10 72 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20 20  rProcessRow);.  
1ab20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
1ab30 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
1ab40 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
1ab50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ab60 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31  (v, OP_MemInt, 1
1ab70 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
1ab80 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1ab90 76 2c 20 22 23 20 69 6e 64 69 63 61 74 65 20 64  v, "# indicate d
1aba0 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74  ata in accumulat
1abb0 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
1abc0 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   End of the loop
1abd0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1abe0 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
1abf0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1ac00 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1ac10 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f  P_Next, sAggInfo
1ac20 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
1ac30 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20  rTopOfLoop);.   
1ac40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ac50 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
1ac60 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
1ac70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1ac80 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
1ac90 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29  drSortingIdx, 1)
1aca0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1acb0 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66   /* Output the f
1acc0 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75  inal row of resu
1acd0 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  lt.      */.    
1ace0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1acf0 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  Op(v, OP_Gosub, 
1ad00 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  0, addrOutputRow
1ad10 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1ad20 6d 65 6e 74 28 28 76 2c 20 22 23 20 6f 75 74 70  ment((v, "# outp
1ad30 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b  ut final row"));
1ad40 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a  .      .    } /*
1ad50 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 20   endif pGroupBy 
1ad60 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20  */.    else {.  
1ad70 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
1ad80 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67   runs if the agg
1ad90 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52  regate has no GR
1ada0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
1adb0 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  The.      ** pro
1adc0 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20  cessing is much 
1add0 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68  simpler since th
1ade0 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69  ere is only a si
1adf0 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 2a  ngle row.      *
1ae00 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20  * of output..   
1ae10 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65     */.      rese
1ae20 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
1ae30 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
1ae40 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  .      pWInfo = 
1ae50 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1ae60 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
1ae70 73 74 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a  st, pWhere, 0);.
1ae80 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
1ae90 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
1aea0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 75 70 64  t_end;.      upd
1aeb0 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
1aec0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
1aed0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1aee0 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
1aef0 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
1af00 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
1af10 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
1af20 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
1af30 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
1af40 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
1af50 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1af60 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
1af70 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 31  ving, addrEnd, 1
1af80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1af90 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
1afa0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
1afb0 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  EList, 0, 0, 0, 
1afc0 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  -1, .           
1afd0 20 20 20 20 20 20 20 20 20 20 20 65 44 65 73 74             eDest
1afe0 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 45 6e 64  , iParm, addrEnd
1aff0 2c 20 61 64 64 72 45 6e 64 2c 20 61 66 66 29 3b  , addrEnd, aff);
1b000 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1b010 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1b020 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a  el(v, addrEnd);.
1b030 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69      .  } /* endi
1b040 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  f aggregate quer
1b050 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  y */..  /* If th
1b060 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
1b070 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
1b080 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
1b090 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
1b0a0 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
1b0b0 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
1b0c0 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
1b0d0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
1b0e0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f  {.    generateSo
1b0f0 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
1b100 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  , v, pEList->nEx
1b110 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  pr, eDest, iParm
1b120 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
1b130 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1b140 55 45 52 59 0a 20 20 2f 2a 20 49 66 20 74 68 69  UERY.  /* If thi
1b150 73 20 77 61 73 20 61 20 73 75 62 71 75 65 72 79  s was a subquery
1b160 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63 6f  , we have now co
1b170 6e 76 65 72 74 65 64 20 74 68 65 20 73 75 62 71  nverted the subq
1b180 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a  uery into a.  **
1b190 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1b1a0 2e 20 20 53 6f 20 73 65 74 20 74 68 65 20 53 72  .  So set the Sr
1b1b0 63 4c 69 73 74 5f 69 74 65 6d 2e 69 73 50 6f 70  cList_item.isPop
1b1c0 75 6c 61 74 65 64 20 66 6c 61 67 20 74 6f 20 70  ulated flag to p
1b1d0 72 65 76 65 6e 74 0a 20 20 2a 2a 20 74 68 69 73  revent.  ** this
1b1e0 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62   subquery from b
1b1f0 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61  eing evaluated a
1b200 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63  gain and to forc
1b210 65 20 74 68 65 20 75 73 65 20 6f 66 0a 20 20 2a  e the use of.  *
1b220 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
1b230 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
1b240 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ( pParent ){.   
1b250 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1b260 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72  ->pSrc->nSrc>par
1b270 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73  entTab );.    as
1b280 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1b290 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62  Src->a[parentTab
1b2a0 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a  ].pSelect==p );.
1b2b0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
1b2c0 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e  c->a[parentTab].
1b2d0 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b  isPopulated = 1;
1b2e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1b2f0 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
1b300 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20  kip this query. 
1b310 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1b320 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1b330 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68   iEnd);..  /* Th
1b340 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63  e SELECT was suc
1b350 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e  cessfully coded.
1b360 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72     Set the retur
1b370 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a  n code to 0.  **
1b380 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20   to indicate no 
1b390 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72  errors..  */.  r
1b3a0 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  c = 0;..  /* Con
1b3b0 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65  trol jumps to he
1b3c0 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  re if an error i
1b3d0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62  s encountered ab
1b3e0 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a  ove, or upon.  *
1b3f0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64  * successful cod
1b400 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ing of the SELEC
1b410 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65  T..  */.select_e
1b420 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69  nd:..  /* Identi
1b430 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
1b440 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
1b450 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61  ing them in a ca
1b460 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
1b470 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
1b480 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
1b490 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d   is going to som
1b4a0 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74  e other destinat
1b4b0 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
1b4c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1b4d0 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
1b4e0 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65  back ){.    gene
1b4f0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
1b500 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
1b510 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
1b520 20 20 73 71 6c 69 74 65 46 72 65 65 28 73 41 67    sqliteFree(sAg
1b530 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73  gInfo.aCol);.  s
1b540 71 6c 69 74 65 46 72 65 65 28 73 41 67 67 49 6e  qliteFree(sAggIn
1b550 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74  fo.aFunc);.  ret
1b560 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.