/ Hex Artifact Content
Login

Artifact c196faee625154a40d994be3de0a7725525d8531:


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 36  select.c,v 1.306
0200: 20 32 30 30 36 2f 30 33 2f 30 36 20 32 30 3a 35   2006/03/06 20:5
0210: 35 3a 34 36 20 64 72 68 20 45 78 70 20 24 0a 2a  5:46 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 4b 20 76  made and the K v
3390: 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65 64  alues are popped
33a0: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61   from the.** sta
33b0: 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20  ck if the top N 
33c0: 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74  elements are not
33d0: 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74   distinct..*/.st
33e0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69  atic void codeDi
33f0: 73 74 69 6e 63 74 28 0a 20 20 56 64 62 65 20 2a  stinct(.  Vdbe *
3400: 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v,           /* 
3410: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
3420: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
3430: 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20  int iTab,       
3440: 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20     /* A sorting 
3450: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65  index used to te
3460: 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e  st for distinctn
3470: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ess */.  int add
3480: 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a  rRepeat,    /* J
3490: 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e  ump to here if n
34a0: 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  ot distinct */. 
34b0: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
34c0: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 70 20 4e      /* The top N
34d0: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
34e0: 20 73 74 61 63 6b 20 6d 75 73 74 20 62 65 20 64   stack must be d
34f0: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
3500: 20 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   K              
3510: 2f 2a 20 50 6f 70 20 4b 20 65 6c 65 6d 65 6e 74  /* Pop K element
3520: 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  s from the stack
3530: 20 69 66 20 69 6e 64 69 73 74 69 6e 63 74 20 2a   if indistinct *
3540: 2f 0a 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41 4c  /.){.#if NULL_AL
3550: 57 41 59 53 5f 44 49 53 54 49 4e 43 54 0a 20 20  WAYS_DISTINCT.  
3560: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3570: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d  (v, OP_IsNull, -
3580: 4e 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  N, sqlite3VdbeCu
3590: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 36 29 3b  rrentAddr(v)+6);
35a0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
35b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
35c0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 2d 4e 2c  _MakeRecord, -N,
35d0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
35e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69  beAddOp(v, OP_Di
35f0: 73 74 69 6e 63 74 2c 20 69 54 61 62 2c 20 73 71  stinct, iTab, sq
3600: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
3610: 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 73 71  Addr(v)+3);.  sq
3620: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3630: 2c 20 4f 50 5f 50 6f 70 2c 20 4b 2c 20 30 29 3b  , OP_Pop, K, 0);
3640: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3650: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
3660: 30 2c 20 61 64 64 72 52 65 70 65 61 74 29 3b 0a  0, addrRepeat);.
3670: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
3680: 2c 20 22 23 20 73 6b 69 70 20 69 6e 64 69 73 74  , "# skip indist
3690: 69 6e 63 74 20 72 65 63 6f 72 64 73 22 29 29 3b  inct records"));
36a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
36b0: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  dOp(v, OP_IdxIns
36c0: 65 72 74 2c 20 69 54 61 62 2c 20 30 29 3b 0a 7d  ert, iTab, 0);.}
36d0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
36e0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
36f0: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
3700: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
3710: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
3720: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
3730: 49 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43  If srcTab and nC
3740: 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a  olumn are both z
3750: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45  ero, then the pE
3760: 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  List expressions
3770: 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65  .** are evaluate
3780: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  d in order to ge
3790: 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  t the data for t
37a0: 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f  his row.  If nCo
37b0: 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64  lumn>0.** then d
37c0: 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72  ata is pulled fr
37d0: 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45  om srcTab and pE
37e0: 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c  List is used onl
37f0: 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20  y to get the.** 
3800: 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 65 61  datatypes for ea
3810: 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74  ch column..*/.st
3820: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 49  atic int selectI
3830: 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73  nnerLoop(.  Pars
3840: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3850: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
3860: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
3870: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
3880: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
3890: 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74  mplete select st
38a0: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
38b0: 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ded */.  ExprLis
38c0: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
38d0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75   /* List of valu
38e0: 65 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74  es being extract
38f0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54  ed */.  int srcT
3900: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
3910: 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f  /* Pull data fro
3920: 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  m this table */.
3930: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
3940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3950: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
3960: 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  n the source tab
3970: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
3980: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
3990: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
39a0: 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73 69  sort results usi
39b0: 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20  ng this key */. 
39c0: 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20   int distinct,  
39d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e           /* If >
39e0: 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65  =0, make sure re
39f0: 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e  sults are distin
3a00: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ct */.  int eDes
3a10: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
3a20: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
3a30: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
3a40: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c   */.  int iParm,
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3a60: 20 41 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   An argument to 
3a70: 74 68 65 20 64 69 73 70 6f 73 61 6c 20 6d 65 74  the disposal met
3a80: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  hod */.  int iCo
3a90: 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20  ntinue,         
3aa0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
3ab0: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
3ac0: 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ext row */.  int
3ad0: 20 69 42 72 65 61 6b 2c 20 20 20 20 20 20 20 20   iBreak,        
3ae0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
3af0: 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
3b00: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
3b10: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20   */.  char *aff 
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b30: 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
3b40: 20 69 66 20 65 44 65 73 74 20 69 73 20 53 52 54   if eDest is SRT
3b50: 5f 55 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56  _Union */.){.  V
3b60: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
3b70: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
3b80: 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e  .  int hasDistin
3b90: 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ct;        /* Tr
3ba0: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
3bb0: 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
3bc0: 65 73 65 6e 74 20 2a 2f 0a 0a 20 20 69 66 28 20  esent */..  if( 
3bd0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) return 0;
3be0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
3bf0: 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  t!=0 );..  /* If
3c00: 20 74 68 65 72 65 20 77 61 73 20 61 20 4c 49 4d   there was a LIM
3c10: 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  IT clause on the
3c20: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3c30: 74 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 63  t, then do the c
3c40: 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65  heck.  ** to see
3c50: 20 69 66 20 74 68 69 73 20 72 6f 77 20 73 68 6f   if this row sho
3c60: 75 6c 64 20 62 65 20 6f 75 74 70 75 74 2e 0a 20  uld be output.. 
3c70: 20 2a 2f 0a 20 20 68 61 73 44 69 73 74 69 6e 63   */.  hasDistinc
3c80: 74 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 20  t = distinct>=0 
3c90: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
3ca0: 3e 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72  >0;.  if( pOrder
3cb0: 42 79 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73  By==0 && !hasDis
3cc0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f 64  tinct ){.    cod
3cd0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43  eOffset(v, p, iC
3ce0: 6f 6e 74 69 6e 75 65 2c 20 30 29 3b 0a 20 20 7d  ontinue, 0);.  }
3cf0: 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20  ..  /* Pull the 
3d00: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e  requested column
3d10: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43  s..  */.  if( nC
3d20: 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66  olumn>0 ){.    f
3d30: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
3d40: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  n; i++){.      s
3d50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3d60: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
3d70: 63 54 61 62 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  cTab, i);.    }.
3d80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
3d90: 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  lumn = pEList->n
3da0: 45 78 70 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  Expr;.    sqlite
3db0: 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
3dc0: 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  t(pParse, pEList
3dd0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
3de0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
3df0: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
3e00: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
3e10: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
3e20: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
3e30: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
3e40: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
3e50: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
3e60: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
3e70: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  lt..  */.  if( h
3e80: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
3e90: 20 20 69 6e 74 20 6e 20 3d 20 70 45 4c 69 73 74    int n = pEList
3ea0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 63 6f 64  ->nExpr;.    cod
3eb0: 65 44 69 73 74 69 6e 63 74 28 76 2c 20 64 69 73  eDistinct(v, dis
3ec0: 74 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65  tinct, iContinue
3ed0: 2c 20 6e 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 69  , n, n+1);.    i
3ee0: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
3ef0: 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73  {.      codeOffs
3f00: 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
3f10: 75 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ue, nColumn);.  
3f20: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63    }.  }..  switc
3f30: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
3f40: 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c  /* In this mode,
3f50: 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72   write each quer
3f60: 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20  y result to the 
3f70: 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  key of the tempo
3f80: 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
3f90: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
3fa0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3fb0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
3fc0: 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52 54  ECT.    case SRT
3fd0: 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20  _Union: {.      
3fe0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3ff0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
4000: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c  d, nColumn, NULL
4010: 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54  _ALWAYS_DISTINCT
4020: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 66 66  );.      if( aff
4030: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4040: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
4050: 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53  v, -1, aff, P3_S
4060: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a  TATIC);.      }.
4070: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4080: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
4090: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 30  Insert, iParm, 0
40a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
40b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
40c0: 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64  nstruct a record
40d0: 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20   from the query 
40e0: 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74  result, but inst
40f0: 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61  ead of.    ** sa
4100: 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64  ving that record
4110: 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65  , use it as a ke
4120: 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d  y to delete elem
4130: 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ents from.    **
4140: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
4150: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
4160: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
4170: 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20  Except: {.      
4180: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
4190: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
41a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
41b0: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
41c0: 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44  n, NULL_ALWAYS_D
41d0: 49 53 54 49 4e 43 54 29 3b 0a 20 20 20 20 20 20  ISTINCT);.      
41e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
41f0: 65 50 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20  eP3(v, -1, aff, 
4200: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
4210: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4220: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  Op(v, OP_NotFoun
4230: 64 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 2b 33  d, iParm, addr+3
4240: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4250: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4260: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 30  Delete, iParm, 0
4270: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4280: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
4290: 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
42a0: 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
42b0: 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
42c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
42d0: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
42e0: 20 63 61 73 65 20 53 52 54 5f 56 69 72 74 75 61   case SRT_Virtua
42f0: 6c 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71  lTab: {.      sq
4300: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4310: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
4320: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
4330: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
4340: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
4350: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
4360: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 29 3b  e, pOrderBy, p);
4370: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4390: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
43a0: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 30 29  Rowid, iParm, 0)
43b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
43c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
43d0: 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20  _Pull, 1, 0);.  
43e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
43f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73  eAddOp(v, OP_Ins
4400: 65 72 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  ert, iParm, 0);.
4410: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4420: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
4430: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4440: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
4450: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
4460: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
4470: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
4480: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
4490: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
44a0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
44b0: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
44c0: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
44d0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
44e0: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
44f0: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
4500: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
4510: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
4520: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31  .      int addr1
4530: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
4540: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
4550: 20 20 20 20 69 6e 74 20 61 64 64 72 32 3b 0a 0a      int addr2;..
4560: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
4570: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
4580: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4590: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  Op(v, OP_NotNull
45a0: 2c 20 2d 31 2c 20 61 64 64 72 31 2b 33 29 3b 0a  , -1, addr1+3);.
45b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
45c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
45d0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  , 1, 0);.      a
45e0: 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
45f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
4600: 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  to, 0, 0);.     
4610: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
4620: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66  .        /* At f
4630: 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20  irst glance you 
4640: 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63  would think we c
4650: 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75  ould optimize ou
4660: 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  t the.        **
4670: 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68 69   ORDER BY in thi
4680: 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68 65  s case since the
4690: 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65   order of entrie
46a0: 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20  s in the set.   
46b0: 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74       ** does not
46c0: 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74 68   matter.  But th
46d0: 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c  ere might be a L
46e0: 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20  IMIT clause, in 
46f0: 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a  which.        **
4700: 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72 20   case the order 
4710: 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20  does matter */. 
4720: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
4730: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
4740: 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20  rderBy, p);.    
4750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4760: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 20 3d   char affinity =
4770: 20 28 69 50 61 72 6d 3e 3e 31 36 29 26 30 78 46   (iParm>>16)&0xF
4780: 46 3b 0a 20 20 20 20 20 20 20 20 61 66 66 69 6e  F;.        affin
4790: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  ity = sqlite3Com
47a0: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
47b0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
47c0: 20 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20   affinity);.    
47d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
47e0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
47f0: 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66 66 69  ord, 1, 0, &affi
4800: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
4810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4820: 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  Op(v, OP_IdxInse
4830: 72 74 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30  rt, (iParm&0x000
4840: 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20  0FFFF), 0);.    
4850: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
4860: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
4870: 20 61 64 64 72 32 29 3b 0a 20 20 20 20 20 20 62   addr2);.      b
4880: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
4890: 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65   /* If any row e
48a0: 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75  xist in the resu
48b0: 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74  lt set, record t
48c0: 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f  hat fact and abo
48d0: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rt..    */.    c
48e0: 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20  ase SRT_Exists: 
48f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
4900: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
4910: 65 6d 49 6e 74 2c 20 31 2c 20 69 50 61 72 6d 29  emInt, 1, iParm)
4920: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4930: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4940: 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  op, nColumn, 0);
4950: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
4960: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
4970: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
4980: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
4990: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
49a0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
49b0: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
49c0: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
49d0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
49e0: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
49f0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
4a00: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
4a10: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
4a20: 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
4a30: 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
4a40: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
4a50: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
4a60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
4a70: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
4a80: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
4a90: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
4aa0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
4ab0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a  , pOrderBy, p);.
4ac0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4ae0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
4af0: 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b  tore, iParm, 1);
4b00: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
4b10: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
4b20: 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
4b30: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
4b40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4b50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
4b60: 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
4b70: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
4b80: 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  RY */..    /* Se
4b90: 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  nd the data to t
4ba0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  he callback func
4bb0: 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62  tion or to a sub
4bc0: 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65  routine.  In the
4bd0: 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20  .    ** case of 
4be0: 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68  a subroutine, th
4bf0: 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73  e subroutine its
4c00: 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62  elf is responsib
4c10: 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f  le for.    ** po
4c20: 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 20 66  pping the data f
4c30: 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20  rom the stack.. 
4c40: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4c50: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 0a 20  RT_Subroutine:. 
4c60: 20 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c     case SRT_Call
4c70: 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 69 66  back: {.      if
4c80: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
4c90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4ca0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
4cb0: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
4cc0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75  , 0);.        pu
4cd0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
4ce0: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
4cf0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
4d00: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75  f( eDest==SRT_Su
4d10: 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  broutine ){.    
4d20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4d30: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62  ddOp(v, OP_Gosub
4d40: 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 0, iParm);.   
4d50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4d60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4d70: 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63  Op(v, OP_Callbac
4d80: 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  k, nColumn, 0);.
4d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4da0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
4db0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
4dc0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
4dd0: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
4de0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
4df0: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
4e00: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
4e10: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
4e20: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
4e30: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
4e40: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
4e50: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
4e60: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
4e70: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
4e80: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
4e90: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
4ea0: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
4eb0: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
4ec0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
4ed0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
4ee0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
4ef0: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
4f00: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
4f10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4f20: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c  (v, OP_Pop, nCol
4f30: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  umn, 0);.      b
4f40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
4f50: 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  if.  }..  /* Jum
4f60: 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
4f70: 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
4f80: 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
4f90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
4fa0: 69 4c 69 6d 69 74 3e 3d 30 20 26 26 20 70 4f 72  iLimit>=0 && pOr
4fb0: 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
4fc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4fd0: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20  (v, OP_MemIncr, 
4fe0: 2d 31 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a  -1, p->iLimit);.
4ff0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5000: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  ddOp(v, OP_IfMem
5010: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
5020: 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 20 20   iBreak);.  }.  
5030: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
5040: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
5050: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e  ession list, gen
5060: 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  erate a KeyInfo 
5070: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
5080: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f  ecords.** the co
5090: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
50a0: 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   for each expres
50b0: 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70  sion in that exp
50c0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
50d0: 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c  .** If the ExprL
50e0: 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ist is an ORDER 
50f0: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
5100: 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72  lause then the r
5110: 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49  esulting.** KeyI
5120: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
5130: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
5140: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
5150: 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
5160: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  .** implement th
5170: 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74  at clause.  If t
5180: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74  he ExprList is t
5190: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
51a0: 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65   a SELECT.** the
51b0: 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  n the KeyInfo st
51c0: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
51d0: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
51e0: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
51f0: 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d  l.** index to im
5200: 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e  plement a DISTIN
5210: 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53  CT test..**.** S
5220: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
5230: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
5240: 72 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f  re is obtain fro
5250: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
5260: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
5270: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
5280: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
5290: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
52a0: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
52b0: 2a 20 66 72 65 65 64 2e 20 20 41 64 64 20 74 68  * freed.  Add th
52c0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
52d0: 75 72 65 20 74 6f 20 74 68 65 20 50 33 20 66 69  ure to the P3 fi
52e0: 65 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65  eld of an opcode
52f0: 20 75 73 69 6e 67 0a 2a 2a 20 50 33 5f 4b 45 59   using.** P3_KEY
5300: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20  INFO_HANDOFF is 
5310: 74 68 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66  the usual way of
5320: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68   dealing with th
5330: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65  is..*/.static Ke
5340: 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72  yInfo *keyInfoFr
5350: 6f 6d 45 78 70 72 4c 69 73 74 28 50 61 72 73 65  omExprList(Parse
5360: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
5370: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71  st *pList){.  sq
5380: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5390: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45  se->db;.  int nE
53a0: 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  xpr;.  KeyInfo *
53b0: 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  pInfo;.  struct 
53c0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
53d0: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Item;.  int i;..
53e0: 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d    nExpr = pList-
53f0: 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20  >nExpr;.  pInfo 
5400: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
5410: 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b  sizeof(*pInfo) +
5420: 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43   nExpr*(sizeof(C
5430: 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20  ollSeq*)+1) );. 
5440: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
5450: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
5460: 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66  der = (u8*)&pInf
5470: 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b  o->aColl[nExpr];
5480: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65  .    pInfo->nFie
5490: 6c 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20  ld = nExpr;.    
54a0: 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43  pInfo->enc = ENC
54b0: 28 64 62 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  (db);.    for(i=
54c0: 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
54d0: 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c  a; i<nExpr; i++,
54e0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
54f0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
5500: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
5510: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
5520: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
5530: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  >pExpr);.      i
5540: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
5550: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d       pColl = db-
5560: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
5570: 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d    }.      pInfo-
5580: 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c  >aColl[i] = pCol
5590: 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  l;.      pInfo->
55a0: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
55b0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
55c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
55d0: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a  turn pInfo;.}...
55e0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
55f0: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
5600: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
5610: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
5620: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
5630: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
5640: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
5650: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
5660: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
5670: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
5680: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
5690: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
56a0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
56b0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
56c0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
56d0: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
56e0: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
56f0: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
5700: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 53 65 6c  eSortTail(.  Sel
5710: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 2f 2a  ect *p,       /*
5720: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
5730: 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20  ement */.  Vdbe 
5740: 2a 76 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 47  *v,         /* G
5750: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
5760: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
5770: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
5780: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
5790: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
57a0: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
57b0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
57c0: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
57d0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69   here */.  int i
57e0: 50 61 72 6d 20 20 20 20 20 20 20 20 2f 2a 20 4f  Parm        /* O
57f0: 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65  ptional paramete
5800: 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  r associated wit
5810: 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20  h eDest */.){.  
5820: 69 6e 74 20 62 72 6b 20 3d 20 73 71 6c 69 74 65  int brk = sqlite
5830: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
5840: 29 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 20 3d 20  );.  int cont = 
5850: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
5860: 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61  abel(v);.  int a
5870: 64 64 72 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  ddr;.  int iTab;
5880: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
5890: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
58a0: 72 42 79 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70  rBy;..  iTab = p
58b0: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
58c0: 72 3b 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20  r;.  addr = 1 + 
58d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
58e0: 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61  (v, OP_Sort, iTa
58f0: 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f 64 65 4f  b, brk);.  codeO
5900: 66 66 73 65 74 28 76 2c 20 70 2c 20 63 6f 6e 74  ffset(v, p, cont
5910: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
5920: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
5930: 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72  olumn, iTab, pOr
5940: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31  derBy->nExpr + 1
5950: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  );.  switch( eDe
5960: 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  st ){.    case S
5970: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
5980: 73 65 20 53 52 54 5f 56 69 72 74 75 61 6c 54 61  se SRT_VirtualTa
5990: 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b: {.      sqlit
59a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
59b0: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
59c0: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  m, 0);.      sql
59d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
59e0: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
59f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5a00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
5a10: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b  sert, iParm, 0);
5a20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5a30: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
5a40: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
5a50: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
5a60: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
5a70: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
5a80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5a90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
5aa0: 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71 6c 69 74  tNull, -1, sqlit
5ab0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
5ac0: 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20 73  r(v)+3);.      s
5ad0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5ae0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
5af0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5b00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
5b10: 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33 56  oto, 0, sqlite3V
5b20: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
5b30: 29 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  )+3);.      sqli
5b40: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
5b50: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20  _MakeRecord, 1, 
5b60: 30 2c 20 22 63 22 2c 20 50 33 5f 53 54 41 54 49  0, "c", P3_STATI
5b70: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
5b80: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5b90: 5f 49 64 78 49 6e 73 65 72 74 2c 20 28 69 50 61  _IdxInsert, (iPa
5ba0: 72 6d 26 30 78 30 30 30 30 46 46 46 46 29 2c 20  rm&0x0000FFFF), 
5bb0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
5bc0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
5bd0: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
5be0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
5bf0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
5c00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5c10: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50   OP_MemStore, iP
5c20: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
5c30: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
5c40: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
5c50: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
5c60: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
5c70: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
5c80: 20 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c     case SRT_Call
5c90: 62 61 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53  back:.    case S
5ca0: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b  RT_Subroutine: {
5cb0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
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 49 6e 74 65 67  ddOp(v, OP_Integ
5ce0: 65 72 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  er, p->pEList->n
5cf0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
5d00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5d10: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
5d20: 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0);.      for(i=
5d30: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
5d40: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
5d50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5d60: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c  OP_Column, -1-i,
5d70: 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
5d80: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
5d90: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
5da0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5db0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
5dc0: 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  lback, nColumn, 
5dd0: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
5de0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5df0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5e00: 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29  Gosub, 0, iParm)
5e10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5e20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5e30: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30  (v, OP_Pop, 2, 0
5e40: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5e50: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
5e60: 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t: {.      /* Do
5e70: 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
5e80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5e90: 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
5ea0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
5eb0: 6c 6f 6f 70 20 77 68 65 6e 20 74 68 65 20 4c 49  loop when the LI
5ec0: 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 0a 20  MIT is reached. 
5ed0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69   */.  if( p->iLi
5ee0: 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  mit>=0 ){.    sq
5ef0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5f00: 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31  , OP_MemIncr, -1
5f10: 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20  , p->iLimit);.  
5f20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5f30: 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65  Op(v, OP_IfMemZe
5f40: 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 62  ro, p->iLimit, b
5f50: 72 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  rk);.  }..  /* T
5f60: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
5f70: 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
5f80: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
5f90: 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20  abel(v, cont);. 
5fa0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5fb0: 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  p(v, OP_Next, iT
5fc0: 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c  ab, addr);.  sql
5fd0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
5fe0: 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 7d 0a  abel(v, brk);.}.
5ff0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
6000: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
6010: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
6020: 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20  he 'declaration 
6030: 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20  type' of the.** 
6040: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
6050: 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79  . The string may
6060: 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73   be treated as s
6070: 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c  tatic by the cal
6080: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ler..**.** The d
6090: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
60a0: 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74  is the exact dat
60b0: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
60c0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
60d0: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
60e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
60f0: 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78  tement if the ex
6100: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
6110: 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63  lumn. The.** dec
6120: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
6130: 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20  r a ROWID field 
6140: 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63  is INTEGER. Exac
6150: 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72  tly when an expr
6160: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e  ession.** is con
6170: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
6180: 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20   can be complex 
6190: 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  in the presence 
61a0: 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54  of subqueries. T
61b0: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  he.** result-set
61c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
61d0: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
61e0: 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65  ing SELECT state
61f0: 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e  ments is .** con
6200: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
6210: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
6220: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  n..**.**   SELEC
6230: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
6240: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
6250: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
6260: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
6270: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
6280: 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  bl);.**   SELECT
6290: 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43   abc FROM (SELEC
62a0: 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f  T col AS abc FRO
62b0: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54  M tbl);.** .** T
62c0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
62d0: 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72  ype for any expr
62e0: 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  ession other tha
62f0: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55  n a column is NU
6300: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  LL..*/.static co
6310: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e  nst char *column
6320: 54 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  Type(.  NameCont
6330: 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70  ext *pNC, .  Exp
6340: 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73  r *pExpr,.  cons
6350: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69  t char **pzOrigi
6360: 6e 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  nDb,.  const cha
6370: 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c  r **pzOriginTab,
6380: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
6390: 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20  pzOriginCol.){. 
63a0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
63b0: 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  pe = 0;.  char c
63c0: 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20  onst *zOriginDb 
63d0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
63e0: 74 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20  t *zOriginTab = 
63f0: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
6400: 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b  *zOriginCol = 0;
6410: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20  .  int j;.  if( 
6420: 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d  pExpr==0 || pNC-
6430: 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72  >pSrcList==0 ) r
6440: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54  eturn 0;..  /* T
6450: 68 65 20 54 4b 5f 41 53 20 6f 70 65 72 61 74 6f  he TK_AS operato
6460: 72 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72  r can only occur
6470: 20 69 6e 20 4f 52 44 45 52 20 42 59 2c 20 47 52   in ORDER BY, GR
6480: 4f 55 50 20 42 59 2c 20 48 41 56 49 4e 47 2c 0a  OUP BY, HAVING,.
6490: 20 20 2a 2a 20 61 6e 64 20 4c 49 4d 49 54 20 63    ** and LIMIT c
64a0: 6c 61 75 73 65 73 2e 20 20 42 75 74 20 70 45 78  lauses.  But pEx
64b0: 70 72 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e  pr originates in
64c0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
64d0: 6f 66 20 61 0a 20 20 2a 2a 20 53 45 4c 45 43 54  of a.  ** SELECT
64e0: 2e 20 20 53 6f 20 70 45 78 70 72 20 63 61 6e 20  .  So pExpr can 
64f0: 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 61 6e  never contain an
6500: 20 41 53 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   AS operator..  
6510: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  */.  assert( pEx
6520: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20 29 3b  pr->op!=TK_AS );
6530: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
6540: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
6550: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
6560: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
6570: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
6580: 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74  mn. Locate the t
6590: 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  able the column 
65a0: 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a  is being.      *
65b0: 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  * extracted from
65c0: 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e   in NameContext.
65d0: 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74  pSrcList. This t
65e0: 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c  able may be real
65f0: 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
6600: 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75  se table or a su
6610: 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f  bquery..      */
6620: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
6630: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ab = 0;         
6640: 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75     /* Table stru
6650: 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20  cture column is 
6660: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
6670: 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
6680: 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pS = 0;         
6690: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68      /* Select th
66a0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
66b0: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
66c0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
66d0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20  Expr->iColumn;  
66e0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
66f0: 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20  mn in pTab */.  
6700: 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26      while( pNC &
6710: 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20  & !pTab ){.     
6720: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62     SrcList *pTab
6730: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
6740: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  List;.        fo
6750: 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74  r(j=0;j<pTabList
6760: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
6770: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
6780: 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  !=pExpr->iTable;
6790: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  j++);.        if
67a0: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
67b0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
67c0: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
67d0: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
67e0: 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c        pS = pTabL
67f0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63  ist->a[j].pSelec
6800: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
6810: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20  {.          pNC 
6820: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
6830: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6840: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
6850: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
6860: 20 46 49 58 20 4d 45 3a 0a 20 20 20 20 20 20 20   FIX ME:.       
6870: 20 2a 2a 20 54 68 69 73 20 63 61 6e 20 6f 63 63   ** This can occ
6880: 75 72 73 20 69 66 20 79 6f 75 20 68 61 76 65 20  urs if you have 
6890: 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 22  something like "
68a0: 53 45 4c 45 43 54 20 6e 65 77 2e 78 3b 22 20 69  SELECT new.x;" i
68b0: 6e 73 69 64 65 0a 20 20 20 20 20 20 20 20 2a 2a  nside.        **
68c0: 20 61 20 74 72 69 67 67 65 72 2e 20 20 49 6e 20   a trigger.  In 
68d0: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
68e0: 79 6f 75 20 72 65 66 65 72 65 6e 63 65 20 74 68  you reference th
68f0: 65 20 73 70 65 63 69 61 6c 20 22 6e 65 77 22 0a  e special "new".
6900: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
6910: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
6920: 65 74 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20  et of a select. 
6930: 20 57 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   We do not have 
6940: 61 20 67 6f 6f 64 20 77 61 79 0a 20 20 20 20 20  a good way.     
6950: 20 20 20 2a 2a 20 74 6f 20 66 69 6e 64 20 74 68     ** to find th
6960: 65 20 61 63 74 75 61 6c 20 74 61 62 6c 65 20 74  e actual table t
6970: 79 70 65 2c 20 73 6f 20 63 61 6c 6c 20 69 74 20  ype, so call it 
6980: 22 54 45 58 54 22 2e 20 20 54 68 69 73 20 69 73  "TEXT".  This is
6990: 20 72 65 61 6c 6c 79 0a 20 20 20 20 20 20 20 20   really.        
69a0: 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 66 20  ** something of 
69b0: 61 20 62 75 67 2c 20 62 75 74 20 49 20 64 6f 20  a bug, but I do 
69c0: 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20  not know how to 
69d0: 66 69 78 20 69 74 2e 0a 20 20 20 20 20 20 20 20  fix it..        
69e0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
69f0: 69 73 20 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74  is code does not
6a00: 20 70 72 6f 64 75 63 65 20 74 68 65 20 63 6f 72   produce the cor
6a10: 72 65 63 74 20 61 6e 73 77 65 72 20 2d 20 69 74  rect answer - it
6a20: 20 6a 75 73 74 20 70 72 65 76 65 6e 74 73 0a 20   just prevents. 
6a30: 20 20 20 20 20 20 20 2a 2a 20 61 20 73 65 67 66         ** a segf
6a40: 61 75 6c 74 2e 20 20 53 65 65 20 74 69 63 6b 65  ault.  See ticke
6a50: 74 20 23 31 32 32 39 2e 0a 20 20 20 20 20 20 20  t #1229..       
6a60: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 54 79 70   */.        zTyp
6a70: 65 20 3d 20 22 54 45 58 54 22 3b 0a 20 20 20 20  e = "TEXT";.    
6a80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6a90: 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
6aa0: 28 20 70 54 61 62 20 29 3b 0a 23 69 66 6e 64 65  ( pTab );.#ifnde
6ab0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
6ac0: 42 51 55 45 52 59 0a 20 20 20 20 20 20 69 66 28  BQUERY.      if(
6ad0: 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   pS ){.        /
6ae0: 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73  * The "table" is
6af0: 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d   actually a sub-
6b00: 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77  select or a view
6b10: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
6b20: 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  use.        ** o
6b30: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
6b40: 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74  tement. Return t
6b50: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
6b60: 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20  ype and origin. 
6b70: 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66         ** data f
6b80: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  or the result-se
6b90: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
6ba0: 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20  sub-select..    
6bb0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
6bc0: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  f( iCol>=0 && iC
6bd0: 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<pS->pEList->n
6be0: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
6bf0: 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20    /* If iCol is 
6c00: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
6c10: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
6c20: 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65  ion requests the
6c30: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  .          ** ro
6c40: 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73  wid of the sub-s
6c50: 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54  elect or view. T
6c60: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
6c70: 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20  s legal (see .  
6c80: 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20          ** test 
6c90: 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20  case misc2.2.2) 
6ca0: 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c  - it always eval
6cb0: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20  uates to NULL.. 
6cc0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
6cd0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
6ce0: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  t sNC;.         
6cf0: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
6d00: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
6d10: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
6d20: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
6d30: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20  S->pSrc;.       
6d40: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30     sNC.pNext = 0
6d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
6d60: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
6d70: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
6d80: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
6d90: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
6da0: 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e  iginDb, &zOrigin
6db0: 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c  Tab, &zOriginCol
6dc0: 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ); .        }.  
6dd0: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
6de0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
6df0: 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
6e00: 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61      /* A real ta
6e10: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ble */.        a
6e20: 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20  ssert( !pS );.  
6e30: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
6e40: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
6e50: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61  iPKey;.        a
6e60: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
6e70: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
6e80: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
6e90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
6ea0: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
6eb0: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
6ec0: 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20  GER";.          
6ed0: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f  zOriginCol = "ro
6ee0: 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65  wid";.        }e
6ef0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
6f00: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
6f10: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
6f20: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e           zOrigin
6f30: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
6f40: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
6f50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6f60: 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 70 54 61  zOriginTab = pTa
6f70: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
6f80: 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73    if( pNC->pPars
6f90: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
6fa0: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
6fb0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e  SchemaToIndex(pN
6fc0: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  C->pParse->db, p
6fd0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
6fe0: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e           zOrigin
6ff0: 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  Db = pNC->pParse
7000: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
7010: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
7020: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
7030: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
7040: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
7050: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
7060: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
7070: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
7080: 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73  ssion is a sub-s
7090: 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68  elect. Return th
70a0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
70b0: 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  pe and.      ** 
70c0: 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20  origin info for 
70d0: 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  the single colum
70e0: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
70f0: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
7100: 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  T.      ** state
7110: 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
7120: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
7130: 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65   sNC;.      Sele
7140: 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e  ct *pS = pExpr->
7150: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45  pSelect;.      E
7160: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
7170: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
7180: 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  .      sNC.pSrcL
7190: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
71a0: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
71b0: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43  = pNC;.      sNC
71c0: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
71d0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79  Parse;.      zTy
71e0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
71f0: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69  &sNC, p, &zOrigi
7200: 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62  nDb, &zOriginTab
7210: 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20  , &zOriginCol); 
7220: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7230: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
7240: 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69 6e   .  if( pzOrigin
7250: 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Db ){.    assert
7260: 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26 26  ( pzOriginTab &&
7270: 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a   pzOriginCol );.
7280: 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20      *pzOriginDb 
7290: 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20  = zOriginDb;.   
72a0: 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20   *pzOriginTab = 
72b0: 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20 20  zOriginTab;.    
72c0: 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a  *pzOriginCol = z
72d0: 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20  OriginCol;.  }. 
72e0: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
72f0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
7300: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
7310: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
7320: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
7330: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
7340: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
7350: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
7360: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
7370: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
7380: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
7390: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
73a0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
73b0: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
73c0: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
73d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
73e0: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
73f0: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
7400: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
7410: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
7420: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
7430: 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  nt i;.  NameCont
7440: 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70  ext sNC;.  sNC.p
7450: 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
7460: 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65  st;.  sNC.pParse
7470: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72   = pParse;.  for
7480: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
7490: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
74a0: 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
74b0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
74c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
74d0: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20  OrigDb = 0;.    
74e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
74f0: 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  gTab = 0;.    co
7500: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43  nst char *zOrigC
7510: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ol = 0;.    cons
7520: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
7530: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
7540: 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a   p, &zOrigDb, &z
7550: 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43  OrigTab, &zOrigC
7560: 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ol);..    /* The
7570: 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20   vdbe must make 
7580: 69 74 27 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66  it's own copy of
7590: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65   the column-type
75a0: 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20   and other .    
75b0: 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66  ** column specif
75c0: 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63  ic strings, in c
75d0: 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69  ase the schema i
75e0: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
75f0: 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75  his.    ** virtu
7600: 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65  al machine is de
7610: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
7620: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
7630: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
7640: 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20  LNAME_DECLTYPE, 
7650: 7a 54 79 70 65 2c 20 50 33 5f 54 52 41 4e 53 49  zType, P3_TRANSI
7660: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
7670: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
7680: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41  v, i, COLNAME_DA
7690: 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c  TABASE, zOrigDb,
76a0: 20 50 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a   P3_TRANSIENT);.
76b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
76c0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
76d0: 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a  COLNAME_TABLE, z
76e0: 4f 72 69 67 54 61 62 2c 20 50 33 5f 54 52 41 4e  OrigTab, P3_TRAN
76f0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
7700: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
7710: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
7720: 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c  COLUMN, zOrigCol
7730: 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b  , P3_TRANSIENT);
7740: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
7750: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
7760: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
7770: 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  DBE the names of
7780: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
7790: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
77a0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
77b0: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76   is used to prov
77c0: 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c  ide the.** azCol
77d0: 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  [] values in the
77e0: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   callback..*/.st
77f0: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
7800: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20  teColumnNames(. 
7810: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7820: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
7830: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
7840: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
7850: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
7860: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
7870: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
7880: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
7890: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
78a0: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
78b0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
78c0: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  e;.  int i, j;. 
78d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
78e0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
78f0: 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72   fullNames, shor
7900: 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66  tNames;..#ifndef
7910: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
7920: 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69  LAIN.  /* If thi
7930: 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c  s is an EXPLAIN,
7940: 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20   skip this step 
7950: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
7960: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
7970: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
7980: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21  if..  assert( v!
7990: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  =0 );.  if( pPar
79a0: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
79b0: 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  || v==0 || sqlit
79c0: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
79d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61   ) return;.  pPa
79e0: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
79f0: 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65   = 1;.  fullName
7a00: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
7a10: 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
7a20: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72  ames)!=0;.  shor
7a30: 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  tNames = (db->fl
7a40: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
7a50: 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  rtColNames)!=0;.
7a60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
7a70: 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73  NumCols(v, pELis
7a80: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72  t->nExpr);.  for
7a90: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
7aa0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
7ab0: 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20   Expr *p;.    p 
7ac0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
7ad0: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 3d  Expr;.    if( p=
7ae0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
7af0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
7b00: 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
7b10: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
7b20: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
7b30: 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ame;.      sqlit
7b40: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
7b50: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
7b60: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  AME, zName, strl
7b70: 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  en(zName));.    
7b80: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
7b90: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  }.    if( p->op=
7ba0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54  =TK_COLUMN && pT
7bb0: 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  abList ){.      
7bc0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
7bd0: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
7be0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
7bf0: 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  p->iColumn;.    
7c00: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
7c10: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
7c20: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
7c30: 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65  ursor!=p->iTable
7c40: 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61  ; j++){}.      a
7c50: 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73  ssert( j<pTabLis
7c60: 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20  t->nSrc );.     
7c70: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
7c80: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
7c90: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
7ca0: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
7cb0: 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
7cc0: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
7cd0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
7ce0: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
7cf0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
7d00: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
7d10: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
7d20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
7d30: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
7d40: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
7d50: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7d60: 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21  !shortNames && !
7d70: 66 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e  fullNames && p->
7d80: 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61  span.z && p->spa
7d90: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
7da0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
7db0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
7dc0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68 61  LNAME_NAME, (cha
7dd0: 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d  r*)p->span.z, p-
7de0: 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  >span.n);.      
7df0: 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61  }else if( fullNa
7e00: 6d 65 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61  mes || (!shortNa
7e10: 6d 65 73 20 26 26 20 70 54 61 62 4c 69 73 74 2d  mes && pTabList-
7e20: 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20  >nSrc>1) ){.    
7e30: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
7e40: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61  = 0;.        cha
7e50: 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20  r *zTab;. .     
7e60: 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69     zTab = pTabLi
7e70: 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b  st->a[j].zAlias;
7e80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 75 6c  .        if( ful
7e90: 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d  lNames || zTab==
7ea0: 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d  0 ) zTab = pTab-
7eb0: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
7ec0: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
7ed0: 28 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22  (&zName, zTab, "
7ee0: 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a  .", zCol, (char*
7ef0: 29 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  )0);.        sql
7f00: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
7f10: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
7f20: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 50 33  _NAME, zName, P3
7f30: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
7f40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7f50: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
7f60: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
7f70: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20  AME_NAME, zCol, 
7f80: 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20  strlen(zCol));. 
7f90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
7fa0: 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26   if( p->span.z &
7fb0: 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29  & p->span.z[0] )
7fc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7fd0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
7fe0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
7ff0: 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e  , (char*)p->span
8000: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  .z, p->span.n);.
8010: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
8020: 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63  VdbeCompressSpac
8030: 65 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20  e(v, addr); */. 
8040: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8050: 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a  char zName[30];.
8060: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
8070: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
8080: 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b  | pTabList==0 );
8090: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
80a0: 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  Name, "column%d"
80b0: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  , i+1);.      sq
80c0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
80d0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
80e0: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 30  E_NAME, zName, 0
80f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67  );.    }.  }.  g
8100: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
8110: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
8120: 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a  ist, pEList);.}.
8130: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8140: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
8150: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20  LECT./*.** Name 
8160: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
8170: 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64  n operator, used
8180: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
8190: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ges..*/.static c
81a0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63  onst char *selec
81b0: 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b  tOpName(int id){
81c0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77  .  char *z;.  sw
81d0: 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20  itch( id ){.    
81e0: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
81f0: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c     z = "UNION AL
8200: 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  L";   break;.   
8210: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
8220: 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45  CT: z = "INTERSE
8230: 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  CT";   break;.  
8240: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
8250: 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54  :    z = "EXCEPT
8260: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
8270: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
8280: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
8290: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
82a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
82b0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
82c0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
82d0: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a  _SELECT */../*.*
82e0: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
82f0: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
8300: 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53 74  int prepSelectSt
8310: 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63  mt(Parse*, Selec
8320: 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  t*);../*.** Give
8330: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
8340: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
8350: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
8360: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
8370: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
8380: 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
8390: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
83a0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
83b0: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
83c0: 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61  se, char *zTabNa
83d0: 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  me, Select *pSel
83e0: 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
83f0: 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  Tab;.  int i, j;
8400: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
8410: 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  ist;.  Column *a
8420: 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69  Col, *pCol;..  i
8430: 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d  f( prepSelectStm
8440: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
8450: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
8460: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
8470: 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c  lite3SelectResol
8480: 76 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ve(pParse, pSele
8490: 63 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65  ct, 0) ){.    re
84a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
84b0: 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ab = sqliteMallo
84c0: 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  c( sizeof(Table)
84d0: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
84e0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
84f0: 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 6e  0;.  }.  pTab->n
8500: 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d  Ref = 1;.  pTab-
8510: 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d  >zName = zTabNam
8520: 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75 70  e ? sqliteStrDup
8530: 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a  (zTabName) : 0;.
8540: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
8550: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54  ct->pEList;.  pT
8560: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73  ab->nCol = pELis
8570: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65  t->nExpr;.  asse
8580: 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30  rt( pTab->nCol>0
8590: 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c   );.  pTab->aCol
85a0: 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65   = aCol = sqlite
85b0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70  Malloc( sizeof(p
85c0: 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54  Tab->aCol[0])*pT
85d0: 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f  ab->nCol );.  fo
85e0: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
85f0: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
8600: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
8610: 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a    Expr *p, *pR;.
8620: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
8630: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
8640: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 61 73  ;.    char *zBas
8650: 65 6e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 6c 53  ename;.    CollS
8660: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69  eq *pColl;.    i
8670: 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61 6d 65  nt cnt;.    Name
8680: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
8690: 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20   .    /* Get an 
86a0: 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65  appropriate name
86b0: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a   for the column.
86c0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70      */.    p = p
86d0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
86e0: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
86f0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70  ->pRight==0 || p
8700: 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e  ->pRight->token.
8710: 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  z==0 || p->pRigh
8720: 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30  t->token.z[0]!=0
8730: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61   );.    if( (zNa
8740: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
8750: 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ].zName)!=0 ){. 
8760: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
8770: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
8780: 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68  n "AS <name>" ph
8790: 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e  rase, use <name>
87a0: 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   as the name */.
87b0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
87c0: 6c 69 74 65 53 74 72 44 75 70 28 7a 4e 61 6d 65  liteStrDup(zName
87d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
87e0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a   p->op==TK_DOT .
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
8800: 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74 29 21   (pR=p->pRight)!
8810: 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e  =0 && pR->token.
8820: 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a  z && pR->token.z
8830: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  [0] ){.      /* 
8840: 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  For columns of t
8850: 68 65 20 66 72 6f 6d 20 41 2e 42 20 75 73 65 20  he from A.B use 
8860: 42 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  B as the name */
8870: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
8880: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25  qlite3MPrintf("%
8890: 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b  T", &pR->token);
88a0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
88b0: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
88c0: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
88d0: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69    /* Use the ori
88e0: 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68  ginal text of th
88f0: 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  e column express
8900: 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20  ion as its name 
8910: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
8920: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8930: 22 25 54 22 2c 20 26 70 2d 3e 73 70 61 6e 29 3b  "%T", &p->span);
8940: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8950: 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65 6c 73 65    /* If all else
8960: 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20 75 70 20   fails, make up 
8970: 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  a name */.      
8980: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
8990: 50 72 69 6e 74 66 28 22 63 6f 6c 75 6d 6e 25 64  Printf("column%d
89a0: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  ", i+1);.    }. 
89b0: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
89c0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  e(zName);.    if
89d0: 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  ( sqlite3MallocF
89e0: 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 20  ailed() ){.     
89f0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
8a00: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
8a10: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
8a20: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 72 65 74  pTab);.      ret
8a30: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
8a40: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
8a50: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
8a60: 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68  s unique.  If th
8a70: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e  e name is not un
8a80: 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70  ique,.    ** app
8a90: 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f  end a integer to
8aa0: 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61   the name so tha
8ab0: 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69  t it becomes uni
8ac0: 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  que..    */.    
8ad0: 7a 42 61 73 65 6e 61 6d 65 20 3d 20 7a 4e 61 6d  zBasename = zNam
8ae0: 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74  e;.    for(j=cnt
8af0: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
8b00: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
8b10: 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e  StrICmp(aCol[j].
8b20: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
8b30: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   ){.        zNam
8b40: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
8b50: 74 66 28 22 25 73 3a 25 64 22 2c 20 7a 42 61 73  tf("%s:%d", zBas
8b60: 65 6e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20  ename, ++cnt);. 
8b70: 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20         j = -1;. 
8b80: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
8b90: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
8ba0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
8bb0: 66 28 20 7a 42 61 73 65 6e 61 6d 65 21 3d 7a 4e  f( zBasename!=zN
8bc0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ame ){.      sql
8bd0: 69 74 65 46 72 65 65 28 7a 42 61 73 65 6e 61 6d  iteFree(zBasenam
8be0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  e);.    }.    pC
8bf0: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  ol->zName = zNam
8c00: 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74  e;..    /* Get t
8c10: 68 65 20 74 79 70 65 6e 61 6d 65 2c 20 74 79 70  he typename, typ
8c20: 65 20 61 66 66 69 6e 69 74 79 2c 20 61 6e 64 20  e affinity, and 
8c30: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
8c40: 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  ce for the.    *
8c50: 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f  * column..    */
8c60: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
8c70: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
8c80: 29 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  );.    sNC.pSrcL
8c90: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
8ca0: 53 72 63 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d  Src;.    zType =
8cb0: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 63 6f   sqliteStrDup(co
8cc0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
8cd0: 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20  , 0, 0, 0));.   
8ce0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a   pCol->zType = z
8cf0: 54 79 70 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Type;.    pCol->
8d00: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
8d10: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
8d20: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  );.    pColl = s
8d30: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
8d40: 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
8d50: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
8d60: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c       pCol->zColl
8d70: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
8d80: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
8d90: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d     }.  }.  pTab-
8da0: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72  >iPKey = -1;.  r
8db0: 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
8dc0: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 53  *.** Prepare a S
8dd0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
8de0: 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 62  for processing b
8df0: 79 20 64 6f 69 6e 67 20 74 68 65 20 66 6f 6c 6c  y doing the foll
8e00: 6f 77 69 6e 67 0a 2a 2a 20 74 68 69 6e 67 73 3a  owing.** things:
8e10: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d  .**.**    (1)  M
8e20: 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75  ake sure VDBE cu
8e30: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
8e40: 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
8e50: 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20  to every.**     
8e60: 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74      element of t
8e70: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
8e80: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69  **.**    (2)  Fi
8e90: 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  ll in the pTabLi
8ea0: 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  st->a[].pTab fie
8eb0: 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69  lds in the SrcLi
8ec0: 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20  st that .**     
8ed0: 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d      defines FROM
8ee0: 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76   clause.  When v
8ef0: 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74  iews appear in t
8f00: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  he FROM clause,.
8f10: 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20  **         fill 
8f20: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53  pTabList->a[].pS
8f30: 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70  elect with a cop
8f40: 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
8f50: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
8f60: 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d       that implem
8f70: 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20  ents the view.  
8f80: 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  A copy is made o
8f90: 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c  f the view's SEL
8fa0: 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  ECT.**         s
8fb0: 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74  tatement so that
8fc0: 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d   we can freely m
8fd0: 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20  odify or delete 
8fe0: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a  that statement.*
8ff0: 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75  *         withou
9000: 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74  t worrying about
9010: 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20   messing up the 
9020: 70 72 65 73 69 73 74 65 6e 74 20 72 65 70 72 65  presistent repre
9030: 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20  sentation.**    
9040: 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77       of the view
9050: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20  ..**.**    (3)  
9060: 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65  Add terms to the
9070: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
9080: 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20   accomodate the 
9090: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a  NATURAL keyword.
90a0: 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f  **         on jo
90b0: 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61  ins and the ON a
90c0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  nd USING clause 
90d0: 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20  of joins..**.** 
90e0: 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65     (4)  Scan the
90f0: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
9100: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
9110: 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b  et (pEList) look
9120: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ing.**         f
9130: 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  or instances of 
9140: 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  the "*" operator
9150: 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20   or the TABLE.* 
9160: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20  operator..**    
9170: 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65       If found, e
9180: 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74  xpand each "*" t
9190: 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
91a0: 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65  n in every table
91b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20  .**         and 
91c0: 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76  TABLE.* to be ev
91d0: 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41  ery column in TA
91e0: 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  BLE..**.** Retur
91f0: 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  n 0 on success. 
9200: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70 72   If there are pr
9210: 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e  oblems, leave an
9220: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
9230: 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  * in pParse and 
9240: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
9250: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
9260: 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61  repSelectStmt(Pa
9270: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
9280: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
9290: 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72  , j, k, rc;.  Sr
92a0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
92b0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
92c0: 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
92d0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
92e0: 6d 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  m;..  if( p==0 |
92f0: 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20  | p->pSrc==0 || 
9300: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
9310: 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 72 65 74  led() ){.    ret
9320: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 1;.  }.  pTa
9330: 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
9340: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
9350: 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  EList;..  /* Mak
9360: 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
9370: 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
9380: 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
9390: 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
93a0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
93b0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
93c0: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
93d0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
93e0: 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
93f0: 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 0a 20  se, p->pSrc);.. 
9400: 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
9410: 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
9420: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9430: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
9440: 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
9450: 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
9460: 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
9470: 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
9480: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
9490: 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
94a0: 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
94b0: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
94c0: 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
94d0: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
94e0: 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
94f0: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
9500: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
9510: 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
9520: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69  ble *pTab;.    i
9530: 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  f( pFrom->pTab!=
9540: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
9550: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  is statement has
9560: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
9570: 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69  epared.  There i
9580: 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  s no need.      
9590: 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72  ** to go further
95a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
95b0: 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( i==0 );.     
95c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
95d0: 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
95e0: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
95f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9600: 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 2f  SUBQUERY.      /
9610: 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
9620: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9630: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
9640: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
9650: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  rom->pSelect!=0 
9660: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  );.      if( pFr
9670: 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b  om->zAlias==0 ){
9680: 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
9690: 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20 20 20  zAlias =.       
96a0: 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
96b0: 66 28 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65  f("sqlite_subque
96c0: 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29  ry_%p_", (void*)
96d0: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
96e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
96f0: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
9700: 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
9710: 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
9720: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
9730: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
9740: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 46  elect(pParse, pF
9750: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70 46 72  rom->zAlias, pFr
9760: 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  om->pSelect);.  
9770: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
9780: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
9790: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
97a0: 20 20 20 2f 2a 20 54 68 65 20 69 73 54 72 61 6e     /* The isTran
97b0: 73 69 65 6e 74 20 66 6c 61 67 20 69 6e 64 69 63  sient flag indic
97c0: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 54 61  ates that the Ta
97d0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 61  ble structure ha
97e0: 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20  s been.      ** 
97f0: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
9800: 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20 62 65  cated and may be
9810: 20 66 72 65 65 64 20 61 74 20 61 6e 79 20 74 69   freed at any ti
9820: 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  me.  In other wo
9830: 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54  rds,.      ** pT
9840: 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  ab is not pointi
9850: 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73 74 65  ng to a persiste
9860: 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
9870: 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 0a  re that defines.
9880: 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66        ** part of
9890: 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a   the schema. */.
98a0: 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 54 72        pTab->isTr
98b0: 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 23 65 6e  ansient = 1;.#en
98c0: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
98d0: 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
98e0: 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
98f0: 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
9900: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
9910: 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
9920: 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
9930: 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
9940: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
9950: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
9960: 62 6c 65 28 70 50 61 72 73 65 2c 70 46 72 6f 6d  ble(pParse,pFrom
9970: 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a  ->zName,pFrom->z
9980: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20  Database);.     
9990: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
99a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
99b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
99c0: 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69  pTab->nRef++;.#i
99d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
99e0: 54 5f 56 49 45 57 0a 20 20 20 20 20 20 69 66 28  T_VIEW.      if(
99f0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
9a00: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
9a10: 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68  reach here if th
9a20: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
9a30: 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77   a really a view
9a40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
9a50: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
9a60: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
9a70: 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  , pTab) ){.     
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 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9aa0: 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53   /* If pFrom->pS
9ab0: 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e  elect!=0 it mean
9ac0: 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
9ad0: 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20 20   with a.        
9ae0: 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20 61  ** view within a
9af0: 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45   view.  The SELE
9b00: 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61 73  CT structure has
9b10: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
9b20: 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20        ** copied 
9b30: 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69 65  by the outer vie
9b40: 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70  w so we can skip
9b50: 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20 68   the copy step h
9b60: 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ere.        ** i
9b70: 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77  n the inner view
9b80: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
9b90: 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e       if( pFrom->
9ba0: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
9bb0: 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
9bc0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
9bd0: 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d 3e  SelectDup(pTab->
9be0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
9bf0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
9c00: 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
9c10: 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
9c20: 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
9c30: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
9c40: 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
9c50: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
9c60: 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61  eProcessJoin(pPa
9c70: 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e  rse, p) ) return
9c80: 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76   1;..  /* For ev
9c90: 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
9ca0: 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
9cb0: 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
9cc0: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
9cd0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
9ce0: 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
9cf0: 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
9d00: 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
9d10: 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
9d20: 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
9d30: 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
9d40: 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
9d50: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
9d60: 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c   with the TK_ALL
9d70: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
9d80: 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
9d90: 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
9da0: 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68  mn list..  ** Th
9db0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
9dc0: 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
9dd0: 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65  ate the TK_ALL e
9de0: 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
9df0: 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20  xpand.  ** each 
9e00: 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
9e10: 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
9e20: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  n all tables..  
9e30: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
9e40: 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
9e50: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
9e60: 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
9e70: 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
9e80: 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
9e90: 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
9ea0: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
9eb0: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; k++){.    Ex
9ec0: 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d  pr *pE = pEList-
9ed0: 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
9ee0: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
9ef0: 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ALL ) break;.   
9f00: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
9f10: 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
9f20: 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  t && pE->pRight-
9f30: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20  >op==TK_ALL.    
9f40: 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66       && pE->pLef
9f50: 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  t && pE->pLeft->
9f60: 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61  op==TK_ID ) brea
9f70: 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b  k;.  }.  rc = 0;
9f80: 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
9f90: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
9fa0: 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
9fb0: 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
9fc0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
9fd0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
9fe0: 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
9ff0: 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
a000: 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
a010: 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
a020: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
a030: 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
a040: 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
a050: 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
a060: 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
a070: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
a080: 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
a090: 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
a0a0: 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
a0b0: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50    int flags = pP
a0c0: 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b  arse->db->flags;
a0d0: 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d  .    int longNam
a0e0: 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  es = (flags & SQ
a0f0: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
a100: 73 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20  s)!=0 &&.       
a110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
a120: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
a130: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  hortColNames)==0
a140: 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  ;..    for(k=0; 
a150: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
a160: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   k++){.      Exp
a170: 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78  r *pE = a[k].pEx
a180: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
a190: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a  ->op!=TK_ALL &&.
a1a0: 20 20 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e             (pE->
a1b0: 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
a1c0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70  ->pRight==0 || p
a1d0: 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54  E->pRight->op!=T
a1e0: 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  K_ALL) ){.      
a1f0: 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63    /* This partic
a200: 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
a210: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
a220: 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20   be expanded..  
a230: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a240: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
a250: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e  xprListAppend(pN
a260: 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20  ew, a[k].pExpr, 
a270: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
a280: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
a290: 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
a2a0: 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
a2b0: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
a2c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a2d0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
a2e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a2f0: 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
a300: 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
a310: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  me = 0;.      }e
a320: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
a330: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
a340: 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54  is a "*" or a "T
a350: 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64  ABLE.*" and need
a360: 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20  s to be.        
a370: 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a  ** expanded. */.
a380: 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c          int tabl
a390: 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  eSeen = 0;      
a3a0: 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e  /* Set to 1 when
a3b0: 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a   TABLE matches *
a3c0: 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
a3d0: 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  zTName;         
a3e0: 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
a3f0: 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
a400: 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
a410: 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
a420: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
a430: 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71 6c      zTName = sql
a440: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
a450: 6e 28 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f  n(&pE->pLeft->to
a460: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ken);.        }e
a470: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
a480: 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  TName = 0;.     
a490: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
a4a0: 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
a4b0: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
a4c0: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
a4d0: 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
a4e0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
a4f0: 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
a500: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
a510: 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
a520: 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
a530: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
a540: 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30  =0 || zTabName[0
a550: 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  ]==0 ){ .       
a560: 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
a570: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
a580: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a590: 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
a5a0: 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c   (zTabName==0 ||
a5b0: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20   zTabName[0]==0 
a5c0: 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
a5d0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49       sqlite3StrI
a5e0: 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62  Cmp(zTName, zTab
a5f0: 4e 61 6d 65 29 21 3d 30 29 20 29 7b 0a 20 20 20  Name)!=0) ){.   
a600: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
a610: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
a620: 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65           tableSe
a630: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
a640: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
a650: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
a660: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
a670: 2a 70 45 78 70 72 2c 20 2a 70 52 69 67 68 74 3b  *pExpr, *pRight;
a680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
a690: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d  r *zName = pTab-
a6a0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
a6b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
a6c0: 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i>0 ){.        
a6d0: 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
a6e0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74  List_item *pLeft
a6f0: 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
a700: 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  i-1];.          
a710: 20 20 20 20 69 66 28 20 28 70 4c 65 66 74 2d 3e      if( (pLeft->
a720: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
a730: 54 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20  TURAL)!=0 &&.   
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a750: 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78       columnIndex
a760: 28 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e  (pLeft->pTab, zN
a770: 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
a780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
a790: 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c   a NATURAL join,
a7a0: 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63   omit the join c
a7b0: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
a7c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a7d0: 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65   ** table on the
a7e0: 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20   right */.      
a7f0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
a800: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
a810: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
a820: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c    if( sqlite3IdL
a830: 69 73 74 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e  istIndex(pLeft->
a840: 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
a850: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
a860: 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
a870: 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
a880: 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
a890: 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
a8a0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
a8b0: 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
a8c0: 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
a8d0: 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
a8e0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
a8f0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
a900: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
a910: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
a920: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
a930: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
a940: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
a950: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
a960: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
a970: 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 52      setToken(&pR
a980: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61  ight->token, zNa
a990: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
a9a0: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26 26   if( zTabName &&
a9b0: 20 28 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70   (longNames || p
a9c0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29  TabList->nSrc>1)
a9d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a9e0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
a9f0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
aa00: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
aa10: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
aa20: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
aa30: 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
aa40: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
aa50: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
aa60: 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r==0 ) break;.  
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54              setT
aa80: 6f 6b 65 6e 28 26 70 4c 65 66 74 2d 3e 74 6f 6b  oken(&pLeft->tok
aa90: 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20  en, zTabName);. 
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
aab0: 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73 70  Token(&pExpr->sp
aac0: 61 6e 2c 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  an, sqlite3MPrin
aad0: 74 66 28 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  tf("%s.%s", zTab
aae0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20  Name, zName));. 
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
ab00: 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31  pr->span.dyn = 1
ab10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
ab20: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d  pExpr->token.z =
ab30: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
ab40: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e    pExpr->token.n
ab50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
ab60: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
ab70: 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  .dyn = 0;.      
ab80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ab90: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
aba0: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
abb0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
abc0: 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f  span = pExpr->to
abd0: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ken;.           
abe0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
abf0: 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
ac10: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
ac20: 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c  ListAppend(pNew,
ac30: 20 70 45 78 70 72 2c 20 26 70 45 78 70 72 2d 3e   pExpr, &pExpr->
ac40: 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  span);.         
ac50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ac60: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
ac70: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
ac80: 70 65 6e 64 28 70 4e 65 77 2c 20 70 45 78 70 72  pend(pNew, pExpr
ac90: 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  , &pRight->token
aca0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
acb0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
acc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
acd0: 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b  f( !tableSeen ){
ace0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
acf0: 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  TName ){.       
ad00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
ad10: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
ad20: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
ad30: 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
ad40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ad50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
ad60: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
ad70: 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
ad80: 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
ad90: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
ada0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
adb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
adc0: 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  ee(zTName);.    
add0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
ade0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
adf0: 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20  ete(pEList);.   
ae00: 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
ae10: 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  w;.  }.  return 
ae20: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
ae30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
ae40: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
ae50: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   This routine as
ae60: 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65 73  sociates entries
ae70: 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
ae80: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
ae90: 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  with.** columns 
aea0: 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f  in a result.  Fo
aeb0: 72 20 65 61 63 68 20 4f 52 44 45 52 20 42 59 20  r each ORDER BY 
aec0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20  expression, the 
aed0: 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65  opcode of.** the
aee0: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
aef0: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b  is changed to TK
af00: 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20  _COLUMN and the 
af10: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66  iColumn value of
af20: 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  .** the top-leve
af30: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
af40: 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20   in with column 
af50: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
af60: 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  Table.** value o
af70: 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
af80: 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77  node is filled w
af90: 69 74 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d  ith iTable param
afa0: 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eter..**.** If t
afb0: 68 65 72 65 20 61 72 65 20 70 72 69 6f 72 20 53  here are prior S
afc0: 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74  ELECT clauses, t
afd0: 68 65 79 20 61 72 65 20 70 72 6f 63 65 73 73 65  hey are processe
afe0: 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63  d first.  A matc
aff0: 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69  h.** in an earli
b000: 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20  er SELECT takes 
b010: 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20  precedence over 
b020: 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a  a later SELECT..
b030: 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20  **.** Any entry 
b040: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  that does not ma
b050: 74 63 68 20 69 73 20 66 6c 61 67 67 65 64 20 61  tch is flagged a
b060: 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  s an error.  The
b070: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
b080: 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64  rors is returned
b090: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b0a0: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
b0b0: 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
b0c0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
b0d0: 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65  /* A place to le
b0e0: 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ave error messag
b0f0: 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
b100: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
b110: 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75  /* Match to resu
b120: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  lt columns of th
b130: 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45  is SELECT */.  E
b140: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
b150: 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  y,     /* The OR
b160: 44 45 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f  DER BY values to
b170: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 63   match against c
b180: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
b190: 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
b1a0: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
b1b0: 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54 61 62  is value in iTab
b1c0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
b1d0: 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20 20 20  Complete        
b1e0: 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c 20 4f  /* If TRUE all O
b1f0: 52 44 45 52 20 42 59 73 20 6d 75 73 74 20 6d 61  RDER BYs must ma
b200: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
b210: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nErr = 0;.  int 
b220: 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74  i, j;.  ExprList
b230: 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28   *pEList;..  if(
b240: 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70   pSelect==0 || p
b250: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
b260: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75 73  urn 1;.  if( mus
b270: 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  tComplete ){.   
b280: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
b290: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
b2a0: 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  ){ pOrderBy->a[i
b2b0: 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20  ].done = 0; }.  
b2c0: 7d 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65  }.  if( prepSele
b2d0: 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70  ctStmt(pParse, p
b2e0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72  Select) ){.    r
b2f0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
b300: 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  f( pSelect->pPri
b310: 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61  or ){.    if( ma
b320: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
b330: 6d 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  mn(pParse, pSele
b340: 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64  ct->pPrior, pOrd
b350: 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 30 29  erBy, iTable, 0)
b360: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b370: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
b380: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
b390: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28  ->pEList;.  for(
b3a0: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
b3b0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
b3c0: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72    Expr *pE = pOr
b3d0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
b3e0: 72 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  r;.    int iCol 
b3f0: 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4f  = -1;.    if( pO
b400: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
b410: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
b420: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
b430: 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26  rIsInteger(pE, &
b440: 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69  iCol) ){.      i
b450: 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43  f( iCol<=0 || iC
b460: 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  ol>pEList->nExpr
b470: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b480: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
b490: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4f  se,.          "O
b4a0: 52 44 45 52 20 42 59 20 70 6f 73 69 74 69 6f 6e  RDER BY position
b4b0: 20 25 64 20 73 68 6f 75 6c 64 20 62 65 20 62 65   %d should be be
b4c0: 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c  tween 1 and %d",
b4d0: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 2c  .          iCol,
b4e0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
b4f0: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  .        nErr++;
b500: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
b510: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
b520: 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  ( !mustComplete 
b530: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
b540: 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a    iCol--;.    }.
b550: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f      for(j=0; iCo
b560: 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d  l<0 && j<pEList-
b570: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
b580: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
b590: 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70  a[j].zName && (p
b5a0: 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20  E->op==TK_ID || 
b5b0: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  pE->op==TK_STRIN
b5c0: 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  G) ){.        ch
b5d0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62  ar *zName, *zLab
b5e0: 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  el;.        zNam
b5f0: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  e = pEList->a[j]
b600: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
b610: 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  zLabel = sqlite3
b620: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70  NameFromToken(&p
b630: 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  E->token);.     
b640: 20 20 20 61 73 73 65 72 74 28 20 7a 4c 61 62 65     assert( zLabe
b650: 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
b660: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
b670: 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c  mp(zName, zLabel
b680: 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  )==0 ){ .       
b690: 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20     iCol = j;.   
b6a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
b6b0: 71 6c 69 74 65 46 72 65 65 28 7a 4c 61 62 65 6c  qliteFree(zLabel
b6c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b6d0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 73   if( iCol<0 && s
b6e0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
b6f0: 65 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  e(pE, pEList->a[
b700: 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  j].pExpr) ){.   
b710: 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20       iCol = j;. 
b720: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b730: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
b740: 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54        pE->op = T
b750: 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
b760: 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43  pE->iColumn = iC
b770: 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 54  ol;.      pE->iT
b780: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
b790: 20 20 20 20 20 70 45 2d 3e 69 41 67 67 20 3d 20       pE->iAgg = 
b7a0: 2d 31 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72  -1;.      pOrder
b7b0: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20  By->a[i].done = 
b7c0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
b7d0: 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75 73 74 43   iCol<0 && mustC
b7e0: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  omplete ){.     
b7f0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
b800: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
b810: 20 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20   "ORDER BY term 
b820: 6e 75 6d 62 65 72 20 25 64 20 64 6f 65 73 20 6e  number %d does n
b830: 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 72 65 73  ot match any res
b840: 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31  ult column", i+1
b850: 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  );.      nErr++;
b860: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b870: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
b880: 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
b890: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
b8a0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
b8b0: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
b8c0: 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
b8d0: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
b8e0: 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
b8f0: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
b900: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
b910: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
b920: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
b930: 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
b940: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
b950: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65  .Vdbe *sqlite3Ge
b960: 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61  tVdbe(Parse *pPa
b970: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  rse){.  Vdbe *v 
b980: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
b990: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
b9a0: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
b9b0: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Vdbe = sqlite3Vd
b9c0: 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d  beCreate(pParse-
b9d0: 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >db);.  }.  retu
b9e0: 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn v;.}.../*.** 
b9f0: 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
ba00: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
ba10: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
ba20: 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
ba30: 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  .** pLimit and p
ba40: 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f  Offset expressio
ba50: 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20  ns.  pLimit and 
ba60: 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65  pOffset hold the
ba70: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
ba80: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
ba90: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
baa0: 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
bab0: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
bac0: 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
bad0: 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68  .  Or NULL if th
bae0: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65  ose keywords are
baf0: 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74   omitted. iLimit
bb00: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a   and iOffset .**
bb10: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
bb20: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
bb30: 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75   numbers for cou
bb40: 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
bb50: 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69  mpute .** the li
bb60: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20  mit and offset. 
bb70: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
bb80: 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
bb90: 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c  set, then .** iL
bba0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
bbb0: 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a   are negative..*
bbc0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
bbd0: 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61  e changes the va
bbe0: 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61  lues of iLimit a
bbf0: 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20  nd iOffset only 
bc00: 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72  if.** a limit or
bc10: 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e   offset is defin
bc20: 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64  ed by pLimit and
bc30: 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69   pOffset.  iLimi
bc40: 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74  t and.** iOffset
bc50: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
bc60: 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
bc70: 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
bc80: 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c  values.** (usual
bc90: 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79  ly but not alway
bca0: 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63  s -1) prior to c
bcb0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
bcc0: 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ine..** Only if 
bcd0: 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66  pLimit!=0 or pOf
bce0: 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c  fset!=0 do the l
bcf0: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
bd00: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
bd10: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
bd20: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
bd30: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
bd40: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
bd50: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
bd60: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
bd70: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
bd80: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
bd90: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
bda0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
bdb0: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
bdc0: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
bdd0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
bde0: 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62  t iBreak){.  Vdb
bdf0: 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *v = 0;.  int 
be00: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e  iLimit = 0;.  in
be10: 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  t iOffset;.  int
be20: 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 0a   addr1, addr2;..
be30: 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49    /* .  ** "LIMI
be40: 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f  T -1" always sho
be50: 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68  ws all rows.  Th
be60: 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a  ere is some.  **
be70: 20 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f   contraversy abo
be80: 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72  ut what the corr
be90: 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f  ect behavior sho
bea0: 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65  uld be..  ** The
beb0: 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
bec0: 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  ntation interpre
bed0: 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20  ts "LIMIT 0" to 
bee0: 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77  mean.  ** no row
bef0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
bf00: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
bf10: 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  ->iLimit = iLimi
bf20: 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  t = pParse->nMem
bf30: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
bf40: 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 76 20 3d  em += 2;.    v =
bf50: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
bf60: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
bf70: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
bf80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
bf90: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
bfa0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69  Limit);.    sqli
bfb0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
bfc0: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c  OP_MustBeInt, 0,
bfd0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
bfe0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bff0: 4d 65 6d 53 74 6f 72 65 2c 20 69 4c 69 6d 69 74  MemStore, iLimit
c000: 2c 20 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  , 0);.    VdbeCo
c010: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4c 49 4d  mment((v, "# LIM
c020: 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
c030: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c040: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a  dOp(v, OP_IfMemZ
c050: 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72  ero, iLimit, iBr
c060: 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eak);.  }.  if( 
c070: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
c080: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
c090: 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73 65 2d  Offset = pParse-
c0a0: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 76 20 3d  >nMem++;.    v =
c0b0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
c0c0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
c0d0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
c0e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c0f0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
c100: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c  Offset);.    sql
c110: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c120: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30   OP_MustBeInt, 0
c130: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
c140: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c150: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4f 66 66 73  _MemStore, iOffs
c160: 65 74 2c 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  et, p->pLimit==0
c170: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
c180: 6e 74 28 28 76 2c 20 22 23 20 4f 46 46 53 45 54  nt((v, "# OFFSET
c190: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
c1a0: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
c1b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c1c0: 49 66 4d 65 6d 50 6f 73 2c 20 69 4f 66 66 73 65  IfMemPos, iOffse
c1d0: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
c1e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c1f0: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
c200: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c210: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
c220: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
c230: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
c240: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
c250: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
c260: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c270: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64  beAddOp(v, OP_Ad
c280: 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  d, 0, 0);.    }.
c290: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69    }.  if( p->pLi
c2a0: 6d 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 31  mit ){.    addr1
c2b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c2c0: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50  dOp(v, OP_IfMemP
c2d0: 6f 73 2c 20 69 4c 69 6d 69 74 2c 20 30 29 3b 0a  os, iLimit, 0);.
c2e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c2f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
c300: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
c310: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c320: 50 5f 4d 65 6d 49 6e 74 2c 20 2d 31 2c 20 69 4c  P_MemInt, -1, iL
c330: 69 6d 69 74 2b 31 29 3b 0a 20 20 20 20 61 64 64  imit+1);.    add
c340: 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
c350: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
c360: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
c370: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
c380: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, 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 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
c3b0: 20 69 4c 69 6d 69 74 2b 31 2c 20 31 29 3b 0a 20   iLimit+1, 1);. 
c3c0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
c3d0: 76 2c 20 22 23 20 4c 49 4d 49 54 2b 4f 46 46 53  v, "# LIMIT+OFFS
c3e0: 45 54 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ET"));.    sqlit
c3f0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
c400: 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a  , addr2);.  }.}.
c410: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
c420: 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
c430: 74 6f 20 75 73 65 20 66 6f 72 20 73 6f 72 74 69  to use for sorti
c440: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
c450: 69 64 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67  id createSorting
c460: 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
c470: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
c480: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
c490: 42 79 29 7b 0a 20 20 69 66 28 20 70 4f 72 64 65  By){.  if( pOrde
c4a0: 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  rBy ){.    int a
c4b0: 64 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ddr;.    assert(
c4c0: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
c4d0: 73 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4f  sor==0 );.    pO
c4e0: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
c4f0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
c500: 2b 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  +;.    addr = sq
c510: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 70  lite3VdbeAddOp(p
c520: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
c530: 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 0a 20 20  _OpenVirtual,.  
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c550: 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72            pOrder
c560: 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f  By->iECursor, pO
c570: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 29  rderBy->nExpr+1)
c580: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
c590: 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d  >addrOpenVirt[2]
c5a0: 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 70 2d   == -1 );.    p-
c5b0: 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d  >addrOpenVirt[2]
c5c0: 20 3d 20 61 64 64 72 3b 0a 20 20 7d 0a 7d 0a 0a   = addr;.  }.}..
c5d0: 2f 2a 0a 2a 2a 20 54 68 65 20 6f 70 63 6f 64 65  /*.** The opcode
c5e0: 20 61 74 20 61 64 64 72 20 69 73 20 61 6e 20 4f   at addr is an O
c5f0: 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 20 74 68  P_OpenVirtual th
c600: 61 74 20 63 72 65 61 74 65 64 20 61 20 73 6f 72  at created a sor
c610: 74 69 6e 67 0a 2a 2a 20 69 6e 64 65 78 20 74 68  ting.** index th
c620: 61 20 77 65 20 65 6e 64 65 64 20 75 70 20 6e 6f  a we ended up no
c630: 74 20 6e 65 65 64 69 6e 67 2e 20 20 54 68 69 73  t needing.  This
c640: 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73   routine changes
c650: 20 74 68 61 74 0a 2a 2a 20 6f 70 63 6f 64 65 20   that.** opcode 
c660: 74 6f 20 4f 50 5f 4e 6f 6f 70 2e 0a 2a 2f 0a 73  to OP_Noop..*/.s
c670: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 63 72 65  tatic void uncre
c680: 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28  ateSortingIndex(
c690: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
c6a0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65  nt addr){.  Vdbe
c6b0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
c6c0: 64 62 65 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  dbe;.  VdbeOp *p
c6d0: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
c6e0: 47 65 74 4f 70 28 76 2c 20 61 64 64 72 29 3b 0a  GetOp(v, addr);.
c6f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
c700: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 30  ngeP3(v, addr, 0
c710: 2c 20 30 29 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  , 0);.  pOp->opc
c720: 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  ode = OP_Noop;. 
c730: 20 70 4f 70 2d 3e 70 31 20 3d 20 30 3b 0a 20 20   pOp->p1 = 0;.  
c740: 70 4f 70 2d 3e 70 32 20 3d 20 30 3b 0a 7d 0a 0a  pOp->p2 = 0;.}..
c750: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c760: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
c770: 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
c780: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
c790: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
c7a0: 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  nce for the iCol
c7b0: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
c7c0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
c7d0: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
c7e0: 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
c7f0: 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
c800: 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
c810: 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
c820: 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
c830: 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
c840: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
c850: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
c860: 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
c870: 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
c880: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
c890: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
c8a0: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
c8b0: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
c8c0: 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
c8d0: 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
c8e0: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
c8f0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
c900: 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
c910: 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
c920: 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
c930: 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
c940: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
c950: 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
c960: 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
c970: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
c980: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b    if( pRet==0 ){
c990: 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
c9a0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
c9b0: 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
c9c0: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29  ->a[iCol].pExpr)
c9d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
c9e0: 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Ret;.}.#endif /*
c9f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
ca00: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
ca10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ca20: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
ca30: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  LECT./*.** This 
ca40: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
ca50: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71  d to process a q
ca60: 75 65 72 79 20 74 68 61 74 20 69 73 20 72 65 61  uery that is rea
ca70: 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a  lly the union.**
ca80: 20 6f 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e   or intersection
ca90: 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   of two or more 
caa0: 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73  separate queries
cab0: 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e  ..**.** "p" poin
cac0: 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ts to the right-
cad0: 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20  most of the two 
cae0: 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75  queries.  the qu
caf0: 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65  ery on the.** le
cb00: 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e  ft is p->pPrior.
cb10: 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79    The left query
cb20: 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61   could also be a
cb30: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a   compound query.
cb40: 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  ** in which case
cb50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
cb60: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63  ll be called rec
cb70: 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a  ursively. .**.**
cb80: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
cb90: 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
cba0: 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65  are to be writte
cbb0: 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61  n into a destina
cbc0: 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20  tion.** of type 
cbd0: 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d  eDest with param
cbe0: 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  eter iParm..**.*
cbf0: 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f  * Example 1:  Co
cc00: 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77  nsider a three-w
cc10: 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20  ay compound SQL 
cc20: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
cc30: 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
cc40: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
cc50: 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49  CT b FROM t2 UNI
cc60: 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  ON SELECT c FROM
cc70: 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73   t3.**.** This s
cc80: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
cc90: 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73  ed up as follows
cca0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
ccb0: 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20  CT c FROM t3.** 
ccc0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60       |.**      `
ccd0: 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62  ----->  SELECT b
cce0: 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20   FROM t2.**     
ccf0: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60                 `
cd10: 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  ------>  SELECT 
cd20: 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20  a FROM t1.**.** 
cd30: 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68  The arrows in th
cd40: 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20  e diagram above 
cd50: 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65  represent the Se
cd60: 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e  lect.pPrior poin
cd70: 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68  ter..** So if th
cd80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
cd90: 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61  lled with p equa
cda0: 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72  l to the t3 quer
cdb0: 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f  y, then.** pPrio
cdc0: 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32  r will be the t2
cdd0: 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77   query.  p->op w
cde0: 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20  ill be TK_UNION 
cdf0: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
ce00: 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20  .** Notice that 
ce10: 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
ce20: 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73  ay SQLite parses
ce30: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
ce40: 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  s, the.** indivi
ce50: 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77  dual selects alw
ce60: 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c  ays group from l
ce70: 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f  eft to right..*/
ce80: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
ce90: 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  iSelect(.  Parse
cea0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
ceb0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
cec0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
ced0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
cee0: 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
cef0: 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
cf00: 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e coded */.  int
cf10: 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20   eDest,         
cf20: 20 20 20 2f 2a 20 5c 5f 5f 5f 20 20 53 74 6f 72     /* \___  Stor
cf30: 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  e query results 
cf40: 61 73 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a  as specified */.
cf50: 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20    int iParm,    
cf60: 20 20 20 20 20 20 20 20 2f 2a 20 2f 20 20 20 20          /* /    
cf70: 20 62 79 20 74 68 65 73 65 20 74 77 6f 20 70 61   by these two pa
cf80: 72 61 6d 65 74 65 72 73 2e 20 20 20 20 20 20 20  rameters.       
cf90: 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66    */.  char *aff
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cfb0: 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f  If eDest is SRT_
cfc0: 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e  Union, the affin
cfd0: 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ity string */.){
cfe0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
cff0: 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63  TE_OK;   /* Succ
d000: 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20  ess code from a 
d010: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
d020: 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
d030: 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
d040: 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
d050: 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
d060: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
d070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
d080: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
d090: 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e  his VDBE */.  in
d0a0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
d0b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d0c0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
d0d0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
d0e0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
d0f0: 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
d100: 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 6e 20  ER BY clause on 
d110: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 53 65 74 50  p */.  int aSetP
d120: 32 5b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  2[2];        /* 
d130: 53 65 74 20 50 32 20 76 61 6c 75 65 20 6f 66 20  Set P2 value of 
d140: 74 68 65 73 65 20 6f 70 20 74 6f 20 6e 75 6d 62  these op to numb
d150: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f  er of columns */
d160: 0a 20 20 69 6e 74 20 6e 53 65 74 50 32 20 3d 20  .  int nSetP2 = 
d170: 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  0;       /* Numb
d180: 65 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61  er of slots in a
d190: 53 65 74 50 32 5b 5d 20 75 73 65 64 20 2a 2f 0a  SetP2[] used */.
d1a0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
d1b0: 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
d1c0: 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c  R BY or LIMIT cl
d1d0: 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45  ause on prior SE
d1e0: 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a  LECTs.  Only.  *
d1f0: 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68  * the last (righ
d200: 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69  t-most) SELECT i
d210: 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79  n the series may
d220: 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
d230: 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f  Y or LIMIT..  */
d240: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
d250: 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
d260: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
d270: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
d280: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69  _end;.  }.  pPri
d290: 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
d2a0: 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
d2b0: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50  ->pRightmost!=pP
d2c0: 72 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74  rior );.  assert
d2d0: 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74  ( pPrior->pRight
d2e0: 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d  most==p->pRightm
d2f0: 6f 73 74 20 29 3b 0a 20 20 69 66 28 20 70 50 72  ost );.  if( pPr
d300: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ior->pOrderBy ){
d310: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
d320: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44  rMsg(pParse,"ORD
d330: 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f  ER BY clause sho
d340: 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
d350: 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
d360: 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
d370: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
d380: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
d390: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
d3a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69  ;.  }.  if( pPri
d3b0: 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  or->pLimit ){.  
d3c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d3d0: 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20  g(pParse,"LIMIT 
d3e0: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
d3f0: 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
d400: 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
d410: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
d420: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
d430: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
d440: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
d450: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
d460: 77 65 20 68 61 76 65 20 61 20 76 61 6c 69 64 20  we have a valid 
d470: 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49  query engine.  I
d480: 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20  f not, create a 
d490: 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  new one..  */.  
d4a0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
d4b0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
d4c0: 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ( v==0 ){.    rc
d4d0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
d4e0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
d4f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74  .  }..  /* Creat
d500: 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
d510: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
d520: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20  e if necessary. 
d530: 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
d540: 3d 53 52 54 5f 56 69 72 74 75 61 6c 54 61 62 20  =SRT_VirtualTab 
d550: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
d560: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
d570: 61 73 73 65 72 74 28 20 6e 53 65 74 50 32 3c 73  assert( nSetP2<s
d580: 69 7a 65 6f 66 28 61 53 65 74 50 32 29 2f 73 69  izeof(aSetP2)/si
d590: 7a 65 6f 66 28 61 53 65 74 50 32 5b 30 5d 29 20  zeof(aSetP2[0]) 
d5a0: 29 3b 0a 20 20 20 20 61 53 65 74 50 32 5b 6e 53  );.    aSetP2[nS
d5b0: 65 74 50 32 2b 2b 5d 20 3d 20 73 71 6c 69 74 65  etP2++] = sqlite
d5c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d5d0: 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 69 50  _OpenVirtual, iP
d5e0: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44 65  arm, 0);.    eDe
d5f0: 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
d600: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
d610: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
d620: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53  left and right S
d630: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
d640: 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 64 65 72 42  ..  */.  pOrderB
d650: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
d660: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
d670: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
d680: 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ALL: {.      if(
d690: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
d6a0: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
d6b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 73   = 0;.        as
d6c0: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
d6d0: 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 20  Limit );.       
d6e0: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
d6f0: 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
d700: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66       pPrior->pOf
d710: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
d720: 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
d730: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
d740: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 65 44  arse, pPrior, eD
d750: 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30  est, iParm, 0, 0
d760: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
d770: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
d780: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 66  ;.        p->pOf
d790: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
d7a0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
d7b0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
d7c0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
d7d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
d7e0: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
d7f0: 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
d800: 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74  = pPrior->iLimit
d810: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66  ;.        p->iOf
d820: 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  fset = pPrior->i
d830: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
d840: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30  if( p->iLimit>=0
d850: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64   ){.          ad
d860: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
d870: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65  AddOp(v, OP_IfMe
d880: 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  mZero, p->iLimit
d890: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
d8a0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
d8b0: 22 23 20 4a 75 6d 70 20 61 68 65 61 64 20 69 66  "# Jump ahead if
d8c0: 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29   LIMIT reached")
d8d0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d8e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d8f0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
d900: 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  p, eDest, iParm,
d910: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
d920: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
d930: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
d940: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
d950: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
d960: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d970: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d980: 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20   if( addr ){.   
d990: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d9a0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
d9b0: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dr);.        }. 
d9c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d9d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
d9e0: 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e  or UNION ALL ...
d9f0: 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74   ORDER BY fall t
da00: 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
da10: 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  xt case */.    }
da20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
da30: 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
da40: 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
da50: 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
da60: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
da70: 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
da80: 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
da90: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
daa0: 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20 20   int op = 0;    
dab0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
dac0: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
dad0: 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
dae0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
daf0: 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
db00: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
db10: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
db20: 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
db30: 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
db40: 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53  , *pOffset; /* S
db50: 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
db60: 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
db70: 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
db80: 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20   int addr;..    
db90: 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f    priorOp = p->o
dba0: 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f  p==TK_ALL ? SRT_
dbb0: 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f  Table : SRT_Unio
dbc0: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  n;.      if( eDe
dbd0: 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70  st==priorOp && p
dbe0: 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21 70  OrderBy==0 && !p
dbf0: 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21 70 2d 3e  ->pLimit && !p->
dc00: 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  pOffset ){.     
dc10: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
dc20: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
dc30: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
dc40: 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
dc50: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
dc60: 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
dc70: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
dc80: 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  = iParm;.      }
dc90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
dca0: 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
dcb0: 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
dcc0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
dcd0: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
dce0: 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
dcf0: 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
dd00: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
dd10: 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
dd20: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
dd30: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
dd40: 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  && matchOrderbyT
dd50: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  oColumn(pParse, 
dd60: 70 2c 20 70 4f 72 64 65 72 42 79 2c 20 75 6e 69  p, pOrderBy, uni
dd70: 6f 6e 54 61 62 2c 31 29 20 29 7b 0a 20 20 20 20  onTab,1) ){.    
dd80: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
dd90: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
dda0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
ddb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ddc0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
ddd0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
dde0: 70 65 6e 56 69 72 74 75 61 6c 2c 20 75 6e 69 6f  penVirtual, unio
ddf0: 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
de00: 20 20 69 66 28 20 70 72 69 6f 72 4f 70 3d 3d 53    if( priorOp==S
de10: 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  RT_Table ){.    
de20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 53        assert( nS
de30: 65 74 50 32 3c 73 69 7a 65 6f 66 28 61 53 65 74  etP2<sizeof(aSet
de40: 50 32 29 2f 73 69 7a 65 6f 66 28 61 53 65 74 50  P2)/sizeof(aSetP
de50: 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 20  2[0]) );.       
de60: 20 20 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32     aSetP2[nSetP2
de70: 2b 2b 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  ++] = addr;.    
de80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
de90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
dea0: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20  addrOpenVirt[0] 
deb0: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  == -1 );.       
dec0: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69     p->addrOpenVi
ded0: 72 74 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  rt[0] = addr;.  
dee0: 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68          p->pRigh
def0: 74 6d 6f 73 74 2d 3e 75 73 65 73 56 69 72 74 20  tmost->usesVirt 
df00: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
df10: 20 20 20 20 20 20 20 63 72 65 61 74 65 53 6f 72         createSor
df20: 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65  tingIndex(pParse
df30: 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , p, pOrderBy);.
df40: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
df50: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
df60: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
df70: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
df80: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
df90: 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
dfa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
dfb0: 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
dfc0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
dfd0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
dfe0: 65 2c 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72  e, pPrior, prior
dff0: 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c  Op, unionTab, 0,
e000: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
e010: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
e020: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
e030: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
e040: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
e050: 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
e060: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
e070: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
e080: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
e090: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
e0a0: 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53  _EXCEPT:  op = S
e0b0: 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65  RT_Except;   bre
e0c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
e0d0: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70  e TK_UNION:   op
e0e0: 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20   = SRT_Union;   
e0f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
e100: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
e110: 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65    op = SRT_Table
e120: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
e130: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
e140: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
e150: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
e160: 20 20 20 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f        p->disallo
e170: 77 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  wOrderBy = pOrde
e180: 72 42 79 21 3d 30 3b 0a 20 20 20 20 20 20 70 4c  rBy!=0;.      pL
e190: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
e1a0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
e1b0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
e1c0: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
e1d0: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
e1e0: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  set = 0;.      r
e1f0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
e200: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c  t(pParse, p, op,
e210: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c   unionTab, 0, 0,
e220: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
e230: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
e240: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  or;.      p->pOr
e250: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
e260: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
e270: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69  xprDelete(p->pLi
e280: 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
e290: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
e2a0: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
e2b0: 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
e2c0: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31    p->iLimit = -1
e2d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
e2e0: 65 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69  et = -1;.      i
e2f0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
e300: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
e310: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
e320: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
e330: 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
e340: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
e350: 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
e360: 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
e370: 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
e380: 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
e390: 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20     */      .    
e3a0: 20 20 69 66 28 20 65 44 65 73 74 21 3d 70 72 69    if( eDest!=pri
e3b0: 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62  orOp || unionTab
e3c0: 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20 20 20  !=iParm ){.     
e3d0: 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
e3e0: 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
e3f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
e400: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
e410: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
e420: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
e430: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
e440: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
e450: 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74  se, 0, p->pEList
e460: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e470: 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
e480: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
e490: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
e4a0: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
e4b0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
e4c0: 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
e4d0: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
e4e0: 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
e4f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e500: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e510: 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61  _Rewind, unionTa
e520: 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  b, iBreak);.    
e530: 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
e540: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
e550: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
e560: 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72  rc = selectInner
e570: 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
e580: 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e  p->pEList, union
e590: 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Tab, p->pEList->
e5a0: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5c0: 20 20 20 20 70 4f 72 64 65 72 42 79 2c 20 2d 31      pOrderBy, -1
e5d0: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
e5e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
e600: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b  ont, iBreak, 0);
e610: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
e620: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
e630: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 1;.          g
e640: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
e650: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
e660: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e670: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
e680: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
e690: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e6a0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
e6b0: 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
e6c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
e6d0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
e6e0: 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
e6f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e700: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
e710: 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ose, unionTab, 0
e720: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e730: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e740: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
e750: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ECT: {.      int
e760: 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20   tab1, tab2;.   
e770: 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
e780: 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
e790: 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
e7a0: 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  , *pOffset;.    
e7b0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20    int addr;..   
e7c0: 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20     /* INTERSECT 
e7d0: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
e7e0: 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e  m the others sin
e7f0: 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20  ce it requires. 
e800: 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70       ** two temp
e810: 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48  orary tables.  H
e820: 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20  ence it has its 
e830: 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e  own case.  Begin
e840: 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c  .      ** by all
e850: 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c  ocating the tabl
e860: 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e  es we will need.
e870: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e880: 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
e890: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62  Tab++;.      tab
e8a0: 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  2 = pParse->nTab
e8b0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ++;.      if( pO
e8c0: 72 64 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f  rderBy && matchO
e8d0: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70  rderbyToColumn(p
e8e0: 50 61 72 73 65 2c 70 2c 70 4f 72 64 65 72 42 79  Parse,p,pOrderBy
e8f0: 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20 20 20 20  ,tab1,1) ){.    
e900: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
e910: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
e920: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
e930: 20 7d 0a 20 20 20 20 20 20 63 72 65 61 74 65 53   }.      createS
e940: 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72  ortingIndex(pPar
e950: 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 29  se, p, pOrderBy)
e960: 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  ;..      addr = 
e970: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e980: 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  (v, OP_OpenVirtu
e990: 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
e9a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
e9b0: 64 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20 3d  ddrOpenVirt[0] =
e9c0: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
e9d0: 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d  >addrOpenVirt[0]
e9e0: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
e9f0: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73  ->pRightmost->us
ea00: 65 73 56 69 72 74 20 3d 20 31 3b 0a 20 20 20 20  esVirt = 1;.    
ea10: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
ea20: 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
ea30: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
ea40: 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
ea50: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
ea60: 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
ea70: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
ea80: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
ea90: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 53 52 54  rse, pPrior, SRT
eaa0: 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c  _Union, tab1, 0,
eab0: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
eac0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
ead0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
eae0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
eaf0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
eb00: 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
eb10: 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
eb20: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
eb30: 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
eb40: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
eb50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
eb60: 70 65 6e 56 69 72 74 75 61 6c 2c 20 74 61 62 32  penVirtual, tab2
eb70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
eb80: 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56  rt( p->addrOpenV
eb90: 69 72 74 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a  irt[1] == -1 );.
eba0: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
ebb0: 6e 56 69 72 74 5b 31 5d 20 3d 20 61 64 64 72 3b  nVirt[1] = addr;
ebc0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
ebd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
ebe0: 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
ebf0: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
ec00: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
ec10: 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
ec20: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
ec30: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  t = 0;.      rc 
ec40: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
ec50: 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55  pParse, p, SRT_U
ec60: 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30  nion, tab2, 0, 0
ec70: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
ec80: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
ec90: 69 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ior;.      sqlit
eca0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
ecb0: 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
ecc0: 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
ecd0: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
ece0: 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
ecf0: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
ed00: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
ed10: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
ed20: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
ed30: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
ed40: 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73   take the inters
ed50: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77  ection of the tw
ed60: 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  o temporary.    
ed70: 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20    ** tables..   
ed80: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
ed90: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
eda0: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
edb0: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
edc0: 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61  {.        genera
edd0: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
ede0: 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69  arse, 0, p->pELi
edf0: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
ee00: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
ee10: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
ee20: 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74  (v);.      iCont
ee30: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
ee40: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
ee50: 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
ee60: 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
ee70: 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
ee80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ee90: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
eea0: 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a   tab1, iBreak);.
eeb0: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
eec0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
eed0: 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61  v, OP_RowKey, ta
eee0: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b1, 0);.      sq
eef0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ef00: 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
ef10: 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  ab2, iCont);.   
ef20: 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e     rc = selectIn
ef30: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
ef40: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61  p, p->pEList, ta
ef50: 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  b1, p->pEList->n
ef60: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef80: 20 20 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c     pOrderBy, -1,
ef90: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a   eDest, iParm, .
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f               iCo
efc0: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a  nt, iBreak, 0);.
efd0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
efe0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
eff0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
f000: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
f010: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
f020: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
f030: 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
f040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f050: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
f060: 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
f070: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f080: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
f090: 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
f0a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f0b0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
f0c0: 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
f0d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f0e0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
f0f0: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  b1, 0);.      br
f100: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
f110: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61    /* Make sure a
f120: 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68  ll SELECTs in th
f130: 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65  e statement have
f140: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
f150: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a   of elements.  *
f160: 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c  * in their resul
f170: 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61  t sets..  */.  a
f180: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
f190: 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
f1a0: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  st );.  if( p->p
f1b0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50  EList->nExpr!=pP
f1c0: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
f1d0: 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
f1e0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
f1f0: 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74  e, "SELECTs to t
f200: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
f210: 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22  t of %s".      "
f220: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
f230: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
f240: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c  result columns",
f250: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
f260: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
f270: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
f280: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
f290: 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
f2a0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
f2b0: 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  s in temporary t
f2c0: 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f  ables.  */.  nCo
f2d0: 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
f2e0: 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e  Expr;.  while( n
f2f0: 53 65 74 50 32 20 29 7b 0a 20 20 20 20 73 71 6c  SetP2 ){.    sql
f300: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
f310: 28 76 2c 20 61 53 65 74 50 32 5b 2d 2d 6e 53 65  (v, aSetP2[--nSe
f320: 74 50 32 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d  tP2], nCol);.  }
f330: 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  ..  /* Compute c
f340: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
f350: 65 73 20 75 73 65 64 20 62 79 20 65 69 74 68 65  es used by eithe
f360: 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  r the ORDER BY c
f370: 6c 61 75 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79  lause or.  ** by
f380: 20 61 6e 79 20 74 65 6d 70 6f 72 61 72 79 20 74   any temporary t
f390: 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20  ables needed to 
f3a0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
f3b0: 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
f3c0: 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b   ** Attach the K
f3d0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
f3e0: 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72   to all temporar
f3f0: 79 20 74 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b  y tables.  Invok
f400: 65 20 74 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52  e the.  ** ORDER
f410: 20 42 59 20 70 72 6f 63 65 73 73 69 6e 67 20 69   BY processing i
f420: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
f430: 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
f440: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65   **.  ** This se
f450: 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20  ction is run by 
f460: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53  the right-most S
f470: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
f480: 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43  only..  ** SELEC
f490: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
f4a0: 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20  the left always 
f4b0: 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20  skip this part. 
f4c0: 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   The right-most.
f4d0: 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68    ** SELECT migh
f4e0: 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73  t also skip this
f4f0: 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20   part if it has 
f500: 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
f510: 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74  se and.  ** no t
f520: 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72  emp tables are r
f530: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
f540: 69 66 28 20 70 4f 72 64 65 72 42 79 20 7c 7c 20  if( pOrderBy || 
f550: 70 2d 3e 75 73 65 73 56 69 72 74 20 29 7b 0a 20  p->usesVirt ){. 
f560: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f580: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
f590: 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
f5a0: 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
f5b0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
f5c0: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
f5d0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
f5e0: 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  /.    Select *pL
f5f0: 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
f600: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
f610: 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43  ng through SELEC
f620: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
f630: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70      CollSeq **ap
f640: 43 6f 6c 6c 3b 0a 20 20 20 20 43 6f 6c 6c 53 65  Coll;.    CollSe
f650: 71 20 2a 2a 61 43 6f 70 79 3b 0a 0a 20 20 20 20  q **aCopy;..    
f660: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
f670: 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20  tmost==p );.    
f680: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
f690: 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  eMalloc(sizeof(*
f6a0: 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 32  pKeyInfo)+nCol*2
f6b0: 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
f6c0: 29 20 2b 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 69  ) + nCol);.    i
f6d0: 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  f( !pKeyInfo ){.
f6e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f6f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
f700: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
f710: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _end;.    }..   
f720: 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d   pKeyInfo->enc =
f730: 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29   ENC(pParse->db)
f740: 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e  ;.    pKeyInfo->
f750: 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a  nField = nCol;..
f760: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
f770: 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
f780: 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
f790: 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
f7a0: 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
f7b0: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
f7c0: 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
f7d0: 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
f7e0: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
f7f0: 61 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d  apColl = pParse-
f800: 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
f810: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
f820: 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20     for(pLoop=p; 
f830: 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
f840: 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  op->pPrior){.   
f850: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
f860: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
f870: 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d  nt addr = pLoop-
f880: 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 69 5d  >addrOpenVirt[i]
f890: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  ;.        if( ad
f8a0: 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  dr<0 ){.        
f8b0: 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75    /* If [0] is u
f8c0: 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69  nused then [1] i
f8d0: 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20  s also unused.  
f8e0: 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20  So we can.      
f8f0: 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61      ** always sa
f900: 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f  fely abort as so
f910: 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20  on as the first 
f920: 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66  unused slot is f
f930: 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
f940: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
f950: 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d  >addrOpenVirt[1]
f960: 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  <0 );.          
f970: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
f980: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f990: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
f9a0: 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  addr, nCol);.   
f9b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f9c0: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
f9d0: 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
f9e0: 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P3_KEYINFO);.
f9f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
fa00: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
fa10: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
fa20: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
fa30: 4f 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79  OTerm = pOrderBy
fa40: 2d 3e 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ->a;.      int n
fa50: 4f 72 64 65 72 42 79 45 78 70 72 20 3d 20 70 4f  OrderByExpr = pO
fa60: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
fa70: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
fa80: 20 20 20 20 20 75 38 20 2a 70 53 6f 72 74 4f 72       u8 *pSortOr
fa90: 64 65 72 3b 0a 0a 20 20 20 20 20 20 61 43 6f 70  der;..      aCop
faa0: 79 20 3d 20 26 70 4b 65 79 49 6e 66 6f 2d 3e 61  y = &pKeyInfo->a
fab0: 43 6f 6c 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20  Coll[nCol];.    
fac0: 20 20 70 53 6f 72 74 4f 72 64 65 72 20 3d 20 70    pSortOrder = p
fad0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
fae0: 64 65 72 20 3d 20 28 75 38 2a 29 26 61 43 6f 70  der = (u8*)&aCop
faf0: 79 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 6d  y[nCol];.      m
fb00: 65 6d 63 70 79 28 61 43 6f 70 79 2c 20 70 4b 65  emcpy(aCopy, pKe
fb10: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e 43  yInfo->aColl, nC
fb20: 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  ol*sizeof(CollSe
fb30: 71 2a 29 29 3b 0a 20 20 20 20 20 20 61 70 43 6f  q*));.      apCo
fb40: 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ll = pKeyInfo->a
fb50: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28  Coll;.      for(
fb60: 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 45  i=0; i<nOrderByE
fb70: 78 70 72 3b 20 69 2b 2b 2c 20 70 4f 54 65 72 6d  xpr; i++, pOTerm
fb80: 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 2c 20 70 53  ++, apColl++, pS
fb90: 6f 72 74 4f 72 64 65 72 2b 2b 29 7b 0a 20 20 20  ortOrder++){.   
fba0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
fbb0: 20 3d 20 70 4f 54 65 72 6d 2d 3e 70 45 78 70 72   = pOTerm->pExpr
fbc0: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
fbd0: 7a 4e 61 6d 65 20 3d 20 70 4f 54 65 72 6d 2d 3e  zName = pOTerm->
fbe0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61  zName;.        a
fbf0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
fc00: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
fc10: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 6e 43  Expr->iColumn<nC
fc20: 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ol );.        if
fc30: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ( zName ){.     
fc40: 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 73       *apColl = s
fc50: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
fc60: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  Seq(pParse, zNam
fc70: 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  e, -1);.        
fc80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
fc90: 20 2a 61 70 43 6f 6c 6c 20 3d 20 61 43 6f 70 79   *apColl = aCopy
fca0: 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
fcb0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fcc0: 20 20 20 20 2a 70 53 6f 72 74 4f 72 64 65 72 20      *pSortOrder 
fcd0: 3d 20 70 4f 54 65 72 6d 2d 3e 73 6f 72 74 4f 72  = pOTerm->sortOr
fce0: 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  der;.      }.   
fcf0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
fd00: 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20  ightmost==p );. 
fd10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
fd20: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 3e  addrOpenVirt[2]>
fd30: 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72  =0 );.      addr
fd40: 20 3d 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69   = p->addrOpenVi
fd50: 72 74 5b 32 5d 3b 0a 20 20 20 20 20 20 73 71 6c  rt[2];.      sql
fd60: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
fd70: 28 76 2c 20 61 64 64 72 2c 20 70 2d 3e 70 45 4c  (v, addr, p->pEL
fd80: 69 73 74 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20  ist->nExpr+2);. 
fd90: 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e       pKeyInfo->n
fda0: 46 69 65 6c 64 20 3d 20 6e 4f 72 64 65 72 42 79  Field = nOrderBy
fdb0: 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
fdc0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
fdd0: 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29  v, addr, (char*)
fde0: 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  pKeyInfo, P3_KEY
fdf0: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
fe00: 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
fe10: 30 3b 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74  0;.      generat
fe20: 65 53 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c 20  eSortTail(p, v, 
fe30: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
fe40: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b  , eDest, iParm);
fe50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
fe60: 74 65 46 72 65 65 28 70 4b 65 79 49 6e 66 6f 29  teFree(pKeyInfo)
fe70: 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c  ;.  }..multi_sel
fe80: 65 63 74 5f 65 6e 64 3a 0a 20 20 72 65 74 75 72  ect_end:.  retur
fe90: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
fea0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
feb0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
fec0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
fed0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
fee0: 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   Scan through th
fef0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
ff00: 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65  pr.  Replace eve
ff10: 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a  ry reference to.
ff20: 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ** a column in t
ff30: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62  able number iTab
ff40: 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  le with a copy o
ff50: 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  f the iColumn-th
ff60: 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c  .** entry in pEL
ff70: 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65  ist.  (But leave
ff80: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
ff90: 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  he ROWID column 
ffa0: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a  .** unchanged.).
ffb0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ffc0: 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ne is part of th
ffd0: 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f  e flattening pro
ffe0: 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75  cedure.  A subqu
fff0: 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73  ery.** whose res
10000 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e  ult set is defin
10010 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70  ed by pEList app
10020 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e  ears as entry in
10030 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   the.** FROM cla
10040 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
10050 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44  such that the VD
10060 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e  BE cursor assign
10070 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f  ed to that.** FO
10080 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  RM clause entry 
10090 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73  is iTable.  This
100a0 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68   routine make th
100b0 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20  e necessary .** 
100c0 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72  changes to pExpr
100d0 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65   so that it refe
100e0 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  rs directly to t
100f0 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a  he source table.
10100 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
10110 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65  ry rather the re
10120 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
10130 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
10140 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
10150 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 2a  prList(ExprList*
10160 2c 69 6e 74 2c 45 78 70 72 4c 69 73 74 2a 29 3b  ,int,ExprList*);
10170 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63    /* Forward Dec
10180 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  l */.static void
10190 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 65 6c   substSelect(Sel
101a0 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72  ect *, int, Expr
101b0 4c 69 73 74 20 2a 29 3b 20 20 2f 2a 20 46 6f 72  List *);  /* For
101c0 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61  ward Decl */.sta
101d0 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
101e0 70 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  pr(Expr *pExpr, 
101f0 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72  int iTable, Expr
10200 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20  List *pEList){. 
10210 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
10220 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45  return;.  if( pE
10230 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
10240 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
10250 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20  ble==iTable ){. 
10260 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
10270 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
10280 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
10290 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NULL;.    }else{
102a0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
102b0 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  w;.      assert(
102c0 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45   pEList!=0 && pE
102d0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c  xpr->iColumn<pEL
102e0 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
102f0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
10300 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
10310 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
10320 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d  && pExpr->pList=
10330 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
10340 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78   = pEList->a[pEx
10350 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
10360 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
10370 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20  ( pNew!=0 );.   
10380 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70     pExpr->op = p
10390 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61  New->op;.      a
103a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
103b0 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft==0 );.      
103c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73  pExpr->pLeft = s
103d0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4e  qlite3ExprDup(pN
103e0 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  ew->pLeft);.    
103f0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
10400 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
10410 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
10420 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
10430 75 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74 29  up(pNew->pRight)
10440 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10450 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20  pExpr->pList==0 
10460 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
10470 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
10480 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d  xprListDup(pNew-
10490 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  >pList);.      p
104a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
104b0 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  New->iTable;.   
104c0 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
104d0 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d  n = pNew->iColum
104e0 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  n;.      pExpr->
104f0 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67  iAgg = pNew->iAg
10500 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  g;.      sqlite3
10510 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72  TokenCopy(&pExpr
10520 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e  ->token, &pNew->
10530 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71  token);.      sq
10540 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26  lite3TokenCopy(&
10550 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e  pExpr->span, &pN
10560 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20  ew->span);.     
10570 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
10580 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
10590 75 70 28 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74  up(pNew->pSelect
105a0 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
105b0 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 66 6c  flags = pNew->fl
105c0 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ags;.    }.  }el
105d0 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  se{.    substExp
105e0 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  r(pExpr->pLeft, 
105f0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
10600 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
10610 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54  Expr->pRight, iT
10620 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
10630 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 70     substSelect(p
10640 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69  Expr->pSelect, i
10650 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
10660 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
10670 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20  t(pExpr->pList, 
10680 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
10690 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
106a0 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
106b0 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
106c0 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78  , int iTable, Ex
106d0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b  prList *pEList){
106e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
106f0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
10700 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
10710 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
10720 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  +){.    substExp
10730 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  r(pList->a[i].pE
10740 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  xpr, iTable, pEL
10750 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  ist);.  }.}.stat
10760 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
10770 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  ect(Select *p, i
10780 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c  nt iTable, ExprL
10790 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20  ist *pEList){.  
107a0 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
107b0 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
107c0 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62  (p->pEList, iTab
107d0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
107e0 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
107f0 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65  pGroupBy, iTable
10800 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
10810 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  stExprList(p->pO
10820 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20  rderBy, iTable, 
10830 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
10840 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c  Expr(p->pHaving,
10850 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
10860 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 70 2d  ;.  substExpr(p-
10870 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c  >pWhere, iTable,
10880 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e 64   pEList);.}.#end
10890 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
108a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
108b0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
108c0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
108d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
108e0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
108f0 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
10900 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65  in order to spee
10910 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20  d.** execution. 
10920 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69 66   It returns 1 if
10930 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65   it makes change
10940 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c  s and 0 if no fl
10950 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75  attening.** occu
10960 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64  rs..**.** To und
10970 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63  erstand the conc
10980 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e  ept of flattenin
10990 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  g, consider the 
109a0 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65  following.** que
109b0 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ry:.**.**     SE
109c0 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c  LECT a FROM (SEL
109d0 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
109e0 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
109f0 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a  ) WHERE a>5.**.*
10a00 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61  * The default wa
10a10 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  y of implementin
10a20 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  g this query is 
10a30 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a  to execute the.*
10a40 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74  * subquery first
10a50 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
10a60 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70  esults in a temp
10a70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65  orary table, the
10a80 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74  n.** run the out
10a90 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74  er query on that
10aa0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
10ab0 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73  .  This requires
10ac0 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f   two.** passes o
10ad0 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46  ver the data.  F
10ae0 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61  urthermore, beca
10af0 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  use the temporar
10b00 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e  y table.** has n
10b10 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57  o indices, the W
10b20 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74  HERE clause on t
10b30 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
10b40 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69  annot be.** opti
10b50 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mized..**.** Thi
10b60 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
10b70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75  ts to rewrite qu
10b80 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68  eries such as th
10b90 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20  e above into.** 
10ba0 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65  a single flat se
10bb0 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a  lect, like this:
10bc0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
10bd0 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
10be0 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41  t1 WHERE z<100 A
10bf0 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  ND a>5.**.** The
10c00 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
10c10 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69  for this simpifi
10c20 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65  cation gives the
10c30 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20   same result.** 
10c40 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20  but only has to 
10c50 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e  scan the data on
10c60 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65  ce.  And because
10c70 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a   indices might .
10c80 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20  ** exist on the 
10c90 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70  table t1, a comp
10ca0 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65  lete scan of the
10cb0 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a   data might be.*
10cc0 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a  * avoided..**.**
10cd0 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f   Flattening is o
10ce0 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
10cf0 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
10d00 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
10d10 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65  **.**   (1)  The
10d20 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
10d30 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
10d40 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67   not both use ag
10d50 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
10d60 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75    (2)  The subqu
10d70 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
10d80 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f  gregate or the o
10d90 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
10da0 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
10db0 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75    (3)  The subqu
10dc0 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
10dd0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
10de0 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69  a left outer joi
10df0 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  n, or.**        
10e00 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
10e10 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f 69  not itself a joi
10e20 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33 30 36  n.  (Ticket #306
10e30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54  ).**.**   (4)  T
10e40 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
10e50 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74  ot DISTINCT or t
10e60 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
10e70 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
10e80 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20 73  .**   (5)  The s
10e90 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
10ea0 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
10eb0 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
10ec0 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
10ed0 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
10ee0 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73  .**   (6)  The s
10ef0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
10f00 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
10f10 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
10f20 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
10f30 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a      DISTINCT..**
10f40 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73  .**   (7)  The s
10f50 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52  ubquery has a FR
10f60 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
10f70 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71     (8)  The subq
10f80 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
10f90 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
10fa0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
10fb0 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
10fc0 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75    (9)  The subqu
10fd0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
10fe0 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
10ff0 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
11000 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
11010 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
11020 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75  **  (10)  The su
11030 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
11040 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
11050 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
11060 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
11070 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a       use LIMIT..
11080 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65  **.**  (11)  The
11090 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
110a0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
110b0 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f   not both have O
110c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e  RDER BY clauses.
110d0 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54 68  .**.**  (12)  Th
110e0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
110f0 74 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  t the right term
11100 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
11110 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a 20   JOIN or the.** 
11120 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20         subquery 
11130 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
11140 75 73 65 2e 20 20 28 61 64 64 65 64 20 62 79 20  use.  (added by 
11150 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a 0a  ticket #350).**.
11160 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75  **  (13)  The su
11170 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72  bquery and outer
11180 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
11190 74 68 20 75 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a  th use LIMIT.**.
111a0 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75  **  (14)  The su
111b0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
111c0 75 73 65 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a  use OFFSET.**.**
111d0 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
111e0 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
111f0 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
11200 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
11210 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
11220 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
11230 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
11240 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
11250 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
11260 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20  uses aggregates 
11270 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67  and subqueryIsAg
11280 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
11290 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
112a0 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
112b0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
112c0 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
112d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
112e0 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
112f0 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  urns 0..** If fl
11300 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
11310 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
11320 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
11330 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
11340 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
11350 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
11360 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
11370 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
11380 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
11390 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
113a0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
113b0 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  t flattenSubquer
113c0 79 28 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  y(.  Select *p, 
113d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
113e0 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72   parent or outer
113f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11400 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
11410 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
11420 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d  ndex in p->pSrc-
11430 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65  >a[] of the inne
11440 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  r subquery */.  
11450 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20  int isAgg,      
11460 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
11470 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65  outer SELECT use
11480 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
11490 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73  tions */.  int s
114a0 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20  ubqueryIsAgg    
114b0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
114c0 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
114d0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
114e0 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
114f0 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20  *pSub;       /* 
11500 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
11510 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f  or "subquery" */
11520 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
11530 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
11540 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
11550 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
11560 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
11570 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
11580 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
11590 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78  subquery */.  Ex
115a0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20  prList *pList;  
115b0 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
115c0 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72  set of the outer
115d0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
115e0 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
115f0 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  /* VDBE cursor n
11600 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75  umber of the pSu
11610 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d  b result set tem
11620 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  p table */.  int
11630 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
11640 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
11650 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
11660 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
11670 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
11680 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
11690 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
116a0 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
116b0 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
116c0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
116d0 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
116e0 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
116f0 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
11700 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  not..  */.  if( 
11710 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
11720 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
11730 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
11740 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
11750 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
11760 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
11770 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
11780 5d 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  ];.  pSub = pSub
11790 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  item->pSelect;. 
117a0 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30   assert( pSub!=0
117b0 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20   );.  if( isAgg 
117c0 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
117d0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
117e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
117f0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20  Restriction (1) 
11800 20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65   */.  if( subque
11810 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d  ryIsAgg && pSrc-
11820 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e  >nSrc>1 ) return
11830 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
11840 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20  Restriction (2) 
11850 20 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20   */.  pSubSrc = 
11860 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73  pSub->pSrc;.  as
11870 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b  sert( pSubSrc );
11880 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76  .  /* Prior to v
11890 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68  ersion 3.1.2, wh
118a0 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
118b0 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69  SET had to be si
118c0 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a  mple constants,.
118d0 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61    ** not arbitra
118e0 72 79 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c  ry expresssions,
118f0 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65   we allowed some
11900 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49   combining of LI
11910 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
11920 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79   ** because they
11930 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74   could be comput
11940 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
11950 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49  me.  But when LI
11960 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
11970 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74   ** became arbit
11980 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73  rary expressions
11990 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64  , we were forced
119a0 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74   to add restrict
119b0 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61  ions (13).  ** a
119c0 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66  nd (14). */.  if
119d0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
119e0 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65  & p->pLimit ) re
119f0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
11a00 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
11a10 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66  ion (13) */.  if
11a20 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20  ( pSub->pOffset 
11a30 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a50 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
11a60 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66  ion (14) */.  if
11a70 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d  ( pSubSrc->nSrc=
11a80 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
11a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11aa0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
11ab0 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66  ion (7)  */.  if
11ac0 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73 74 69  ( (pSub->isDisti
11ad0 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 70 4c 69  nct || pSub->pLi
11ae0 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20 20 26  mit) .         &
11af0 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  & (pSrc->nSrc>1 
11b00 7c 7c 20 69 73 41 67 67 29 20 29 7b 20 20 20 20  || isAgg) ){    
11b10 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
11b20 74 69 6f 6e 73 20 28 34 29 28 35 29 28 38 29 28  tions (4)(5)(8)(
11b30 39 29 20 2a 2f 0a 20 20 20 20 20 72 65 74 75 72  9) */.     retur
11b40 6e 20 30 3b 20 20 20 20 20 20 20 0a 20 20 7d 0a  n 0;       .  }.
11b50 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73 74 69    if( p->isDisti
11b60 6e 63 74 20 26 26 20 73 75 62 71 75 65 72 79 49  nct && subqueryI
11b70 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
11b80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
11b90 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a  riction (6)  */.
11ba0 20 20 69 66 28 20 28 70 2d 3e 64 69 73 61 6c 6c    if( (p->disall
11bb0 6f 77 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e  owOrderBy || p->
11bc0 70 4f 72 64 65 72 42 79 29 20 26 26 20 70 53 75  pOrderBy) && pSu
11bd0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
11be0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c10 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
11c20 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20  iction (11) */. 
11c30 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63   }..  /* Restric
11c40 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20  tion 3:  If the 
11c50 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f  subquery is a jo
11c60 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
11c70 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20  e subquery is . 
11c80 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20   ** not used as 
11c90 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
11ca0 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f  d of an outer jo
11cb0 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66  in.  Examples of
11cc0 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69   why this.  ** i
11cd0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
11ce0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
11cf0 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
11d00 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29  OIN (t2 JOIN t3)
11d10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
11d20 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
11d30 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
11d40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
11d50 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
11d60 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20  R JOIN t2) JOIN 
11d70 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69  t3.  **.  ** whi
11d80 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  ch is not at all
11d90 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
11da0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
11db0 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20 69  Src->nSrc>1 && i
11dc0 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d  From>0 && (pSrc-
11dd0 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e  >a[iFrom-1].join
11de0 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
11df0 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
11e00 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  n 0;.  }..  /* R
11e10 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20  estriction 12:  
11e20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
11e30 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
11e40 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
11e50 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20  uter.  ** join, 
11e60 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
11e70 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
11e80 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ERE clause..  **
11e90 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20   An examples of 
11ea0 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20  why this is not 
11eb0 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
11ec0 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
11ed0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53  FT OUTER JOIN (S
11ee0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
11ef0 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20  WHERE t2.x>0).  
11f00 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
11f10 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
11f20 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
11f30 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
11f40 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
11f50 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32  OIN t2) WHERE t2
11f60 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  .x>0.  **.  ** B
11f70 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65  ut the t2.x>0 te
11f80 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  st will always f
11f90 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f  ail on a NULL ro
11fa0 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20  w of t2, which. 
11fb0 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20   ** effectively 
11fc0 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54  converts the OUT
11fd0 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20  ER JOIN into an 
11fe0 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f  INNER JOIN..  */
11ff0 0a 20 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26  .  if( iFrom>0 &
12000 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  & (pSrc->a[iFrom
12010 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  -1].jointype & J
12020 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20  T_OUTER)!=0 .   
12030 20 20 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65     && pSub->pWhe
12040 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  re!=0 ){.    ret
12050 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
12060 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
12070 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
12080 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  s flattening is 
12090 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68  permitted for th
120a0 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20  e.  ** iFrom-th 
120b0 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
120c0 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
120d0 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
120e0 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c  /..  /* Move all
120f0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
12100 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
12110 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
12120 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
12130 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
12140 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
12150 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
12160 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
12170 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
12180 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
12190 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
121a0 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
121b0 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
121c0 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
121d0 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
121e0 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
121f0 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
12200 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
12210 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
12220 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
12230 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
12240 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
12250 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
12260 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
12270 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
12280 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
12290 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
122a0 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65  in..  */.  iPare
122b0 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
122c0 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20  Cursor;.  {.    
122d0 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53  int nSubSrc = pS
122e0 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20  ubSrc->nSrc;.   
122f0 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
12300 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
12310 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  pe;..    sqlite3
12320 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
12330 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  Subitem->pTab);.
12340 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
12350 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
12360 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  se);.    sqliteF
12370 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  ree(pSubitem->zN
12380 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
12390 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a  Free(pSubitem->z
123a0 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20  Alias);.    if( 
123b0 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20  nSubSrc>1 ){.   
123c0 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d 20 6e     int extra = n
123d0 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20 20 20  SubSrc - 1;.    
123e0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75    for(i=1; i<nSu
123f0 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
12400 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74      pSrc = sqlit
12410 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
12420 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20  pSrc, 0, 0);.   
12430 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53     }.      p->pS
12440 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 20  rc = pSrc;.     
12450 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
12460 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46  c-1; i-extra>=iF
12470 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  rom; i--){.     
12480 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20     pSrc->a[i] = 
12490 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d  pSrc->a[i-extra]
124a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
124b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
124c0 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
124d0 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46      pSrc->a[i+iF
124e0 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e  rom] = pSubSrc->
124f0 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73  a[i];.      mems
12500 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69  et(&pSubSrc->a[i
12510 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75  ], 0, sizeof(pSu
12520 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20  bSrc->a[i]));.  
12530 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b    }.    pSrc->a[
12540 69 46 72 6f 6d 2b 6e 53 75 62 53 72 63 2d 31 5d  iFrom+nSubSrc-1]
12550 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e  .jointype = join
12560 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  type;.  }..  /* 
12570 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69  Now begin substi
12580 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20  tuting subquery 
12590 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65  result set expre
125a0 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a  ssions for .  **
125b0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
125c0 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
125d0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
125e0 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c   ** .  ** Exampl
125f0 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53  e:.  **.  **   S
12600 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20  ELECT a+5, b*10 
12610 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33  FROM (SELECT x*3
12620 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62   AS a, y+10 AS b
12630 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20   FROM t1) WHERE 
12640 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20  a>b;.  **   \   
12650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12660 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
12670 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f   subquery ______
12680 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f  ____/          /
12690 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  .  **    \______
126a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20  _______________ 
126b0 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f  outer query ____
126c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
126d0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a  __________/.  **
126e0 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74  .  ** We look at
126f0 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
12700 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
12710 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
12720 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 2a 2a  lace we see.  **
12730 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75   "a" we substitu
12740 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65  te "x*3" and eve
12750 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20  ry place we see 
12760 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "b" we substitut
12770 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20  e "y+10"..  */. 
12780 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
12790 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
127a0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
127b0 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70  ;.  pList = p->p
127c0 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  EList;.  for(i=0
127d0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
127e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
127f0 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28   *pExpr;.    if(
12800 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
12810 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20  me==0 && (pExpr 
12820 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
12830 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20  xpr)->span.z!=0 
12840 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  ){.      pList->
12850 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[i].zName = sql
12860 69 74 65 53 74 72 4e 44 75 70 28 28 63 68 61 72  iteStrNDup((char
12870 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c  *)pExpr->span.z,
12880 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b   pExpr->span.n);
12890 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
128a0 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75   isAgg ){.    su
128b0 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
128c0 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74  GroupBy, iParent
128d0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
128e0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
128f0 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
12900 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
12910 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  );.  }.  if( pSu
12920 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
12930 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
12940 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
12950 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
12960 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
12970 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
12980 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  y = 0;.  }else i
12990 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
129a0 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  {.    substExprL
129b0 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
129c0 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
129d0 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69  pEList);.  }.  i
129e0 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
129f0 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  ){.    pWhere = 
12a00 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
12a10 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  Sub->pWhere);.  
12a20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65 72  }else{.    pWher
12a30 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
12a40 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
12a50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
12a60 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20  >pHaving==0 );. 
12a70 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
12a80 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70  p->pWhere;.    p
12a90 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
12aa0 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e;.    substExpr
12ab0 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  (p->pHaving, iPa
12ac0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
12ad0 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76  st);.    p->pHav
12ae0 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
12af0 72 41 6e 64 28 70 2d 3e 70 48 61 76 69 6e 67 2c  rAnd(p->pHaving,
12b00 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
12b10 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29 29 3b  pSub->pHaving));
12b20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
12b30 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
12b40 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d     p->pGroupBy =
12b50 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
12b60 44 75 70 28 70 53 75 62 2d 3e 70 47 72 6f 75 70  Dup(pSub->pGroup
12b70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  By);.  }else{.  
12b80 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
12b90 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20  Where, iParent, 
12ba0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
12bb0 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
12bc0 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d  qlite3ExprAnd(p-
12bd0 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29  >pWhere, pWhere)
12be0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
12bf0 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
12c00 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65  is distinct if e
12c10 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
12c20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65  or the.  ** oute
12c30 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
12c40 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e  nct. .  */.  p->
12c50 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
12c60 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53  isDistinct || pS
12c70 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a  ub->isDistinct;.
12c80 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45 43  .  /*.  ** SELEC
12c90 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45  T ... FROM (SELE
12ca0 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f  CT ... LIMIT a O
12cb0 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78  FFSET b) LIMIT x
12cc0 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 2a 2a 0a   OFFSET y;.  **.
12cd0 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70    ** One is temp
12ce0 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64  ted to try to ad
12cf0 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d  d a and b to com
12d00 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e  bine the limits.
12d10 20 20 42 75 74 20 74 68 69 73 0a 20 20 2a 2a 20    But this.  ** 
12d20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66  does not work if
12d30 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73   either limit is
12d40 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 2a 2f 0a   negative..  */.
12d50 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
12d60 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 69  it ){.    p->pLi
12d70 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d  mit = pSub->pLim
12d80 69 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4c  it;.    pSub->pL
12d90 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  imit = 0;.  }.. 
12da0 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
12db0 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
12dc0 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
12dd0 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
12de0 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
12df0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
12e00 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20 72  elete(pSub);.  r
12e10 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
12e20 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12e30 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VIEW */../*.** 
12e40 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45  Analyze the SELE
12e50 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  CT statement pas
12e60 73 65 64 20 69 6e 20 61 73 20 61 6e 20 61 72 67  sed in as an arg
12e70 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20  ument to see if 
12e80 69 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c  it.** is a simpl
12e90 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
12ea0 20 71 75 65 72 79 2e 20 20 49 66 20 69 74 20 69   query.  If it i
12eb0 73 20 61 6e 64 20 74 68 69 73 20 71 75 65 72 79  s and this query
12ec0 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73   can be.** satis
12ed0 66 69 65 64 20 75 73 69 6e 67 20 61 20 73 69 6e  fied using a sin
12ee0 67 6c 65 20 73 65 65 6b 20 74 6f 20 74 68 65 20  gle seek to the 
12ef0 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64  beginning or end
12f00 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a   of an index,.**
12f10 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20 74   then generate t
12f20 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73  he code for this
12f30 20 53 45 4c 45 43 54 20 61 6e 64 20 72 65 74 75   SELECT and retu
12f40 72 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20 69  rn 1.  If this i
12f50 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70  s not a .** simp
12f60 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  le min() or max(
12f70 29 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72 65  ) query, then re
12f80 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20  turn 0;.**.** A 
12f90 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20  simply min() or 
12fa0 6d 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b  max() query look
12fb0 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
12fc0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e  **    SELECT min
12fd0 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a  (a) FROM table;.
12fe0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78  **    SELECT max
12ff0 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a  (a) FROM table;.
13000 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20  **.** The query 
13010 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61 20  may have only a 
13020 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
13030 69 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e  its FROM argumen
13040 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e  t.  There.** can
13050 20 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59 20   be no GROUP BY 
13060 6f 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48 45  or HAVING or WHE
13070 52 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65  RE clauses.  The
13080 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73 74   result set must
13090 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28 29  .** be the min()
130a0 20 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20 73   or max() of a s
130b0 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
130c0 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  the table.  The 
130d0 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65  column.** in the
130e0 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
130f0 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
13100 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20   indexed..**.** 
13110 54 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74  The parameters t
13120 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  o this routine a
13130 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 66  re the same as f
13140 6f 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  or sqlite3Select
13150 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68  ()..** See the h
13160 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
13170 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f   that routine fo
13180 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
13190 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
131a0 74 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69  tic int simpleMi
131b0 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20  nMaxQuery(Parse 
131c0 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
131d0 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  *p, int eDest, i
131e0 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 45 78 70  nt iParm){.  Exp
131f0 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74 20  r *pExpr;.  int 
13200 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iCol;.  Table *p
13210 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
13220 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a  dx;.  int base;.
13230 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
13240 20 73 65 65 6b 4f 70 3b 0a 20 20 45 78 70 72 4c   seekOp;.  ExprL
13250 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 2a 70 4c  ist *pEList, *pL
13260 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20 20 73 74  ist, eList;.  st
13270 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
13280 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20  em eListItem;.  
13290 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
132a0 20 69 6e 74 20 62 72 6b 3b 0a 20 20 69 6e 74 20   int brk;.  int 
132b0 69 44 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  iDb;..  /* Check
132c0 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
132d0 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c  query is a simpl
132e0 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
132f0 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a   query.  Return.
13300 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20    ** zero if it 
13310 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  is  not..  */.  
13320 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
13330 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c  || p->pHaving ||
13340 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
13350 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
13360 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70  p->pSrc;.  if( p
13370 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
13380 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73  eturn 0;.  pELis
13390 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
133a0 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
133b0 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
133c0 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69  ;.  pExpr = pELi
133d0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
133e0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
133f0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
13400 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
13410 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
13420 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  ist;.  if( pList
13430 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45  ==0 || pList->nE
13440 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
13450 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
13460 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74  token.n!=3 ) ret
13470 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  urn 0;.  if( sql
13480 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
13490 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
134a0 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29  .z,"min",3)==0 )
134b0 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f  {.    seekOp = O
134c0 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73  P_Rewind;.  }els
134d0 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
134e0 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78  NICmp((char*)pEx
134f0 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78  pr->token.z,"max
13500 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ",3)==0 ){.    s
13510 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b  eekOp = OP_Last;
13520 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
13530 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45  turn 0;.  }.  pE
13540 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30  xpr = pList->a[0
13550 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
13560 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
13570 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
13580 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e    iCol = pExpr->
13590 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20  iColumn;.  pTab 
135a0 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  = pSrc->a[0].pTa
135b0 62 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  b;...  /* If we 
135c0 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20  get to here, it 
135d0 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79 20  means the query 
135e0 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63  is of the correc
135f0 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65  t form..  ** Che
13600 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
13610 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78  we have an index
13620 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70   and make pIdx p
13630 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  oint to the.  **
13640 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
13650 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28  ex.  If the min(
13660 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
13670 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
13680 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c  ARY.  ** key col
13690 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73  umn, no index is
136a0 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73 65   necessary so se
136b0 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20  t pIdx to NULL. 
136c0 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62   If no.  ** usab
136d0 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e  le index is foun
136e0 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  d, return 0..  *
136f0 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29  /.  if( iCol<0 )
13700 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a  {.    pIdx = 0;.
13710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f 6c    }else{.    Col
13720 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
13730 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
13740 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
13750 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
13760 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
13770 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
13780 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
13790 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
137a0 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=1 );.      if(
137b0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
137c0 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 0a 20 20 20  0]==iCol && .   
137d0 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65         0==sqlite
137e0 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 61  3StrICmp(pIdx->a
137f0 7a 43 6f 6c 6c 5b 30 5d 2c 20 70 43 6f 6c 6c 2d  zColl[0], pColl-
13800 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  >zName) ){.     
13810 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13820 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
13830 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  pIdx==0 ) return
13840 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64   0;.  }..  /* Id
13850 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79  entify column ty
13860 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62  pes if we will b
13870 65 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c 6c  e using the call
13880 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  back.  This.  **
13890 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64   step is skipped
138a0 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
138b0 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62  s going to a tab
138c0 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63  le or a memory c
138d0 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f  ell..  ** The co
138e0 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76 65 20  lumn names have 
138f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e  already been gen
13900 65 72 61 74 65 64 20 69 6e 20 74 68 65 20 63 61  erated in the ca
13910 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
13920 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
13930 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
13940 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
13950 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
13960 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
13970 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
13980 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
13990 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
139a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
139b0 73 74 3d 3d 53 52 54 5f 56 69 72 74 75 61 6c 54  st==SRT_VirtualT
139c0 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
139d0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
139e0 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 69 50  _OpenVirtual, iP
139f0 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  arm, 1);.  }..  
13a00 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 63 6f  /* Generating co
13a10 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d  de to find the m
13a20 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e 20 20  in or the max.  
13a30 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20 77 65  Basically all we
13a40 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f   have.  ** to do
13a50 20 69 73 20 66 69 6e 64 20 74 68 65 20 66 69 72   is find the fir
13a60 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74 20 65  st or the last e
13a70 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68 6f 73  ntry in the chos
13a80 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a 20 20  en index.  If.  
13a90 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  ** the min() or 
13aa0 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68 65 20  max() is on the 
13ab0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
13ac0 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64 20 74  KEY, then find t
13ad0 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 6f 72  he first.  ** or
13ae0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
13af0 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20  he main table.. 
13b00 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   */.  iDb = sqli
13b10 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
13b20 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
13b30 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61  b->pSchema);.  a
13b40 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 7c 7c  ssert( iDb>=0 ||
13b50 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65   pTab->isTransie
13b60 6e 74 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  nt );.  sqlite3C
13b70 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
13b80 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
13b90 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
13ba0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
13bb0 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
13bc0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 62 61 73  b->zName);.  bas
13bd0 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69  e = pSrc->a[0].i
13be0 43 75 72 73 6f 72 3b 0a 20 20 62 72 6b 20 3d 20  Cursor;.  brk = 
13bf0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
13c00 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75  abel(v);.  compu
13c10 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
13c20 28 70 50 61 72 73 65 2c 20 70 2c 20 62 72 6b 29  (pParse, p, brk)
13c30 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b  ;.  if( pSrc->a[
13c40 30 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  0].pSelect==0 ){
13c50 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
13c60 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 62 61  Table(pParse, ba
13c70 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  se, iDb, pTab, O
13c80 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 7d  P_OpenRead);.  }
13c90 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29  .  if( pIdx==0 )
13ca0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
13cb0 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70  eAddOp(v, seekOp
13cc0 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 65  , base, 0);.  }e
13cd0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 76 65 6e  lse{.    /* Even
13ce0 20 74 68 6f 75 67 68 20 74 68 65 20 63 75 72 73   though the curs
13cf0 6f 72 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  or used to open 
13d00 74 68 65 20 69 6e 64 65 78 20 68 65 72 65 20 69  the index here i
13d10 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 2a 2a 20  s closed.    ** 
13d20 61 73 20 73 6f 6f 6e 20 61 73 20 61 20 73 69 6e  as soon as a sin
13d30 67 6c 65 20 76 61 6c 75 65 20 68 61 73 20 62 65  gle value has be
13d40 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 69 74 2c  en read from it,
13d50 20 61 6c 6c 6f 63 61 74 65 20 69 74 0a 20 20 20   allocate it.   
13d60 20 2a 2a 20 75 73 69 6e 67 20 28 70 50 61 72 73   ** using (pPars
13d70 65 2d 3e 6e 54 61 62 2b 2b 29 20 74 6f 20 70 72  e->nTab++) to pr
13d80 65 76 65 6e 74 20 74 68 65 20 63 75 72 73 6f 72  event the cursor
13d90 20 69 64 20 66 72 6f 6d 20 62 65 69 6e 67 20 0a   id from being .
13da0 20 20 20 20 2a 2a 20 72 65 75 73 65 64 2e 20 54      ** reused. T
13db0 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
13dc0 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20   for statements 
13dd0 6f 66 20 74 68 65 20 66 6f 72 6d 20 0a 20 20 20  of the form .   
13de0 20 2a 2a 20 22 49 4e 53 45 52 54 20 49 4e 54 4f   ** "INSERT INTO
13df0 20 78 20 53 45 4c 45 43 54 20 6d 61 78 28 29 20   x SELECT max() 
13e00 46 52 4f 4d 20 78 22 2e 0a 20 20 20 20 2a 2f 0a  FROM x"..    */.
13e10 20 20 20 20 69 6e 74 20 69 49 64 78 3b 0a 20 20      int iIdx;.  
13e20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20    KeyInfo *pKey 
13e30 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
13e40 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
13e50 64 78 29 3b 0a 20 20 20 20 69 49 64 78 20 3d 20  dx);.    iIdx = 
13e60 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
13e70 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
13e80 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
13e90 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
13ea0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13eb0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
13ec0 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  iDb, 0);.    sql
13ed0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
13ee0 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78  P_OpenRead, iIdx
13ef0 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 0a 20  , pIdx->tnum, . 
13f00 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
13f10 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P3_KEYINFO_H
13f20 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 69 66 28  ANDOFF);.    if(
13f30 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69   seekOp==OP_Rewi
13f40 6e 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nd ){.      sqli
13f50 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13f60 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a  OP_Null, 0, 0);.
13f70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13f80 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
13f90 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b 0a  eRecord, 1, 0);.
13fa0 20 20 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f        seekOp = O
13fb0 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20 20 7d 0a  P_MoveGt;.    }.
13fc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13fd0 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20  ddOp(v, seekOp, 
13fe0 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71  iIdx, 0);.    sq
13ff0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14000 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69  , OP_IdxRowid, i
14010 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Idx, 0);.    sql
14020 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14030 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c   OP_Close, iIdx,
14040 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
14050 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14060 4d 6f 76 65 47 65 2c 20 62 61 73 65 2c 20 30 29  MoveGe, base, 0)
14070 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45  ;.  }.  eList.nE
14080 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65  xpr = 1;.  memse
14090 74 28 26 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c  t(&eListItem, 0,
140a0 20 73 69 7a 65 6f 66 28 65 4c 69 73 74 49 74 65   sizeof(eListIte
140b0 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d  m));.  eList.a =
140c0 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65   &eListItem;.  e
140d0 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20  List.a[0].pExpr 
140e0 3d 20 70 45 78 70 72 3b 0a 20 20 73 65 6c 65 63  = pExpr;.  selec
140f0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
14100 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c  e, p, &eList, 0,
14110 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73 74   0, 0, -1, eDest
14120 2c 20 69 50 61 72 6d 2c 20 62 72 6b 2c 20 62 72  , iParm, brk, br
14130 6b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  k, 0);.  sqlite3
14140 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
14150 28 76 2c 20 62 72 6b 29 3b 0a 20 20 73 71 6c 69  (v, brk);.  sqli
14160 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14170 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20  OP_Close, base, 
14180 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  0);.  .  return 
14190 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  1;.}../*.** Anal
141a0 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59  yze and ORDER BY
141b0 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
141c0 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43 54 20  use in a SELECT 
141d0 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75  statement.  Retu
141e0 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
141f0 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e   of errors seen.
14200 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45 52 20  .**.** An ORDER 
14210 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 69  BY or GROUP BY i
14220 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72  s a list of expr
14230 65 73 73 69 6f 6e 73 2e 20 20 49 66 20 61 6e 79  essions.  If any
14240 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
14250 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  s an integer con
14260 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 61 74  stant, then that
14270 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
14280 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 0a 2a  eplaced by the.*
14290 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
142a0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 65 73  entry in the res
142b0 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
142c0 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 4f 72  ic int processOr
142d0 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20 4e 61  derGroupBy(.  Na
142e0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
142f0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
14300 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ext of the SELEC
14310 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a  T statement. */.
14320 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
14330 65 72 42 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f  erBy,   /* The O
14340 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
14350 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65   BY clause to be
14360 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
14370 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
14380 65 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  e     /* Either 
14390 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55  "ORDER" or "GROU
143a0 50 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61  P", as appropria
143b0 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  te */.){.  int i
143c0 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
143d0 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69  List = pNC->pELi
143e0 73 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 72  st;     /* The r
143f0 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
14400 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 50 61 72   SELECT */.  Par
14410 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43  se *pParse = pNC
14420 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 2f 2a  ->pParse;     /*
14430 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
14440 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f  of the SELECT */
14450 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
14460 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64  t );..  if( pOrd
14470 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  erBy==0 ) return
14480 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
14490 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
144a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
144b0 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a  iCol;.    Expr *
144c0 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
144d0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
144e0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
144f0 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
14500 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l) ){.      if( 
14510 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d  iCol>0 && iCol<=
14520 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
14530 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14540 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a  ExprDelete(pE);.
14550 20 20 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72          pE = pOr
14560 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
14570 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
14580 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  up(pEList->a[iCo
14590 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  l-1].pExpr);.   
145a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
145b0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
145c0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
145d0 20 20 20 20 20 20 22 25 73 20 42 59 20 63 6f 6c        "%s BY col
145e0 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75  umn number %d ou
145f0 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f  t of range - sho
14600 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
14610 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61      "between 1 a
14620 6e 64 20 25 64 22 2c 20 7a 54 79 70 65 2c 20 69  nd %d", zType, i
14630 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  Col, pEList->nEx
14640 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  pr);.        ret
14650 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
14660 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
14670 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
14680 61 6d 65 73 28 70 4e 43 2c 20 70 45 29 20 29 7b  ames(pNC, pE) ){
14690 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
146a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
146b0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
146c0 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20  tant(pE) ){.    
146d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
146e0 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
146f0 20 20 20 20 22 25 73 20 42 59 20 74 65 72 6d 73      "%s BY terms
14700 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e   must not be non
14710 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e  -integer constan
14720 74 73 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20  ts", zType);.   
14730 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
14740 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
14750 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
14760 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76 65   routine resolve
14770 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73 65 64  s any names used
14780 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
14790 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75 70  et of the.** sup
147a0 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73 74 61  plied SELECT sta
147b0 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 53  tement. If the S
147c0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
147d0 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64 0a 2a  being resolved.*
147e0 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  * is a sub-selec
147f0 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72 4e 43  t, then pOuterNC
14800 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
14810 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65 78 74   the NameContext
14820 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65   .** of the pare
14830 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69 6e  nt SELECT..*/.in
14840 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52  t sqlite3SelectR
14850 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73 65 20  esolve(.  Parse 
14860 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
14870 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
14880 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
14890 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
148a0 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
148b0 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
148c0 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
148d0 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
148e0 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74 65 72  NC  /* The outer
148f0 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 4d   name context. M
14900 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29  ay be NULL. */.)
14910 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  {.  ExprList *pE
14920 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  List;          /
14930 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f  * Result set. */
14940 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14960 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69 61 62   For-loop variab
14970 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c 74 69  le used in multi
14980 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a 20 20  ple places */.  
14990 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
149a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
149b0 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  cal name-context
149c0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
149d0 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20 20 20  pGroupBy;       
149e0 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20 62 79   /* The group by
149f0 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a   clause */..  /*
14a00 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
14a10 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65 2c   has run before,
14a20 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
14a30 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ely. */.  if( p-
14a40 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b 0a 20  >isResolved ){. 
14a50 20 20 20 61 73 73 65 72 74 28 20 21 70 4f 75 74     assert( !pOut
14a60 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65 74 75  erNC );.    retu
14a70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14a80 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65  }.  p->isResolve
14a90 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  d = 1;..  /* If 
14aa0 74 68 65 72 65 20 68 61 76 65 20 61 6c 72 65 61  there have alrea
14ab0 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73 2c 20  dy been errors, 
14ac0 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20  do nothing. */. 
14ad0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
14ae0 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  r>0 ){.    retur
14af0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
14b00 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72    }..  /* Prepar
14b10 65 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61  e the select sta
14b20 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63 61 6c  tement. This cal
14b30 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65 20  l will allocate 
14b40 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  all cursors.  **
14b50 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e   required to han
14b60 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73 20 61  dle the tables a
14b70 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  nd subqueries in
14b80 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
14b90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65  ..  */.  if( pre
14ba0 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72  pSelectStmt(pPar
14bb0 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65  se, p) ){.    re
14bc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
14bd0 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  R;.  }..  /* Res
14be0 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73 73  olve the express
14bf0 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d 49  ions in the LIMI
14c00 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
14c10 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20 2a 2a  uses. These.  **
14c20 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
14c30 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e 79   to refer to any
14c40 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73 20   names, so pass 
14c50 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f 6e  an empty NameCon
14c60 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  text..  */.  mem
14c70 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
14c80 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
14c90 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
14ca0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
14cb0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
14cc0 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  &sNC, p->pLimit)
14cd0 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ||.      sqlite
14ce0 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
14cf0 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73  s(&sNC, p->pOffs
14d00 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  et) ){.    retur
14d10 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
14d20 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70    }..  /* Set up
14d30 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d   the local name-
14d40 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73 20  context to pass 
14d50 74 6f 20 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  to ExprResolveNa
14d60 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65  mes() to.  ** re
14d70 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73  solve the expres
14d80 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  sion-list..  */.
14d90 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d    sNC.allowAgg =
14da0 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69   1;.  sNC.pSrcLi
14db0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
14dc0 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74  sNC.pNext = pOut
14dd0 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f  erNC;..  /* Reso
14de0 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 65  lve names in the
14df0 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a   result set. */.
14e00 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
14e10 4c 69 73 74 3b 0a 20 20 69 66 28 20 21 70 45 4c  List;.  if( !pEL
14e20 69 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ist ) return SQL
14e30 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72  ITE_ERROR;.  for
14e40 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
14e50 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
14e60 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45 4c 69   Expr *pX = pELi
14e70 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
14e80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
14e90 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
14ea0 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20 20 20  &sNC, pX) ){.   
14eb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14ec0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
14ed0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
14ee0 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67 61 74   are no aggregat
14ef0 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74  e functions in t
14f00 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c 20 61  he result-set, a
14f10 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 0a  nd no GROUP BY .
14f20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c    ** expression,
14f30 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67   do not allow ag
14f40 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e 79 20  gregates in any 
14f50 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65 78 70  of the other exp
14f60 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
14f70 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73 41   assert( !p->isA
14f80 67 67 20 29 3b 0a 20 20 70 47 72 6f 75 70 42 79  gg );.  pGroupBy
14f90 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
14fa0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 7c    if( pGroupBy |
14fb0 7c 20 73 4e 43 2e 68 61 73 41 67 67 20 29 7b 0a  | sNC.hasAgg ){.
14fc0 20 20 20 20 70 2d 3e 69 73 41 67 67 20 3d 20 31      p->isAgg = 1
14fd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
14fe0 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b  NC.allowAgg = 0;
14ff0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20  .  }..  /* If a 
15000 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73  HAVING clause is
15010 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74   present, then t
15020 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 47  here must be a G
15030 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a  ROUP BY clause..
15040 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48    */.  if( p->pH
15050 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f 75 70  aving && !pGroup
15060 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
15070 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15080 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c  , "a GROUP BY cl
15090 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64  ause is required
150a0 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29   before HAVING")
150b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
150c0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
150d0 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 78 70    /* Add the exp
150e0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
150f0 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  the name-context
15100 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e 67 20   before parsing 
15110 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 65  the.  ** other e
15120 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
15130 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
15140 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f 20 74  nt. This is so t
15150 68 61 74 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  hat.  ** express
15160 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52  ions in the WHER
15170 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e 29 20  E clause (etc.) 
15180 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65 78 70  can refer to exp
15190 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20 2a 2a  ressions by.  **
151a0 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68 65 20   aliases in the 
151b0 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2a  result set..  **
151c0 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e  .  ** Minor poin
151d0 74 3a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  t: If this is th
151e0 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
151f0 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c   expression will
15200 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76 61 6c   be.  ** re-eval
15210 75 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 72  uated for each r
15220 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a  eference to it..
15230 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c 69 73    */.  sNC.pELis
15240 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
15250 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
15260 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
15270 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20 7c 7c  C, p->pWhere) ||
15280 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
15290 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
152a0 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  sNC, p->pHaving)
152b0 20 7c 7c 0a 20 20 20 20 20 20 70 72 6f 63 65 73   ||.      proces
152c0 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26 73  sOrderGroupBy(&s
152d0 4e 43 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  NC, p->pOrderBy,
152e0 20 22 4f 52 44 45 52 22 29 20 7c 7c 0a 20 20 20   "ORDER") ||.   
152f0 20 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47     processOrderG
15300 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 47 72  roupBy(&sNC, pGr
15310 6f 75 70 42 79 2c 20 22 47 52 4f 55 50 22 29 0a  oupBy, "GROUP").
15320 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
15330 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
15340 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
15350 65 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  e the GROUP BY c
15360 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 63  lause does not c
15370 6f 6e 74 61 69 6e 20 61 67 67 72 65 67 61 74 65  ontain aggregate
15380 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
15390 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20  .  if( pGroupBy 
153a0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
153b0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
153c0 65 6d 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28 69  em;.  .    for(i
153d0 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  =0, pItem=pGroup
153e0 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70 42  By->a; i<pGroupB
153f0 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  y->nExpr; i++, p
15400 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Item++){.      i
15410 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
15420 74 79 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  ty(pItem->pExpr,
15430 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20   EP_Agg) ){.    
15440 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
15450 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 67 67  Msg(pParse, "agg
15460 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
15470 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
15480 20 69 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20   in ".          
15490 20 20 22 74 68 65 20 47 52 4f 55 50 20 42 59 20    "the GROUP BY 
154a0 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 20 20  clause");.      
154b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
154c0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
154d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
154e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
154f0 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65  ./*.** Reset the
15500 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
15510 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ulator..**.** Th
15520 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
15530 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74  mulator is a set
15540 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
15550 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e   that hold.** in
15560 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
15570 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61  ts while calcula
15580 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74  ting an aggregat
15590 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  e.  This.** rout
155a0 69 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65  ine simply store
155b0 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f  s NULLs in all o
155c0 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63  f those memory c
155d0 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
155e0 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75  void resetAccumu
155f0 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
15600 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
15610 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
15620 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
15630 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
15640 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
15650 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28  nc *pFunc;.  if(
15660 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63   pAggInfo->nFunc
15670 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  +pAggInfo->nColu
15680 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  mn==0 ){.    ret
15690 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  urn;.  }.  for(i
156a0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
156b0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
156c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
156d0 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c  dOp(v, OP_MemNul
156e0 6c 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  l, pAggInfo->aCo
156f0 6c 5b 69 5d 2e 69 4d 65 6d 2c 20 30 29 3b 0a 20  l[i].iMem, 0);. 
15700 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70   }.  for(pFunc=p
15710 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20  AggInfo->aFunc, 
15720 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
15730 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75  >nFunc; i++, pFu
15740 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  nc++){.    sqlit
15750 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
15760 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 46 75 6e 63  P_MemNull, pFunc
15770 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  ->iMem, 0);.    
15780 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  if( pFunc->iDist
15790 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
157a0 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e   Expr *pE = pFun
157b0 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  c->pExpr;.      
157c0 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d 30  if( pE->pList==0
157d0 20 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e   || pE->pList->n
157e0 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
157f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15800 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  sg(pParse, "DIST
15810 49 4e 43 54 20 69 6e 20 61 67 67 72 65 67 61 74  INCT in aggregat
15820 65 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77  e must be follow
15830 65 64 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ed ".           
15840 22 62 79 20 61 6e 20 65 78 70 72 65 73 73 69 6f  "by an expressio
15850 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75  n");.        pFu
15860 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  nc->iDistinct = 
15870 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
15880 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
15890 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79   *pKeyInfo = key
158a0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
158b0 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69  (pParse, pE->pLi
158c0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  st);.        sql
158d0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
158e0 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 70  P_OpenVirtual, p
158f0 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c  Func->iDistinct,
15900 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
15920 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
15930 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
15940 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FF);.      }.   
15950 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
15960 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67  Invoke the OP_Ag
15970 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65  gFinalize opcode
15980 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65   for every aggre
15990 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
159a0 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   in the AggInfo 
159b0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
159c0 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69  atic void finali
159d0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50  zeAggFunctions(P
159e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
159f0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
15a00 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
15a10 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
15a20 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
15a30 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
15a40 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
15a50 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
15a60 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
15a70 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
15a80 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
15a90 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
15aa0 70 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74  pList;.    sqlit
15ab0 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
15ac0 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d  AggFinal, pF->iM
15ad0 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  em, pList ? pLis
15ae0 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 0a 20 20  t->nExpr : 0,.  
15af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b00 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
15b10 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45 46  Func, P3_FUNCDEF
15b20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
15b30 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d  Update the accum
15b40 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65  ulator memory ce
15b50 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65  lls for an aggre
15b60 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  gate based on.**
15b70 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
15b80 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
15b90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64  .static void upd
15ba0 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  ateAccumulator(P
15bb0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
15bc0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
15bd0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
15be0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
15bf0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
15c00 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
15c10 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
15c20 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41  o_col *pC;..  pA
15c30 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
15c40 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  de = 1;.  for(i=
15c50 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
15c60 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
15c70 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
15c80 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  F++){.    int nA
15c90 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  rg;.    int addr
15ca0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 45 78  Next = 0;.    Ex
15cb0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
15cc0 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74  pF->pExpr->pList
15cd0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
15ce0 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
15cf0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
15d00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15d10 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
15d20 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  se, pList);.    
15d30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72  }else{.      nAr
15d40 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
15d50 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e   if( pF->iDistin
15d60 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ct>=0 ){.      a
15d70 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65  ddrNext = sqlite
15d80 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
15d90 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15da0 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20   nArg==1 );.    
15db0 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 76    codeDistinct(v
15dc0 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c  , pF->iDistinct,
15dd0 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 32 29   addrNext, 1, 2)
15de0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15df0 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43  pF->pFunc->needC
15e00 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ollSeq ){.      
15e10 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
15e20 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   0;.      struct
15e30 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
15e40 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pItem;.      int
15e50 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   j;.      assert
15e60 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f  ( pList!=0 );  /
15e70 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46  * pList!=0 if pF
15e80 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c  ->pFunc->needCol
15e90 6c 53 65 71 20 69 73 20 74 72 75 65 20 2a 2f 0a  lSeq is true */.
15ea0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
15eb0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
15ec0 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
15ed0 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
15ee0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
15ef0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
15f00 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
15f10 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
15f20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
15f30 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
15f40 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
15f50 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
15f60 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
15f70 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
15f80 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28  CollSeq, 0, 0, (
15f90 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33  char *)pColl, P3
15fa0 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
15fb0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15fc0 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op3(v, OP_AggSte
15fd0 70 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 6e 41 72  p, pF->iMem, nAr
15fe0 67 2c 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46  g, (void*)pF->pF
15ff0 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45 46 29  unc, P3_FUNCDEF)
16000 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65  ;.    if( addrNe
16010 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  xt ){.      sqli
16020 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
16030 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29  bel(v, addrNext)
16040 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
16050 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
16060 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
16070 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
16080 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
16090 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
160a0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
160b0 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69  pExpr);.    sqli
160c0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
160d0 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 43 2d  OP_MemStore, pC-
160e0 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 20  >iMem, 1);.  }. 
160f0 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
16100 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f  tMode = 0;.}.../
16110 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
16120 64 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  de for the given
16130 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
16140 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  t..**.** The res
16150 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62  ults are distrib
16160 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20  uted in various 
16170 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  ways depending o
16180 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  n the.** value o
16190 66 20 65 44 65 73 74 20 61 6e 64 20 69 50 61 72  f eDest and iPar
161a0 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65  m..**.**     eDe
161b0 73 74 20 56 61 6c 75 65 20 20 20 20 20 20 20 52  st Value       R
161c0 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d  esult.**     ---
161d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
161e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
161f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16200 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
16210 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20  SRT_Callback    
16220 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62  Invoke the callb
16230 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77  ack for each row
16240 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   of the result..
16250 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65  **.**     SRT_Me
16260 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20  m         Store 
16270 66 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20  first result in 
16280 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72  memory cell iPar
16290 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
162a0 53 65 74 20 20 20 20 20 20 20 20 20 53 74 6f 72  Set         Stor
162b0 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79  e results as key
162c0 73 20 6f 66 20 74 61 62 6c 65 20 69 50 61 72 6d  s of table iParm
162d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
162e0 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72  Union       Stor
162f0 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b  e results as a k
16300 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ey in a temporar
16310 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a  y table iParm.**
16320 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65  .**     SRT_Exce
16330 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72  pt      Remove r
16340 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20  esults from the 
16350 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
16360 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
16370 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20   SRT_Table      
16380 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
16390 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
163a0 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68  e iParm.**.** Th
163b0 65 20 74 61 62 6c 65 20 61 62 6f 76 65 20 69 73  e table above is
163c0 20 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64   incomplete.  Ad
163d0 64 69 74 69 6f 6e 61 6c 20 65 44 69 73 74 20 76  ditional eDist v
163e0 61 6c 75 65 20 68 61 76 65 20 62 65 20 61 64 64  alue have be add
163f0 65 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69 73  ed.** since this
16400 20 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72 69   comment was wri
16410 74 74 65 6e 2e 20 20 53 65 65 20 74 68 65 20 73  tten.  See the s
16420 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29  electInnerLoop()
16430 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a   function for.**
16440 20 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74   a complete list
16450 69 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77  ing of the allow
16460 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65  ed values of eDe
16470 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61  st and their mea
16480 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  nings..**.** Thi
16490 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
164a0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
164b0 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
164c0 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
164d0 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
164e0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
164f0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
16500 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
16510 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
16520 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
16530 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
16540 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
16550 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
16560 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
16570 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
16580 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  o that..**.** Th
16590 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e  e pParent, paren
165a0 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65  tTab, and *pPare
165b0 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61 72 65  ntAgg fields are
165c0 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68   filled in if th
165d0 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20  is.** SELECT is 
165e0 61 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69  a subquery.  Thi
165f0 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72  s routine may tr
16600 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69  y to combine thi
16610 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68  s SELECT.** with
16620 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66   its parent to f
16630 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  orm a single fla
16640 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20  t query.  In so 
16650 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a  doing, it might.
16660 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ** change the pa
16670 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20  rent query from 
16680 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  a non-aggregate 
16690 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  to an aggregate 
166a0 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68  query..** For th
166b0 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70  at reason, the p
166c0 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69  ParentAgg flag i
166d0 73 20 70 61 73 73 65 64 20 61 73 20 61 20 70 6f  s passed as a po
166e0 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20  inter, so it.** 
166f0 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  can be changed..
16700 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a  **.** Example 1:
16710 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f     The meaning o
16720 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 61  f the pParent pa
16730 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  rameter..**.**  
16740 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
16750 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20  t1 JOIN (SELECT 
16760 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  x, count(*) FROM
16770 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a   t2) JOIN t3;.**
16780 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20      \           
16790 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
167a0 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
167b0 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a  ____/        /.*
167c0 2a 20 20 20 20 20 5c 20 20 20 20 20 20 20 20 20  *     \         
167d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a               /.*
16800 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  *      \________
16810 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
16820 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
16830 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
16840 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16850 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74   is called for t
16860 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 66  he outer query f
16870 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74  irst.   For that
16880 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e   call,.** pParen
16890 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20  t will be NULL. 
168a0 20 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63   During the proc
168b0 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75  essing of the ou
168c0 74 65 72 20 71 75 65 72 79 2c 20 74 68 69 73 20  ter query, this 
168d0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
168e0 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
168f0 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  y to handle the 
16900 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74  subquery.  For t
16910 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20  he recursive.** 
16920 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69  call, pParent wi
16930 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ll point to the 
16940 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
16950 63 61 75 73 65 20 74 68 65 20 73 75 62 71 75 65  cause the subque
16960 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63  ry is.** the sec
16970 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61  ond element in a
16980 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c   three-way join,
16990 20 74 68 65 20 70 61 72 65 6e 74 54 61 62 20 70   the parentTab p
169a0 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a  arameter will.**
169b0 20 62 65 20 31 20 28 74 68 65 20 32 6e 64 20 76   be 1 (the 2nd v
169c0 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65  alue of a 0-inde
169d0 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69  xed array.).*/.i
169e0 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
169f0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
16a00 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
16a10 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
16a20 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
16a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16a40 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
16a50 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
16a60 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  . */.  int eDest
16a70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
16a80 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
16a90 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  of the results *
16aa0 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20  /.  int iParm,  
16ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
16ac0 70 61 72 61 6d 65 74 65 72 20 75 73 65 64 20 62  parameter used b
16ad0 79 20 74 68 65 20 65 44 65 73 74 20 64 69 73 70  y the eDest disp
16ae0 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
16af0 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74   Select *pParent
16b00 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ,       /* Anoth
16b10 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68  er SELECT for wh
16b20 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73 75  ich this is a su
16b30 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  b-query */.  int
16b40 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20   parentTab,     
16b50 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
16b60 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66  pParent->pSrc of
16b70 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20   this query */. 
16b80 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67   int *pParentAgg
16b90 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ,       /* True 
16ba0 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73 20  if pParent uses 
16bb0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
16bc0 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ons */.  char *a
16bd0 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ff              
16be0 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53  /* If eDest is S
16bf0 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66  RT_Union, the af
16c00 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f  finity string */
16c10 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
16c20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16c30 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
16c40 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
16c50 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74  Info;     /* Ret
16c60 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  urn from sqlite3
16c70 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a  WhereBegin() */.
16c80 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
16c90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16ca0 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
16cb0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
16cc0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  on */.  int isAg
16cd0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
16ce0 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63  * True for selec
16cf0 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f  t lists like "co
16d00 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70  unt(*)" */.  Exp
16d10 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
16d20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63      /* List of c
16d30 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63  olumns to extrac
16d40 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  t. */.  SrcList 
16d50 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f  *pTabList;     /
16d60 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
16d70 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20   to select from 
16d80 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
16d90 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
16da0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
16db0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
16dc0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
16dd0 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  derBy;    /* The
16de0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
16df0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
16e00 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
16e10 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68  roupBy;    /* Th
16e20 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
16e30 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
16e40 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
16e50 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng;         /* T
16e60 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
16e70 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
16e80 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e  /.  int isDistin
16e90 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ct;        /* Tr
16ea0 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
16eb0 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
16ec0 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64  esent */.  int d
16ed0 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
16ee0 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73    /* Table to us
16ef0 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
16f00 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  ct set */.  int 
16f10 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
16f20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
16f30 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
16f40 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  function */.  in
16f50 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b  t addrSortIndex;
16f60 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
16f70 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 56 69 72  of an OP_OpenVir
16f80 74 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  tual instruction
16f90 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41   */.  AggInfo sA
16fa0 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20  ggInfo;      /* 
16fb0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  Information used
16fc0 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75   by aggregate qu
16fd0 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  eries */.  int i
16fe0 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
16ff0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
17000 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71  the end of the q
17010 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70  uery */..  if( p
17020 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61  ==0 || sqlite3Ma
17030 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 7c 7c 20  llocFailed() || 
17040 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
17050 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
17060 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
17070 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
17080 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
17090 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
170a0 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n 1;.  memset(&s
170b0 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  AggInfo, 0, size
170c0 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a  of(sAggInfo));..
170d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
170e0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
170f0 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  ECT.  /* If ther
17100 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65  e is are a seque
17110 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20  nce of queries, 
17120 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f  do the earlier o
17130 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a  nes first..  */.
17140 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
17150 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52  ){.    if( p->pR
17160 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20  ightmost==0 ){. 
17170 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f       Select *pLo
17180 6f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c  op;.      for(pL
17190 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
171a0 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
171b0 72 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  r){.        pLoo
171c0 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  p->pRightmost = 
171d0 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
171e0 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
171f0 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
17200 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  p, eDest, iParm,
17210 20 61 66 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69   aff);.  }.#endi
17220 66 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  f..  pOrderBy = 
17230 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
17240 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
17250 72 62 79 28 65 44 65 73 74 29 20 29 7b 0a 20 20  rby(eDest) ){.  
17260 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
17270 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
17280 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
17290 65 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 20  e(pParse, p, 0) 
172a0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
172b0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d  ct_end;.  }.  p-
172c0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
172d0 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  erBy;..  /* Make
172e0 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66   local copies of
172f0 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   the parameters 
17300 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a  for this query..
17310 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20    */.  pTabList 
17320 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68  = p->pSrc;.  pWh
17330 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
17340 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
17350 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
17360 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
17370 67 3b 0a 20 20 69 73 41 67 67 20 3d 20 70 2d 3e  g;.  isAgg = p->
17380 69 73 41 67 67 3b 0a 20 20 69 73 44 69 73 74 69  isAgg;.  isDisti
17390 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
173a0 6e 63 74 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  nct;.  pEList = 
173b0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
173c0 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74   pEList==0 ) got
173d0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
173e0 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74   /* .  ** Do not
173f0 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f   even attempt to
17400 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f   generate any co
17410 64 65 20 69 66 20 77 65 20 68 61 76 65 20 61 6c  de if we have al
17420 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20  ready seen.  ** 
17430 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68  errors before th
17440 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74  is routine start
17450 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  s..  */.  if( pP
17460 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67  arse->nErr>0 ) g
17470 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
17480 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
17490 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
174a0 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
174b0 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
174c0 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
174d0 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66  output..  */.#if
174e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
174f0 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
17500 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20  (eDest==SRT_Mem 
17510 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65  || eDest==SRT_Se
17520 74 29 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  t) && pEList->nE
17530 78 70 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  xpr>1 ){.    sql
17540 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17550 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e  rse, "only a sin
17560 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77  gle result allow
17570 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20  ed for ".       
17580 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  "a SELECT that i
17590 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
175a0 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67  ression");.    g
175b0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
175c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
175d0 20 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e   ORDER BY is ign
175e0 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65  ored for some de
175f0 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  stinations..  */
17600 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65  .  if( Ignorable
17610 4f 72 64 65 72 62 79 28 65 44 65 73 74 29 20 29  Orderby(eDest) )
17620 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d  {.    pOrderBy =
17630 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   0;.  }..  /* Be
17640 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63  gin generating c
17650 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ode..  */.  v = 
17660 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
17670 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
17680 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
17690 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  _end;..  /* Gene
176a0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
176b0 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e  l sub-queries in
176c0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
176d0 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
176e0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
176f0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
17700 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
17710 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30  _VIEW).  for(i=0
17720 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
17730 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  rc; i++){.    co
17740 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64  nst char *zSaved
17750 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b  AuthContext = 0;
17760 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 52 65 73  .    int needRes
17770 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 20 20 20  toreContext;.   
17780 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
17790 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
177a0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 0a  TabList->a[i];..
177b0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
177c0 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 49 74  Select==0 || pIt
177d0 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20  em->isPopulated 
177e0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
177f0 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  if( pItem->zName
17800 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61  !=0 ){.      zSa
17810 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
17820 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
17830 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61  ntext;.      pPa
17840 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
17850 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  t = pItem->zName
17860 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74  ;.      needRest
17870 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a  oreContext = 1;.
17880 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17890 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
178a0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
178b0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
178c0 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
178d0 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 56 69 72  pSelect, SRT_Vir
178e0 74 75 61 6c 54 61 62 2c 20 0a 20 20 20 20 20 20  tualTab, .      
178f0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
17900 2d 3e 69 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c  ->iCursor, p, i,
17910 20 26 69 73 41 67 67 2c 20 30 29 3b 0a 20 20 20   &isAgg, 0);.   
17920 20 69 66 28 20 6e 65 65 64 52 65 73 74 6f 72 65   if( needRestore
17930 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20 20 20  Context ){.     
17940 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
17950 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
17960 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d  thContext;.    }
17970 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
17980 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57 68  p->pSrc;.    pWh
17990 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
179a0 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61  .    if( !Ignora
179b0 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65 73 74  bleOrderby(eDest
179c0 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65  ) ){.      pOrde
179d0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
179e0 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72  y;.    }.    pGr
179f0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
17a00 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67  pBy;.    pHaving
17a10 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
17a20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20     isDistinct = 
17a30 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20  p->isDistinct;. 
17a40 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
17a50 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70  Check for the sp
17a60 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
17a70 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66  min() or max() f
17a80 75 6e 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c  unction by itsel
17a90 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65  f.  ** in the re
17aa0 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  sult set..  */. 
17ab0 20 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61   if( simpleMinMa
17ac0 78 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  xQuery(pParse, p
17ad0 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20  , eDest, iParm) 
17ae0 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  ){.    rc = 0;. 
17af0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
17b00 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  nd;.  }..  /* Ch
17b10 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
17b20 69 73 20 69 73 20 61 20 73 75 62 71 75 65 72 79  is is a subquery
17b30 20 74 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c   that can be "fl
17b40 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74  attened" into it
17b50 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49  s parent..  ** I
17b60 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
17b70 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f  a possiblity, do
17b80 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69   so and return i
17b90 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20  mmediately.  .  
17ba0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
17bb0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
17bc0 28 20 70 50 61 72 65 6e 74 20 26 26 20 70 50 61  ( pParent && pPa
17bd0 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20  rentAgg &&.     
17be0 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
17bf0 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
17c00 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67  Tab, *pParentAgg
17c10 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  , isAgg) ){.    
17c20 69 66 28 20 69 73 41 67 67 20 29 20 2a 70 50 61  if( isAgg ) *pPa
17c30 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20  rentAgg = 1;.   
17c40 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
17c50 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
17c60 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
17c70 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
17c80 65 2c 20 72 65 73 6f 6c 76 65 20 61 6e 79 20 63  e, resolve any c
17c90 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
17ca0 65 73 0a 20 20 2a 2a 20 6e 61 6d 65 73 20 74 68  es.  ** names th
17cb0 61 74 20 68 61 76 65 20 62 65 65 6e 20 65 78 70  at have been exp
17cc0 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65  licitly specifie
17cd0 64 20 61 6e 64 20 63 72 65 61 74 65 20 61 20 73  d and create a s
17ce0 6f 72 74 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20  orting index..  
17cf0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 6f 72  **.  ** This sor
17d00 74 69 6e 67 20 69 6e 64 65 78 20 6d 69 67 68 74  ting index might
17d10 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e   end up being un
17d20 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61  used if the data
17d30 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78   can be .  ** ex
17d40 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73  tracted in pre-s
17d50 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66  orted order.  If
17d60 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
17d70 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  e, then the.  **
17d80 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 20   OP_OpenVirtual 
17d90 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c  instruction will
17da0 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61   be changed to a
17db0 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20  n OP_Noop once. 
17dc0 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75   ** we figure ou
17dd0 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69  t that the sorti
17de0 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  ng index is not 
17df0 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61 64 64  needed.  The add
17e00 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20  rSortIndex.  ** 
17e10 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
17e20 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74   to facilitate t
17e30 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f  hat change..  */
17e40 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
17e50 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
17e60 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65  prList_item *pTe
17e70 72 6d 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20  rm;.    KeyInfo 
17e80 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 66  *pKeyInfo;.    f
17e90 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 4f  or(i=0, pTerm=pO
17ea0 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72  rderBy->a; i<pOr
17eb0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
17ec0 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
17ed0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 7a 4e     if( pTerm->zN
17ee0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ame ){.        p
17ef0 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f  Term->pExpr->pCo
17f00 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ll = sqlite3Loca
17f10 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
17f20 2c 20 70 54 65 72 6d 2d 3e 7a 4e 61 6d 65 2c 20  , pTerm->zName, 
17f30 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
17f40 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 73   }.    if( pPars
17f50 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20  e->nErr ){.     
17f60 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
17f70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79  ;.    }.    pKey
17f80 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
17f90 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
17fa0 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  e, pOrderBy);.  
17fb0 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
17fc0 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
17fd0 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64  Tab++;.    p->ad
17fe0 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20 3d 20  drOpenVirt[2] = 
17ff0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
18000 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18010 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
18020 56 69 72 74 75 61 6c 2c 20 70 4f 72 64 65 72 42  Virtual, pOrderB
18030 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72  y->iECursor, pOr
18040 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20  derBy->nExpr+2, 
18050 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18060 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
18070 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  pKeyInfo, P3_KEY
18080 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
18090 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
180a0 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a  SortIndex = -1;.
180b0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
180c0 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a  e limiter..  */.
180d0 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33    iEnd = sqlite3
180e0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
180f0 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
18100 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
18110 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f  , p, iEnd);..  /
18120 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
18130 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
18140 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
18150 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
18160 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
18170 44 65 73 74 3d 3d 53 52 54 5f 56 69 72 74 75 61  Dest==SRT_Virtua
18180 6c 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  lTab ){.    sqli
18190 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
181a0 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20  OP_OpenVirtual, 
181b0 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  iParm, pEList->n
181c0 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
181d0 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20   Open a virtual 
181e0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
181f0 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
18200 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  t..  */.  if( is
18210 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
18220 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
18230 6f 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  o;.    distinct 
18240 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
18250 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
18260 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
18270 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  List(pParse, p->
18280 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
18290 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
182a0 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 64  P_OpenVirtual, d
182b0 69 73 74 69 6e 63 74 2c 20 30 2c 20 0a 20 20 20  istinct, 0, .   
182c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182d0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
182e0 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
182f0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c  _HANDOFF);.  }el
18300 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74  se{.    distinct
18310 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
18320 20 41 67 67 72 65 67 61 74 65 20 61 6e 64 20 6e   Aggregate and n
18330 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
18340 72 69 65 73 20 61 72 65 20 68 61 6e 64 6c 65 64  ries are handled
18350 20 64 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a   differently */.
18360 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20    if( !isAgg && 
18370 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
18380 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
18390 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67 72 65  is for non-aggre
183a0 67 61 74 65 20 71 75 65 72 69 65 73 0a 20 20 20  gate queries.   
183b0 20 2a 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   ** Begin the da
183c0 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 20 20  tabase scan.    
183d0 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  */.    pWInfo = 
183e0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
183f0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
18400 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4f 72  st, pWhere, &pOr
18410 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
18420 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
18430 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
18440 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20    /* If sorting 
18450 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63  index that was c
18460 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  reated by a prio
18470 72 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c  r OP_OpenVirtual
18480 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63   .    ** instruc
18490 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f  tion ended up no
184a0 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20  t being needed, 
184b0 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20  then change the 
184c0 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 0a 20  OP_OpenVirtual. 
184d0 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50     ** into an OP
184e0 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Noop..    */.  
184f0 20 20 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e    if( addrSortIn
18500 64 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72  dex>=0 && pOrder
18510 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  By==0 ){.      u
18520 6e 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e  ncreateSortingIn
18530 64 65 78 28 70 50 61 72 73 65 2c 20 61 64 64 72  dex(pParse, addr
18540 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20  SortIndex);.    
18550 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72    p->addrOpenVir
18560 74 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  t[2] = -1;.    }
18570 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
18580 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
18590 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20  loop.    */.    
185a0 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  if( selectInnerL
185b0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
185c0 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
185d0 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c  derBy, distinct,
185e0 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   eDest,.        
185f0 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 72              iPar
18600 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74  m, pWInfo->iCont
18610 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  inue, pWInfo->iB
18620 72 65 61 6b 2c 20 61 66 66 29 20 29 7b 0a 20 20  reak, aff) ){.  
18630 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
18640 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _end;.    }..   
18650 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
18660 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a  base scan loop..
18670 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
18680 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
18690 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
186a0 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
186b0 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  processing for a
186c0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
186d0 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
186e0 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e  ext sNC;    /* N
186f0 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
18700 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
18710 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  gate information
18720 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65   */.    int iAMe
18730 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
18740 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
18750 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72   for storing cur
18760 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f  rent GROUP BY */
18770 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20  .    int iBMem; 
18780 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
18790 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
187a0 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50  r previous GROUP
187b0 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
187c0 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  UseFlag;       /
187d0 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f  * Mem address ho
187e0 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63  lding flag indic
187f0 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65  ating that at le
18800 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ast.            
18810 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
18820 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e  ne row of the in
18830 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  put to the aggre
18840 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20  gator has been. 
18850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18860 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
18870 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  sed */.    int i
18880 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f  AbortFlag;     /
18890 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68  * Mem address wh
188a0 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79  ich causes query
188b0 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69   abort if positi
188c0 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72  ve */.    int gr
188d0 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a  oupBySort;    /*
188e0 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20   Rows come from 
188f0 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20  source in GROUP 
18900 42 59 20 6f 72 64 65 72 20 2a 2f 0a 0a 0a 20 20  BY order */...  
18910 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
18920 6e 67 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  ng variables hol
18930 64 20 61 64 64 72 65 73 73 65 73 20 6f 72 20 6c  d addresses or l
18940 61 62 65 6c 73 20 66 6f 72 20 70 61 72 74 73 20  abels for parts 
18950 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 69  of the.    ** vi
18960 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 70 72  rtual machine pr
18970 6f 67 72 61 6d 20 77 65 20 61 72 65 20 70 75 74  ogram we are put
18980 74 69 6e 67 20 74 6f 67 65 74 68 65 72 20 2a 2f  ting together */
18990 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74  .    int addrOut
189a0 70 75 74 52 6f 77 3b 20 20 20 20 20 20 2f 2a 20  putRow;      /* 
189b0 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74  Start of subrout
189c0 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
189d0 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
189e0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74  .    int addrSet
189f0 41 62 6f 72 74 3b 20 20 20 20 20 20 20 2f 2a 20  Abort;       /* 
18a00 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c  Set the abort fl
18a10 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  ag and return */
18a20 0a 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e 69  .    int addrIni
18a30 74 69 61 6c 69 7a 65 4c 6f 6f 70 3b 20 2f 2a 20  tializeLoop; /* 
18a40 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20 74 68  Start of code th
18a50 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74  at initializes t
18a60 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
18a70 0a 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70  .    int addrTop
18a80 4f 66 4c 6f 6f 70 3b 20 20 20 20 20 20 2f 2a 20  OfLoop;      /* 
18a90 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
18aa0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74   loop */.    int
18ab0 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e   addrGroupByChan
18ac0 67 65 3b 20 20 2f 2a 20 43 6f 64 65 20 74 68 61  ge;  /* Code tha
18ad0 74 20 72 75 6e 73 20 77 68 65 6e 20 61 6e 79 20  t runs when any 
18ae0 47 52 4f 55 50 20 42 59 20 74 65 72 6d 20 63 68  GROUP BY term ch
18af0 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  anges */.    int
18b00 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77 3b   addrProcessRow;
18b10 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20       /* Code to 
18b20 70 72 6f 63 65 73 73 20 61 20 73 69 6e 67 6c 65  process a single
18b30 20 69 6e 70 75 74 20 72 6f 77 20 2a 2f 0a 20 20   input row */.  
18b40 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20    int addrEnd;  
18b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
18b60 20 6f 66 20 61 6c 6c 20 70 72 6f 63 65 73 73 69   of all processi
18b70 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  ng */.    int ad
18b80 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 20 20  drSortingIdx;   
18b90 20 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e    /* The OP_Open
18ba0 56 69 72 74 75 61 6c 20 66 6f 72 20 74 68 65 20  Virtual for the 
18bb0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f  sorting index */
18bc0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73  .    int addrRes
18bd0 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
18be0 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72  Subroutine for r
18bf0 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63  esetting the acc
18c00 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 0a 20 20 20  umulator */..   
18c10 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74   addrEnd = sqlit
18c20 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
18c30 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76  v);..    /* Conv
18c40 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  ert TK_COLUMN no
18c50 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f  des into TK_AGG_
18c60 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20  COLUMN and make 
18c70 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a  entries in.    *
18c80 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61  * sAggInfo for a
18c90 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  ll TK_AGG_FUNCTI
18ca0 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72  ON nodes in expr
18cb0 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20  essions of the. 
18cc0 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61     ** SELECT sta
18cd0 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  tement..    */. 
18ce0 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
18cf0 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
18d00 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20  .    sNC.pParse 
18d10 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e  = pParse;.    sN
18d20 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
18d30 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70  bList;.    sNC.p
18d40 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49  AggInfo = &sAggI
18d50 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  nfo;.    sAggInf
18d60 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
18d70 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47   = pGroupBy ? pG
18d80 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20  roupBy->nExpr+1 
18d90 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  : 0;.    sAggInf
18da0 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  o.pGroupBy = pGr
18db0 6f 75 70 42 79 3b 0a 20 20 20 20 69 66 28 20 73  oupBy;.    if( s
18dc0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
18dd0 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
18de0 45 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  EList) ){.      
18df0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
18e00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
18e10 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
18e20 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
18e30 4f 72 64 65 72 42 79 29 20 29 7b 0a 20 20 20 20  OrderBy) ){.    
18e40 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
18e50 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
18e60 20 70 48 61 76 69 6e 67 20 26 26 20 73 71 6c 69   pHaving && sqli
18e70 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
18e80 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70  gregates(&sNC, p
18e90 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20  Having) ){.     
18ea0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
18eb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67  ;.    }.    sAgg
18ec0 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f  Info.nAccumulato
18ed0 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  r = sAggInfo.nCo
18ee0 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  lumn;.    for(i=
18ef0 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46  0; i<sAggInfo.nF
18f00 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unc; i++){.     
18f10 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
18f20 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
18f30 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  sNC, sAggInfo.aF
18f40 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 4c  unc[i].pExpr->pL
18f50 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
18f60 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
18f70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18f80 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61     if( sqlite3Ma
18f90 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20 67  llocFailed() ) g
18fa0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
18fb0 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69  .    /* Processi
18fc0 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
18fd0 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20  s with GROUP BY 
18fe0 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e  is very differen
18ff0 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63  t and.    ** muc
19000 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74  h more complex t
19010 68 61 20 61 67 67 72 65 67 61 74 65 73 20 77 69  ha aggregates wi
19020 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59  thout a GROUP BY
19030 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
19040 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
19050 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
19060 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67  Info;  /* Keying
19070 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
19080 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c   the group by cl
19090 61 75 73 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  ause */..      /
190a0 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20  * Create labels 
190b0 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
190c0 6e 65 65 64 69 6e 67 0a 20 20 20 20 20 20 2a 2f  needing.      */
190d0 0a 20 20 20 20 20 0a 20 20 20 20 20 20 61 64 64  .     .      add
190e0 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 20  rInitializeLoop 
190f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
19100 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
19110 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e   addrGroupByChan
19120 67 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ge = sqlite3Vdbe
19130 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
19140 20 20 20 20 61 64 64 72 50 72 6f 63 65 73 73 52      addrProcessR
19150 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
19160 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
19170 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
19180 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63   is a GROUP BY c
19190 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e  lause we might n
191a0 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  eed a sorting in
191b0 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  dex to.      ** 
191c0 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41  implement it.  A
191d0 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72  llocate that sor
191e0 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20  ting index now. 
191f0 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74   If it turns out
19200 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
19210 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74  e do not need it
19220 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20   after all, the 
19230 4f 70 65 6e 56 69 72 74 75 61 6c 20 69 6e 73 74  OpenVirtual inst
19240 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ruction.      **
19250 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
19260 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20  ed into a Noop. 
19270 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
19280 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
19290 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gIdx = pParse->n
192a0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65  Tab++;.      pKe
192b0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
192c0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
192d0 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20  se, pGroupBy);. 
192e0 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
192f0 49 64 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20  Idx =.          
19300 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
19310 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c  , OP_OpenVirtual
19320 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
19330 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20  ngIdx,.         
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19350 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
19360 67 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  gColumn,.       
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
19390 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P3_KEYINFO_HA
193a0 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f  NDOFF);..      /
193b0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d  * Initialize mem
193c0 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73  ory locations us
193d0 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61  ed by GROUP BY a
193e0 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73  ggregate process
193f0 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ing.      */.   
19400 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 70 50     iUseFlag = pP
19410 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
19420 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d      iAbortFlag =
19430 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
19440 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70  .      iAMem = p
19450 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
19460 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
19470 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
19480 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20  pr;.      iBMem 
19490 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
194a0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
194b0 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
194c0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
194d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
194e0 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69   OP_MemInt, 0, i
194f0 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
19500 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
19510 2c 20 22 23 20 63 6c 65 61 72 20 61 62 6f 72 74  , "# clear abort
19520 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
19530 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19540 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30  (v, OP_MemInt, 0
19550 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
19560 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
19570 76 2c 20 22 23 20 69 6e 64 69 63 61 74 65 20 61  v, "# indicate a
19580 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79  ccumulator empty
19590 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
195a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
195b0 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 49  P_Goto, 0, addrI
195c0 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a  nitializeLoop);.
195d0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
195e0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
195f0 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73  that outputs a s
19600 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
19610 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
19620 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72   set.  This subr
19630 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f  outine first loo
19640 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c  ks at the iUseFl
19650 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67  ag.  If iUseFlag
19660 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73  .      ** is les
19670 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
19680 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62  to zero, the sub
19690 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
196a0 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a  op.  If.      **
196b0 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
196c0 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75  calls for the qu
196d0 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68  ery to abort, th
196e0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  is subroutine.  
196f0 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74      ** increment
19700 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67  s the iAbortFlag
19710 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
19720 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
19730 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  g in.      ** or
19740 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  der to signal th
19750 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72  e caller to abor
19760 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
19770 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d    addrSetAbort =
19780 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
19790 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
197a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
197b0 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c  Op(v, OP_MemInt,
197c0 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   1, iAbortFlag);
197d0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
197e0 6e 74 28 28 76 2c 20 22 23 20 73 65 74 20 61 62  nt((v, "# set ab
197f0 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
19800 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19810 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  dOp(v, OP_Return
19820 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  , 0, 0);.      a
19830 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
19840 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
19850 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
19860 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19870 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c  (v, OP_IfMemPos,
19880 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f   iUseFlag, addrO
19890 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20  utputRow+2);.   
198a0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
198b0 76 2c 20 22 23 20 47 72 6f 75 70 62 79 20 72 65  v, "# Groupby re
198c0 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65  sult generator e
198d0 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20  ntry point"));. 
198e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
198f0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75  AddOp(v, OP_Retu
19900 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rn, 0, 0);.     
19910 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
19920 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
19930 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
19940 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
19950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
19960 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
19970 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f  , pHaving, addrO
19980 75 74 70 75 74 52 6f 77 2b 31 2c 20 31 29 3b 0a  utputRow+1, 1);.
19990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
199a0 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f   = selectInnerLo
199b0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
199c0 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70  >pEList, 0, 0, p
199d0 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199f0 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20 65 44      distinct, eD
19a00 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20  est, iParm, .   
19a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70          addrOutp
19a30 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74  utRow+1, addrSet
19a40 41 62 6f 72 74 2c 20 61 66 66 29 3b 0a 20 20 20  Abort, aff);.   
19a50 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
19a60 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
19a70 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
19a80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19a90 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72  ddOp(v, OP_Retur
19aa0 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
19ab0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
19ac0 22 23 20 65 6e 64 20 67 72 6f 75 70 62 79 20 72  "# end groupby r
19ad0 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22  esult generator"
19ae0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  ));..      /* Ge
19af0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
19b00 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
19b10 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79  set the group-by
19b20 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20   accumulator.   
19b30 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
19b40 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56  Reset = sqlite3V
19b50 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
19b60 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  );.      resetAc
19b70 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
19b80 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
19b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19ba0 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72  ddOp(v, OP_Retur
19bb0 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20  n, 0, 0);..     
19bc0 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70   /* Begin a loop
19bd0 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
19be0 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f  ct all source ro
19bf0 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ws in GROUP BY o
19c00 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rder..      ** T
19c10 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76  his might involv
19c20 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c  e two separate l
19c30 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f  oops with an OP_
19c40 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c  Sort in between,
19c50 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   or.      ** it 
19c60 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c  might be a singl
19c70 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73  e loop that uses
19c80 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74   an index to ext
19c90 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ract information
19ca0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
19cb0 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20   right order to 
19cc0 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20  begin with..    
19cd0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
19ce0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
19cf0 65 6c 28 76 2c 20 61 64 64 72 49 6e 69 74 69 61  el(v, addrInitia
19d00 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  lizeLoop);.     
19d10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19d20 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
19d30 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
19d40 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
19d50 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
19d60 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
19d70 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70   pWhere, &pGroup
19d80 42 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  By);.      if( p
19d90 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
19da0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
19db0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d    if( pGroupBy==
19dc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
19dd0 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
19de0 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
19df0 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
19e00 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
19e10 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
19e20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
19e30 68 65 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  he OP_OpenVirtua
19e40 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a  l table will be.
19e50 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65          ** cance
19e60 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75  lled later becau
19e70 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  se we still need
19e80 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79   to use the pKey
19e90 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a  Info.        */.
19ea0 20 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79          pGroupBy
19eb0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
19ec0 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
19ed0 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ort = 0;.      }
19ee0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
19ef0 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67   Rows are coming
19f00 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d   out in undeterm
19f10 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20  ined order.  We 
19f20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20  have to push.   
19f30 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77       ** each row
19f40 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20   into a sorting 
19f50 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65  index, terminate
19f60 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c   the first loop,
19f70 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
19f80 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73   loop over the s
19f90 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20  orting index in 
19fa0 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
19fb0 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20   output.        
19fc0 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ** in sorted ord
19fd0 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  er.        */.  
19fe0 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
19ff0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  t = 1;.        s
1a000 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
1a010 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1a020 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
1a030 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a040 4f 70 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  Op(v, OP_Sequenc
1a050 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  e, sAggInfo.sort
1a060 69 6e 67 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  ingIdx, 0);.    
1a070 20 20 20 20 6a 20 3d 20 70 47 72 6f 75 70 42 79      j = pGroupBy
1a080 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 20  ->nExpr+1;.     
1a090 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
1a0a0 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
1a0b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1a0c0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
1a0d0 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67  ol *pCol = &sAgg
1a0e0 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20  Info.aCol[i];.  
1a0f0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
1a100 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
1a110 6a 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  j ) continue;.  
1a120 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
1a130 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
1a140 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1a150 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1a160 50 5f 52 6f 77 69 64 2c 20 70 43 6f 6c 2d 3e 69  P_Rowid, pCol->i
1a170 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
1a180 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a190 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1a1a0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
1a1b0 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61  olumn, pCol->iTa
1a1c0 62 6c 65 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75  ble, pCol->iColu
1a1d0 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  mn);.          }
1a1e0 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a  .          j++;.
1a1f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a200 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a210 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
1a220 6f 72 64 2c 20 6a 2c 20 30 29 3b 0a 20 20 20 20  ord, j, 0);.    
1a230 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a240 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
1a250 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  sert, sAggInfo.s
1a260 6f 72 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a 20  ortingIdx, 0);. 
1a270 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
1a280 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
1a290 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1a2a0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
1a2b0 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
1a2c0 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
1a2d0 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
1a2e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 47  Comment((v, "# G
1a2f0 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b  ROUP BY sort"));
1a300 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
1a310 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  o.useSortingIdx 
1a320 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 1;.      }..  
1a330 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
1a340 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
1a350 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73  P BY terms and s
1a360 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20  tore in b0, b1, 
1a370 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28  b2....      ** (
1a380 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63  b0 is memory loc
1a390 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62  ation iBMem+0, b
1a3a0 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e  1 is iBMem+1, an
1a3b0 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20  d so forth).    
1a3c0 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72    ** Then compar
1a3d0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
1a3e0 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61  OUP BY terms aga
1a3f0 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42  inst the GROUP B
1a400 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a  Y terms.      **
1a410 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
1a420 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  us row currently
1a430 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61   stored in a0, a
1a440 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, a2....      *
1a450 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f  /.      addrTopO
1a460 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
1a470 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1a480 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
1a490 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; j<pGroupBy->nE
1a4a0 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
1a4b0 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
1a4c0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rt ){.          
1a4d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a4e0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
1a4f0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
1a500 64 78 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20  dx, j);.        
1a510 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1a520 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74   sAggInfo.direct
1a530 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Mode = 1;.      
1a540 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1a550 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ode(pParse, pGro
1a560 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  upBy->a[j].pExpr
1a570 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1a580 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a590 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
1a5a0 74 6f 72 65 2c 20 69 42 4d 65 6d 2b 6a 2c 20 6a  tore, iBMem+j, j
1a5b0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
1a5c0 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
1a5d0 20 20 20 66 6f 72 28 6a 3d 70 47 72 6f 75 70 42     for(j=pGroupB
1a5e0 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 6a 3e 3d 30  y->nExpr-1; j>=0
1a5f0 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  ; j--){.        
1a600 69 66 28 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  if( j<pGroupBy->
1a610 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20  nExpr-1 ){.     
1a620 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a630 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
1a640 6f 61 64 2c 20 69 42 4d 65 6d 2b 6a 2c 20 30 29  oad, iBMem+j, 0)
1a650 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a660 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a670 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
1a680 61 64 2c 20 69 41 4d 65 6d 2b 6a 2c 20 30 29 3b  ad, iAMem+j, 0);
1a690 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  .        if( j==
1a6a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
1a6b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1a6c0 76 2c 20 4f 50 5f 45 71 2c 20 30 78 32 30 30 2c  v, OP_Eq, 0x200,
1a6d0 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77 29   addrProcessRow)
1a6e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1a6f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1a700 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1a710 50 5f 4e 65 2c 20 30 78 32 30 30 2c 20 61 64 64  P_Ne, 0x200, add
1a720 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29 3b  rGroupByChange);
1a730 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a740 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1a750 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 76  angeP3(v, -1, (v
1a760 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2d 3e 61  oid*)pKeyInfo->a
1a770 43 6f 6c 6c 5b 6a 5d 2c 20 50 33 5f 43 4f 4c 4c  Coll[j], P3_COLL
1a780 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  SEQ);.      }.. 
1a790 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
1a7a0 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
1a7b0 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f  whenever the GRO
1a7c0 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20  UP BY changes.. 
1a7d0 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 20 69       ** Change i
1a7e0 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  n the GROUP BY a
1a7f0 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74  re detected by t
1a800 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
1a810 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e  .      ** block.
1a820 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20    If there were 
1a830 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73  no changes, this
1a840 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65   block is skippe
1a850 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
1a860 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63    ** This code c
1a870 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72  opies current gr
1a880 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20  oup by terms in 
1a890 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20  b0,b1,b2,....   
1a8a0 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30     ** over to a0
1a8b0 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e  ,a1,a2.  It then
1a8c0 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75   calls the outpu
1a8d0 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  t subroutine.   
1a8e0 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73     ** and resets
1a8f0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
1a900 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
1a910 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74  ters in preparat
1a920 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  ion.      ** for
1a930 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20   the next GROUP 
1a940 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20  BY batch..      
1a950 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1a960 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1a970 28 76 2c 20 61 64 64 72 47 72 6f 75 70 42 79 43  (v, addrGroupByC
1a980 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 66 6f  hange);.      fo
1a990 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
1a9a0 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
1a9b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1a9c0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
1a9d0 65 6d 4d 6f 76 65 2c 20 69 41 4d 65 6d 2b 6a 2c  emMove, iAMem+j,
1a9e0 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
1a9f0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1aa00 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1aa10 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 4f 75  Gosub, 0, addrOu
1aa20 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
1aa30 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1aa40 22 23 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  "# output one ro
1aa50 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  w"));.      sqli
1aa60 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1aa70 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 41 62  OP_IfMemPos, iAb
1aa80 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64  ortFlag, addrEnd
1aa90 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1aaa0 6d 65 6e 74 28 28 76 2c 20 22 23 20 63 68 65 63  ment((v, "# chec
1aab0 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  k abort flag"));
1aac0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1aad0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
1aae0 73 75 62 2c 20 30 2c 20 61 64 64 72 52 65 73 65  sub, 0, addrRese
1aaf0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
1ab00 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 72 65 73  mment((v, "# res
1ab10 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  et accumulator")
1ab20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
1ab30 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ate the aggregat
1ab40 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62  e accumulators b
1ab50 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
1ab60 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ent of.      ** 
1ab70 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a  the current row.
1ab80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
1ab90 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1aba0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 50 72  eLabel(v, addrPr
1abb0 6f 63 65 73 73 52 6f 77 29 3b 0a 20 20 20 20 20  ocessRow);.     
1abc0 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
1abd0 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
1abe0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
1abf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1ac00 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 69   OP_MemInt, 1, i
1ac10 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
1ac20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1ac30 22 23 20 69 6e 64 69 63 61 74 65 20 64 61 74 61  "# indicate data
1ac40 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22   in accumulator"
1ac50 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  ));..      /* En
1ac60 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  d of the loop.  
1ac70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1ac80 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
1ac90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1aca0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
1acb0 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ext, sAggInfo.so
1acc0 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f  rtingIdx, addrTo
1acd0 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  pOfLoop);.      
1ace0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1acf0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
1ad00 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
1ad10 75 6e 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49  uncreateSortingI
1ad20 6e 64 65 78 28 70 50 61 72 73 65 2c 20 61 64 64  ndex(pParse, add
1ad30 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20  rSortingIdx);.  
1ad40 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1ad50 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c  Output the final
1ad60 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20   row of result. 
1ad70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
1ad80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1ad90 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61  , OP_Gosub, 0, a
1ada0 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
1adb0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1adc0 28 28 76 2c 20 22 23 20 6f 75 74 70 75 74 20 66  ((v, "# output f
1add0 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 20 20 20  inal row"));.   
1ade0 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64     .    } /* end
1adf0 69 66 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20  if pGroupBy */. 
1ae00 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20     else {.      
1ae10 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e  /* This case run
1ae20 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61  s if the aggrega
1ae30 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20  te has no GROUP 
1ae40 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a  BY clause.  The.
1ae50 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
1ae60 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70  ing is much simp
1ae70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20  ler since there 
1ae80 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  is only a single
1ae90 20 72 6f 77 0a 20 20 20 20 20 20 2a 2a 20 6f 66   row.      ** of
1aea0 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a   output..      *
1aeb0 2f 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  /.      resetAcc
1aec0 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
1aed0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
1aee0 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
1aef0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
1af00 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
1af10 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
1af20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
1af30 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1af40 64 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41  d;.      updateA
1af50 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
1af60 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
1af70 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
1af80 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
1af90 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
1afa0 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
1afb0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
1afc0 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
1afd0 0a 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69  .      if( pHavi
1afe0 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ng ){.        sq
1aff0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1b000 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
1b010 2c 20 61 64 64 72 45 6e 64 2c 20 31 29 3b 0a 20  , addrEnd, 1);. 
1b020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c       }.      sel
1b030 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
1b040 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
1b050 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20  t, 0, 0, 0, -1, 
1b060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b070 20 20 20 20 20 20 20 65 44 65 73 74 2c 20 69 50         eDest, iP
1b080 61 72 6d 2c 20 61 64 64 72 45 6e 64 2c 20 61 64  arm, addrEnd, ad
1b090 64 72 45 6e 64 2c 20 61 66 66 29 3b 0a 20 20 20  drEnd, aff);.   
1b0a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1b0b0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1b0c0 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
1b0d0 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67  .  } /* endif ag
1b0e0 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
1b0f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
1b100 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
1b110 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e  lause, then we n
1b120 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20  eed to sort the 
1b130 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64  results.  ** and
1b140 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68   send them to th
1b150 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62  e callback one b
1b160 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  y one..  */.  if
1b170 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
1b180 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
1b190 69 6c 28 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d  il(p, v, pEList-
1b1a0 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69  >nExpr, eDest, i
1b1b0 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  Parm);.  }..#ifn
1b1c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b1d0 53 55 42 51 55 45 52 59 0a 20 20 2f 2a 20 49 66  SUBQUERY.  /* If
1b1e0 20 74 68 69 73 20 77 61 73 20 61 20 73 75 62 71   this was a subq
1b1f0 75 65 72 79 2c 20 77 65 20 68 61 76 65 20 6e 6f  uery, we have no
1b200 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68 65 20  w converted the 
1b210 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 61 0a  subquery into a.
1b220 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74    ** temporary t
1b230 61 62 6c 65 2e 20 20 53 6f 20 73 65 74 20 74 68  able.  So set th
1b240 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69  e SrcList_item.i
1b250 73 50 6f 70 75 6c 61 74 65 64 20 66 6c 61 67 20  sPopulated flag 
1b260 74 6f 20 70 72 65 76 65 6e 74 0a 20 20 2a 2a 20  to prevent.  ** 
1b270 74 68 69 73 20 73 75 62 71 75 65 72 79 20 66 72  this subquery fr
1b280 6f 6d 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74  om being evaluat
1b290 65 64 20 61 67 61 69 6e 20 61 6e 64 20 74 6f 20  ed again and to 
1b2a0 66 6f 72 63 65 20 74 68 65 20 75 73 65 20 6f 66  force the use of
1b2b0 0a 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72  .  ** the tempor
1b2c0 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ary table..  */.
1b2d0 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b    if( pParent ){
1b2e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b2f0 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  rent->pSrc->nSrc
1b300 3e 70 61 72 65 6e 74 54 61 62 20 29 3b 0a 20 20  >parentTab );.  
1b310 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1b320 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e  t->pSrc->a[paren
1b330 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70  tTab].pSelect==p
1b340 20 29 3b 0a 20 20 20 20 70 50 61 72 65 6e 74 2d   );.    pParent-
1b350 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54  >pSrc->a[parentT
1b360 61 62 5d 2e 69 73 50 6f 70 75 6c 61 74 65 64 20  ab].isPopulated 
1b370 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 1;.  }.#endif.
1b380 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
1b390 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65  to skip this que
1b3a0 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
1b3b0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1b3c0 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f  l(v, iEnd);..  /
1b3d0 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73  * The SELECT was
1b3e0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
1b3f0 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72  ded.   Set the r
1b400 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a  eturn code to 0.
1b410 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
1b420 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f   no errors..  */
1b430 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  .  rc = 0;..  /*
1b440 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74   Control jumps t
1b450 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72  o here if an err
1b460 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
1b470 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e  d above, or upon
1b480 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
1b490 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53   coding of the S
1b4a0 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65  ELECT..  */.sele
1b4b0 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64  ct_end:..  /* Id
1b4c0 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
1b4d0 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62  mes if we will b
1b4e0 65 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20  e using them in 
1b4f0 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69  a callback.  Thi
1b500 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73  s.  ** step is s
1b510 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75  kipped if the ou
1b520 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f  tput is going to
1b530 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 65 73 74   some other dest
1b540 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  ination..  */.  
1b550 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b560 4b 20 26 26 20 65 44 65 73 74 3d 3d 53 52 54 5f  K && eDest==SRT_
1b570 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
1b580 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
1b590 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
1b5a0 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20  List, pEList);. 
1b5b0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 46 72 65 65   }..  sqliteFree
1b5c0 28 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b  (sAggInfo.aCol);
1b5d0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 73 41  .  sqliteFree(sA
1b5e0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20  ggInfo.aFunc);. 
1b5f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a         return rc;.}.