/ Hex Artifact Content
Login

Artifact 8b3ffcb68f05e88b7f1a3089161511ea8ed0f21a:


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 30  select.c,v 1.300
0200: 20 32 30 30 36 2f 30 31 2f 32 33 20 31 38 3a 34   2006/01/23 18:4
0210: 32 3a 32 31 20 64 72 68 20 45 78 70 20 24 0a 2a  2:21 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 76 6f 69 64 20 63 6c 65 61  lf..*/.void clea
02b0: 72 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a  rSelect(Select *
02c0: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  p){.  sqlite3Exp
02d0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  rListDelete(p->p
02e0: 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  EList);.  sqlite
02f0: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
0300: 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74  ->pSrc);.  sqlit
0310: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
0320: 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  pWhere);.  sqlit
0330: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
0340: 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  (p->pGroupBy);. 
0350: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0360: 74 65 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  te(p->pHaving);.
0370: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0380: 74 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65  tDelete(p->pOrde
0390: 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  rBy);.  sqlite3S
03a0: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70  electDelete(p->p
03b0: 50 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65  Prior);.  sqlite
03c0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
03d0: 4c 69 6d 69 74 29 3b 0a 20 20 73 71 6c 69 74 65  Limit);.  sqlite
03e0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
03f0: 4f 66 66 73 65 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  Offset);.}.../*.
0400: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
0410: 77 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  w Select structu
0420: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  re and return a 
0430: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a  pointer to that.
0440: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
0450: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
0460: 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 45 78 70  SelectNew(.  Exp
0470: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
0480: 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75     /* which colu
0490: 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69  mns to include i
04a0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  n the result */.
04b0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
04c0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46          /* the F
04d0: 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68  ROM clause -- wh
04e0: 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63  ich tables to sc
04f0: 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  an */.  Expr *pW
0500: 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  here,         /*
0510: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
0520: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
0530: 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20  *pGroupBy,   /* 
0540: 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
0550: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  use */.  Expr *p
0560: 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f  Having,        /
0570: 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * the HAVING cla
0580: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
0590: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
05a0: 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
05b0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
05c0: 73 44 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20  sDistinct,      
05d0: 20 2f 2a 20 74 72 75 65 20 69 66 20 74 68 65 20   /* true if the 
05e0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
05f0: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
0600: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20   Expr *pLimit,  
0610: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20         /* LIMIT 
0620: 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61  value.  NULL mea
0630: 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  ns not used */. 
0640: 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20   Expr *pOffset  
0650: 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54         /* OFFSET
0660: 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65   value.  NULL me
0670: 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f  ans no offset */
0680: 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e  .){.  Select *pN
0690: 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61  ew;.  Select sta
06a0: 6e 64 69 6e 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ndin;.  pNew = s
06b0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
06c0: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
06d0: 61 73 73 65 72 74 28 20 21 70 4f 66 66 73 65 74  assert( !pOffset
06e0: 20 7c 7c 20 70 4c 69 6d 69 74 20 29 3b 20 20 20   || pLimit );   
06f0: 2f 2a 20 43 61 6e 27 74 20 68 61 76 65 20 4f 46  /* Can't have OF
0700: 46 53 45 54 20 77 69 74 68 6f 75 74 20 4c 49 4d  FSET without LIM
0710: 49 54 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  IT. */.  if( pNe
0720: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77  w==0 ){.    pNew
0730: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20   = &standin;.   
0740: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
0750: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
0760: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73  .  }.  if( pELis
0770: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69  t==0 ){.    pELi
0780: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
0790: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 73 71  ListAppend(0, sq
07a0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4c 4c  lite3Expr(TK_ALL
07b0: 2c 30 2c 30 2c 30 29 2c 20 30 29 3b 0a 20 20 7d  ,0,0,0), 0);.  }
07c0: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
07d0: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77  = pEList;.  pNew
07e0: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
07f0: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
0800: 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e  pWhere;.  pNew->
0810: 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
0820: 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  pBy;.  pNew->pHa
0830: 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a  ving = pHaving;.
0840: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
0850: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
0860: 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  New->isDistinct 
0870: 3d 20 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  = isDistinct;.  
0880: 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  pNew->op = TK_SE
0890: 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  LECT;.  pNew->pL
08a0: 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
08b0: 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
08c0: 20 70 4f 66 66 73 65 74 3b 0a 20 20 70 4e 65 77   pOffset;.  pNew
08d0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ->iLimit = -1;. 
08e0: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
08f0: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
0900: 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20 3d 20 2d  rOpenVirt[0] = -
0910: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
0920: 70 65 6e 56 69 72 74 5b 31 5d 20 3d 20 2d 31 3b  penVirt[1] = -1;
0930: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
0940: 6e 56 69 72 74 5b 32 5d 20 3d 20 2d 31 3b 0a 20  nVirt[2] = -1;. 
0950: 20 69 66 28 20 70 4e 65 77 3d 3d 26 73 74 61 6e   if( pNew==&stan
0960: 64 69 6e 29 20 7b 0a 20 20 20 20 63 6c 65 61 72  din) {.    clear
0970: 53 65 6c 65 63 74 28 70 4e 65 77 29 3b 0a 20 20  Select(pNew);.  
0980: 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 0a    pNew = 0;.  }.
0990: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
09a0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
09b0: 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20  he given Select 
09c0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
09d0: 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75  l of its substru
09e0: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
09f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
0a00: 65 74 65 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ete(Select *p){.
0a10: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
0a20: 6c 65 61 72 53 65 6c 65 63 74 28 70 29 3b 0a 20  learSelect(p);. 
0a30: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29     sqliteFree(p)
0a40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
0a50: 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e  iven 1 to 3 iden
0a60: 74 69 66 69 65 72 73 20 70 72 65 63 65 65 64 69  tifiers preceedi
0a70: 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77  ng the JOIN keyw
0a80: 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74  ord, determine t
0a90: 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f  he.** type of jo
0aa0: 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  in.  Return an i
0ab0: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
0ac0: 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74  that expresses t
0ad0: 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74  hat type.** in t
0ae0: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  erms of the foll
0af0: 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73  owing bit values
0b00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49  :.**.**     JT_I
0b10: 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43  NNER.**     JT_C
0b20: 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f  ROSS.**     JT_O
0b30: 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e  UTER.**     JT_N
0b40: 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54  ATURAL.**     JT
0b50: 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f  _LEFT.**     JT_
0b60: 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75  RIGHT.**.** A fu
0b70: 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73  ll outer join is
0b80: 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e   the combination
0b90: 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20   of JT_LEFT and 
0ba0: 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20  JT_RIGHT..**.** 
0bb0: 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72  If an illegal or
0bc0: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
0bd0: 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20  n type is seen, 
0be0: 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72  then still retur
0bf0: 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65  n.** a join type
0c00: 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72  , but put an err
0c10: 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  or in the pParse
0c20: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
0c30: 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79  nt sqlite3JoinTy
0c40: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
0c50: 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b  , Token *pA, Tok
0c60: 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70  en *pB, Token *p
0c70: 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79  C){.  int jointy
0c80: 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20  pe = 0;.  Token 
0c90: 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b  *apAll[3];.  Tok
0ca0: 65 6e 20 2a 70 3b 0a 20 20 73 74 61 74 69 63 20  en *p;.  static 
0cb0: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
0cc0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b     const char zK
0cd0: 65 79 77 6f 72 64 5b 38 5d 3b 0a 20 20 20 20 75  eyword[8];.    u
0ce0: 38 20 6e 43 68 61 72 3b 0a 20 20 20 20 75 38 20  8 nChar;.    u8 
0cf0: 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79 77 6f 72  code;.  } keywor
0d00: 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ds[] = {.    { "
0d10: 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20 4a 54 5f  natural", 7, JT_
0d20: 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20 20 20 7b  NATURAL },.    {
0d30: 20 22 6c 65 66 74 22 2c 20 20 20 20 34 2c 20 4a   "left",    4, J
0d40: 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20  T_LEFT|JT_OUTER 
0d50: 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67 68 74 22  },.    { "right"
0d60: 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c  ,   5, JT_RIGHT|
0d70: 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20  JT_OUTER },.    
0d80: 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20 34 2c 20  { "full",    4, 
0d90: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54  JT_LEFT|JT_RIGHT
0da0: 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20  |JT_OUTER },.   
0db0: 20 7b 20 22 6f 75 74 65 72 22 2c 20 20 20 35 2c   { "outer",   5,
0dc0: 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20   JT_OUTER },.   
0dd0: 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20 20 35 2c   { "inner",   5,
0de0: 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 20   JT_INNER },.   
0df0: 20 7b 20 22 63 72 6f 73 73 22 2c 20 20 20 35 2c   { "cross",   5,
0e00: 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f   JT_INNER|JT_CRO
0e10: 53 53 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74  SS },.  };.  int
0e20: 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30   i, j;.  apAll[0
0e30: 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pA;.  apAll[
0e40: 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c  1] = pB;.  apAll
0e50: 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28  [2] = pC;.  for(
0e60: 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c  i=0; i<3 && apAl
0e70: 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l[i]; i++){.    
0e80: 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20  p = apAll[i];.  
0e90: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a    for(j=0; j<siz
0ea0: 65 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69  eof(keywords)/si
0eb0: 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d  zeof(keywords[0]
0ec0: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); j++){.      i
0ed0: 66 28 20 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64  f( p->n==keyword
0ee0: 73 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20  s[j].nChar .    
0ef0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
0f00: 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
0f10: 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64 73 5b 6a  p->z, keywords[j
0f20: 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20 70 2d 3e 6e  ].zKeyword, p->n
0f30: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
0f40: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 6b 65 79 77  jointype |= keyw
0f50: 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20  ords[j].code;.  
0f60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0f70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
0f80: 66 28 20 6a 3e 3d 73 69 7a 65 6f 66 28 6b 65 79  f( j>=sizeof(key
0f90: 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65  words)/sizeof(ke
0fa0: 79 77 6f 72 64 73 5b 30 5d 29 20 29 7b 0a 20 20  ywords[0]) ){.  
0fb0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
0fc0: 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  JT_ERROR;.      
0fd0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
0fe0: 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69  .  if(.     (joi
0ff0: 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45  ntype & (JT_INNE
1000: 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a  R|JT_OUTER))==(J
1010: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
1020: 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74  ) ||.     (joint
1030: 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21  ype & JT_ERROR)!
1040: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73  =0.  ){.    cons
1050: 74 20 63 68 61 72 20 2a 7a 53 70 31 20 3d 20 22  t char *zSp1 = "
1060: 20 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ";.    const ch
1070: 61 72 20 2a 7a 53 70 32 20 3d 20 22 20 22 3b 0a  ar *zSp2 = " ";.
1080: 20 20 20 20 69 66 28 20 70 42 3d 3d 30 20 29 7b      if( pB==0 ){
1090: 20 7a 53 70 31 2b 2b 3b 20 7d 0a 20 20 20 20 69   zSp1++; }.    i
10a0: 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 32  f( pC==0 ){ zSp2
10b0: 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65  ++; }.    sqlite
10c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
10d0: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
10e0: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
10f0: 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25  ype: ".       "%
1100: 54 25 73 25 54 25 73 25 54 22 2c 20 70 41 2c 20  T%s%T%s%T", pA, 
1110: 7a 53 70 31 2c 20 70 42 2c 20 7a 53 70 32 2c 20  zSp1, pB, zSp2, 
1120: 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70  pC);.    jointyp
1130: 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20  e = JT_INNER;.  
1140: 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69 6e 74 79  }else if( jointy
1150: 70 65 20 26 20 4a 54 5f 52 49 47 48 54 20 29 7b  pe & JT_RIGHT ){
1160: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1170: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
1180: 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46      "RIGHT and F
1190: 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20  ULL OUTER JOINs 
11a0: 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  are not currentl
11b0: 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  y supported");. 
11c0: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
11d0: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65  _INNER;.  }.  re
11e0: 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d  turn jointype;.}
11f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1200: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f  he index of a co
1210: 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e  lumn in a table.
1220: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74    Return -1 if t
1230: 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20  he column.** is 
1240: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
1250: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
1260: 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e  tatic int column
1270: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
1280: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1290: 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
12a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
12b0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
12c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
12d0: 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  ICmp(pTab->aCol[
12e0: 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  i].zName, zCol)=
12f0: 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
1300: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
1310: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1320: 20 76 61 6c 75 65 20 6f 66 20 61 20 74 6f 6b 65   value of a toke
1330: 6e 20 74 6f 20 61 20 27 5c 30 30 30 27 2d 74 65  n to a '\000'-te
1340: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
1350: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1360: 73 65 74 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a  setToken(Token *
1370: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
1380: 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 28 75 38 2a  ){.  p->z = (u8*
1390: 29 7a 3b 0a 20 20 70 2d 3e 6e 20 3d 20 7a 20 3f  )z;.  p->n = z ?
13a0: 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a   strlen(z) : 0;.
13b0: 20 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 7d 0a    p->dyn = 0;.}.
13c0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e  ./*.** Create an
13d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
13e0: 20 66 6f 72 20 61 6e 20 69 64 65 6e 74 69 66 69   for an identifi
13f0: 65 72 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  er with the name
1400: 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a 73 74 61   of zName.*/.sta
1410: 74 69 63 20 45 78 70 72 20 2a 63 72 65 61 74 65  tic Expr *create
1420: 49 64 45 78 70 72 28 63 6f 6e 73 74 20 63 68 61  IdExpr(const cha
1430: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54 6f 6b  r *zName){.  Tok
1440: 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 73 65 74 54  en dummy;.  setT
1450: 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 4e 61  oken(&dummy, zNa
1460: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  me);.  return sq
1470: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c  lite3Expr(TK_ID,
1480: 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a   0, 0, &dummy);.
1490: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  }.../*.** Add a 
14a0: 74 65 72 6d 20 74 6f 20 74 68 65 20 57 48 45 52  term to the WHER
14b0: 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  E expression in 
14c0: 2a 70 70 45 78 70 72 20 74 68 61 74 20 72 65 71  *ppExpr that req
14d0: 75 69 72 65 73 20 74 68 65 0a 2a 2a 20 7a 43 6f  uires the.** zCo
14e0: 6c 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 65  l column to be e
14f0: 71 75 61 6c 20 69 6e 20 74 68 65 20 74 77 6f 20  qual in the two 
1500: 74 61 62 6c 65 73 20 70 54 61 62 31 20 61 6e 64  tables pTab1 and
1510: 20 70 54 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69   pTab2..*/.stati
1520: 63 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54  c void addWhereT
1530: 65 72 6d 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  erm(.  const cha
1540: 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20  r *zCol,        
1550: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
1560: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  olumn */.  const
1570: 20 54 61 62 6c 65 20 2a 70 54 61 62 31 2c 20 20   Table *pTab1,  
1580: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 61 62      /* First tab
1590: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
15a0: 61 72 20 2a 7a 41 6c 69 61 73 31 2c 20 20 20 20  ar *zAlias1,    
15b0: 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 66 69   /* Alias for fi
15c0: 72 73 74 20 74 61 62 6c 65 2e 20 20 4d 61 79 20  rst table.  May 
15d0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  be NULL */.  con
15e0: 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62 32 2c  st Table *pTab2,
15f0: 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20        /* Second 
1600: 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  table */.  const
1610: 20 63 68 61 72 20 2a 7a 41 6c 69 61 73 32 2c 20   char *zAlias2, 
1620: 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72      /* Alias for
1630: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 2e 20 20   second table.  
1640: 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1650: 20 69 6e 74 20 69 52 69 67 68 74 4a 6f 69 6e 54   int iRightJoinT
1660: 61 62 6c 65 2c 20 20 20 20 20 2f 2a 20 56 44 42  able,     /* VDB
1670: 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
1680: 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a   right table */.
1690: 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20    Expr **ppExpr 
16a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
16b0: 64 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74  d the equality t
16c0: 65 72 6d 20 74 6f 20 74 68 69 73 20 65 78 70 72  erm to this expr
16d0: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45  ession */.){.  E
16e0: 78 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62  xpr *pE1a, *pE1b
16f0: 2c 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20  , *pE1c;.  Expr 
1700: 2a 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70  *pE2a, *pE2b, *p
1710: 45 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b  E2c;.  Expr *pE;
1720: 0a 0a 20 20 70 45 31 61 20 3d 20 63 72 65 61 74  ..  pE1a = creat
1730: 65 49 64 45 78 70 72 28 7a 43 6f 6c 29 3b 0a 20  eIdExpr(zCol);. 
1740: 20 70 45 32 61 20 3d 20 63 72 65 61 74 65 49 64   pE2a = createId
1750: 45 78 70 72 28 7a 43 6f 6c 29 3b 0a 20 20 69 66  Expr(zCol);.  if
1760: 28 20 7a 41 6c 69 61 73 31 3d 3d 30 20 29 7b 0a  ( zAlias1==0 ){.
1770: 20 20 20 20 7a 41 6c 69 61 73 31 20 3d 20 70 54      zAlias1 = pT
1780: 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  ab1->zName;.  }.
1790: 20 20 70 45 31 62 20 3d 20 63 72 65 61 74 65 49    pE1b = createI
17a0: 64 45 78 70 72 28 7a 41 6c 69 61 73 31 29 3b 0a  dExpr(zAlias1);.
17b0: 20 20 69 66 28 20 7a 41 6c 69 61 73 32 3d 3d 30    if( zAlias2==0
17c0: 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 32 20   ){.    zAlias2 
17d0: 3d 20 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a  = pTab2->zName;.
17e0: 20 20 7d 0a 20 20 70 45 32 62 20 3d 20 63 72 65    }.  pE2b = cre
17f0: 61 74 65 49 64 45 78 70 72 28 7a 41 6c 69 61 73  ateIdExpr(zAlias
1800: 32 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c  2);.  pE1c = sql
1810: 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c  ite3Expr(TK_DOT,
1820: 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b   pE1b, pE1a, 0);
1830: 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65  .  pE2c = sqlite
1840: 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45  3Expr(TK_DOT, pE
1850: 32 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20  2b, pE2a, 0);.  
1860: 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pE = sqlite3Expr
1870: 28 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45  (TK_EQ, pE1c, pE
1880: 32 63 2c 20 30 29 3b 0a 20 20 45 78 70 72 53 65  2c, 0);.  ExprSe
1890: 74 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  tProperty(pE, EP
18a0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 70 45  _FromJoin);.  pE
18b0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
18c0: 65 20 3d 20 69 52 69 67 68 74 4a 6f 69 6e 54 61  e = iRightJoinTa
18d0: 62 6c 65 3b 0a 20 20 2a 70 70 45 78 70 72 20 3d  ble;.  *ppExpr =
18e0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
18f0: 2a 70 70 45 78 70 72 2c 20 70 45 29 3b 0a 7d 0a  *ppExpr, pE);.}.
1900: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
1910: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
1920: 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  rty on all terms
1930: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
1940: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64  pression..** And
1950: 20 73 65 74 20 74 68 65 20 45 78 70 72 2e 69 52   set the Expr.iR
1960: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f  ightJoinTable to
1970: 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72   iTable for ever
1980: 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a  y term in the.**
1990: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
19a0: 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  ** The EP_FromJo
19b0: 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20 75  in property is u
19c0: 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20  sed on terms of 
19d0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  an expression to
19e0: 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46   tell.** the LEF
19f0: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f  T OUTER JOIN pro
1a00: 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68  cessing logic th
1a10: 61 74 20 74 68 69 73 20 74 65 72 6d 20 69 73 20  at this term is 
1a20: 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a  part of the.** j
1a30: 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20  oin restriction 
1a40: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
1a50: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
1a60: 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61  use and not a pa
1a70: 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72  rt.** of the mor
1a80: 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20  e general WHERE 
1a90: 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20 74  clause.  These t
1aa0: 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f  erms are moved o
1ab0: 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48  ver to the.** WH
1ac0: 45 52 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e  ERE clause durin
1ad0: 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e  g join processin
1ae0: 67 20 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f  g but we need to
1af0: 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74   remember that t
1b00: 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65  hey.** originate
1b10: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
1b20: 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  SING clause..**.
1b30: 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69 67  ** The Expr.iRig
1b40: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c  htJoinTable tell
1b50: 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  s the WHERE clau
1b60: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  se processing th
1b70: 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  at the.** expres
1b80: 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20  sion depends on 
1b90: 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e  table iRightJoin
1ba0: 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68  Table even if th
1bb0: 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a  at table is not.
1bc0: 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65  ** explicitly me
1bd0: 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65  ntioned in the e
1be0: 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74  xpression.  That
1bf0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1c00: 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61  needed.** for ca
1c10: 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ses like this:.*
1c20: 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
1c30: 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
1c40: 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
1c50: 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a  .b AND t1.x=5.**
1c60: 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c  .** The where cl
1c70: 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65  ause needs to de
1c80: 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67  fer the handling
1c90: 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a   of the t1.x=5.*
1ca0: 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74  * term until aft
1cb0: 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f  er the t2 loop o
1cc0: 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20  f the join.  In 
1cd0: 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e  that way, a.** N
1ce0: 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20  ULL t2 row will 
1cf0: 62 65 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e  be inserted when
1d00: 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49  ever t1.x!=5.  I
1d10: 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64  f we do not.** d
1d20: 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e  efer the handlin
1d30: 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20  g of t1.x=5, it 
1d40: 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65  will be processe
1d50: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  d immediately.**
1d60: 20 61 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f   after the t1 lo
1d70: 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68  op and rows with
1d80: 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65   t1.x!=5 will ne
1d90: 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a  ver appear in.**
1da0: 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69   the output, whi
1db0: 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e  ch is incorrect.
1dc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1dd0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72  setJoinExpr(Expr
1de0: 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29   *p, int iTable)
1df0: 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  {.  while( p ){.
1e00: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
1e10: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
1e20: 69 6e 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67  in);.    p->iRig
1e30: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 69 54  htJoinTable = iT
1e40: 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69  able;.    setJoi
1e50: 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  nExpr(p->pLeft, 
1e60: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  iTable);.    p =
1e70: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
1e80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1e90: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
1ea0: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
1eb0: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
1ec0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
1ed0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1ee0: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
1ef0: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
1f00: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
1f10: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
1f20: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
1f30: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
1f40: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
1f50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73  .**.** The terms
1f60: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
1f70: 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  e are contained 
1f80: 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  in the Select.pS
1f90: 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  rc structure..**
1fa0: 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74   The left most t
1fb0: 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73  able is the firs
1fc0: 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63  t entry in Selec
1fd0: 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67  t.pSrc.  The rig
1fe0: 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65  ht-most.** table
1ff0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
2000: 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70  ry.  The join op
2010: 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69  erator is held i
2020: 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a  n the entry to.*
2030: 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75  * the left.  Thu
2040: 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69  s entry 0 contai
2050: 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ns the join oper
2060: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69  ator for the joi
2070: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74  n between.** ent
2080: 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41  ries 0 and 1.  A
2090: 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ny ON or USING c
20a0: 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65  lauses associate
20b0: 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20  d with the join 
20c0: 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61  are.** also atta
20d0: 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
20e0: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
20f0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2100: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
2110: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
2120: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
2130: 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  nt sqliteProcess
2140: 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  Join(Parse *pPar
2150: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
2160: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20    /* All tables 
2190: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
21a0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  se */.  int i, j
21b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
21d0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74  counters */.  st
21e0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
21f0: 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a  m *pLeft;     /*
2200: 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e   Left table bein
2210: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74  g joined */.  st
2220: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2230: 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  m *pRight;    /*
2240: 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69   Right table bei
2250: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20  ng joined */..  
2260: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
2270: 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d    pLeft = &pSrc-
2280: 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20  >a[0];.  pRight 
2290: 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66  = &pLeft[1];.  f
22a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
22b0: 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69  nSrc-1; i++, pRi
22c0: 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b  ght++, pLeft++){
22d0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66  .    Table *pLef
22e0: 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54  tTab = pLeft->pT
22f0: 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ab;.    Table *p
2300: 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68  RightTab = pRigh
2310: 74 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 69 66  t->pTab;..    if
2320: 28 20 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c 7c  ( pLeftTab==0 ||
2330: 20 70 52 69 67 68 74 54 61 62 3d 3d 30 20 29 20   pRightTab==0 ) 
2340: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
2350: 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52  * When the NATUR
2360: 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  AL keyword is pr
2370: 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45  esent, add WHERE
2380: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f   clause terms fo
2390: 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63  r.    ** every c
23a0: 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74  olumn that the t
23b0: 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  wo tables have i
23c0: 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f  n common..    */
23d0: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  .    if( pLeft->
23e0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
23f0: 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  TURAL ){.      i
2400: 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 7c 7c  f( pLeft->pOn ||
2410: 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20 29   pLeft->pUsing )
2420: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2430: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2440: 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  , "a NATURAL joi
2450: 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22  n may not have "
2460: 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20  .           "an 
2470: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2480: 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  se", 0);.       
2490: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
24a0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
24b0: 3b 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43  ; j<pLeftTab->nC
24c0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
24d0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
24e0: 70 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a  pLeftTab->aCol[j
24f0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
2500: 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   if( columnIndex
2510: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
2520: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
2530: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
2540: 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c  zName, pLeftTab,
2550: 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20   pLeft->zAlias, 
2560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2580: 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68 74  RightTab, pRight
2590: 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20  ->zAlias,.      
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e          pRight->
25c0: 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68  iCursor, &p->pWh
25d0: 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ere);.          
25e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25f0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2600: 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f   Disallow both O
2610: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
2620: 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ses in the same 
2630: 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  join.    */.    
2640: 69 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 26  if( pLeft->pOn &
2650: 26 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20  & pLeft->pUsing 
2660: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2670: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2680: 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f   "cannot have bo
2690: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
26a0: 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73  ".        "claus
26b0: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
26c0: 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  oin");.      ret
26d0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 1;.    }..  
26e0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20    /* Add the ON 
26f0: 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e  clause to the en
2700: 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  d of the WHERE c
2710: 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64  lause, connected
2720: 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e   by.    ** an AN
2730: 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  D operator..    
2740: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  */.    if( pLeft
2750: 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 73  ->pOn ){.      s
2760: 65 74 4a 6f 69 6e 45 78 70 72 28 70 4c 65 66 74  etJoinExpr(pLeft
2770: 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69  ->pOn, pRight->i
2780: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70  Cursor);.      p
2790: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
27a0: 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 57 68  e3ExprAnd(p->pWh
27b0: 65 72 65 2c 20 70 4c 65 66 74 2d 3e 70 4f 6e 29  ere, pLeft->pOn)
27c0: 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 70  ;.      pLeft->p
27d0: 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  On = 0;.    }.. 
27e0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74     /* Create ext
27f0: 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20  ra terms on the 
2800: 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72  WHERE clause for
2810: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d   each column nam
2820: 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  ed.    ** in the
2830: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20   USING clause.  
2840: 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20  Example: If the 
2850: 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65  two tables to be
2860: 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20   joined are .   
2870: 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20   ** A and B and 
2880: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
2890: 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64   names X, Y, and
28a0: 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69   Z, then add thi
28b0: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  s.    ** to the 
28c0: 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20  WHERE clause:   
28d0: 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59   A.X=B.X AND A.Y
28e0: 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a  =B.Y AND A.Z=B.Z
28f0: 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61  .    ** Report a
2900: 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63  n error if any c
2910: 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20  olumn mentioned 
2920: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
2930: 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  use is.    ** no
2940: 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62  t contained in b
2950: 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65  oth tables to be
2960: 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a   joined..    */.
2970: 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 70      if( pLeft->p
2980: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
2990: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  dList *pList = p
29a0: 4c 65 66 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20  Left->pUsing;.  
29b0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
29c0: 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b  List->nId; j++){
29d0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
29e0: 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Name = pList->a[
29f0: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
2a00: 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65    if( columnInde
2a10: 78 28 70 4c 65 66 74 54 61 62 2c 20 7a 4e 61 6d  x(pLeftTab, zNam
2a20: 65 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e 49 6e  e)<0 || columnIn
2a30: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
2a40: 4e 61 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20 20  Name)<0 ){.     
2a50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2a60: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
2a70: 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20  nnot join using 
2a80: 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75  column %s - colu
2a90: 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  mn ".           
2aa0: 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e   "not present in
2ab0: 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a   both tables", z
2ac0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2ad0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2ae0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64     }.        add
2af0: 57 68 65 72 65 54 65 72 6d 28 7a 4e 61 6d 65 2c  WhereTerm(zName,
2b00: 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74   pLeftTab, pLeft
2b10: 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20  ->zAlias, .     
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61 62         pRightTab
2b40: 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73  , pRight->zAlias
2b50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52                pR
2b70: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26  ight->iCursor, &
2b80: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
2b90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2ba0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2bb0: 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 69  ** Insert code i
2bc0: 6e 74 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c  nto "v" that wil
2bd0: 6c 20 70 75 73 68 20 74 68 65 20 72 65 63 6f 72  l push the recor
2be0: 64 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  d on the top of 
2bf0: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74  the.** stack int
2c00: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
2c10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
2c20: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50  hOntoSorter(.  P
2c30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
2c40: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
2c50: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
2c60: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
2c70: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
2c80: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
2c90: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
2ca0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
2cb0: 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ole SELECT state
2cc0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  ment */.){.  Vdb
2cd0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
2ce0: 56 64 62 65 3b 0a 20 20 73 71 6c 69 74 65 33 45  Vdbe;.  sqlite3E
2cf0: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
2d00: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
2d10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2d20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71 75  AddOp(v, OP_Sequ
2d30: 65 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ence, pOrderBy->
2d40: 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20  iECursor, 0);.  
2d50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d60: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 70 4f 72  (v, OP_Pull, pOr
2d70: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31  derBy->nExpr + 1
2d80: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
2d90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
2da0: 61 6b 65 52 65 63 6f 72 64 2c 20 70 4f 72 64 65  akeRecord, pOrde
2db0: 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 32 2c 20  rBy->nExpr + 2, 
2dc0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
2dd0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
2de0: 49 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79  Insert, pOrderBy
2df0: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a  ->iECursor, 0);.
2e00: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69    if( pSelect->i
2e10: 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20  Limit>=0 ){.    
2e20: 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
2e30: 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  ;.    addr1 = sq
2e40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2e50: 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20  , OP_IfMemZero, 
2e60: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 2b  pSelect->iLimit+
2e70: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
2e80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2e90: 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70  P_MemIncr, -1, p
2ea0: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 2b 31  Select->iLimit+1
2eb0: 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73  );.    addr2 = s
2ec0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2ed0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30  v, OP_Goto, 0, 0
2ee0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2ef0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
2f00: 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr1);.    sqlite
2f10: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2f20: 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79 2d  _Last, pOrderBy-
2f30: 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20  >iECursor, 0);. 
2f40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f50: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  dOp(v, OP_Delete
2f60: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
2f70: 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  rsor, 0);.    sq
2f80: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2f90: 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20  e(v, addr2);.   
2fa0: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
2fb0: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   = -1;.  }.}../*
2fc0: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20  .** Add code to 
2fd0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46  implement the OF
2fe0: 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76  FSET.*/.static v
2ff0: 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a  oid codeOffset(.
3000: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
3010: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
3020: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
3030: 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  M */.  Select *p
3040: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
3050: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3060: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
3070: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
3080: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
3090: 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72   to skip the cur
30a0: 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rent record */. 
30b0: 20 69 6e 74 20 6e 50 6f 70 20 20 20 20 20 20 20   int nPop       
30c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
30d0: 74 69 6d 65 73 20 74 6f 20 70 6f 70 20 73 74 61  times to pop sta
30e0: 63 6b 20 77 68 65 6e 20 6a 75 6d 70 69 6e 67 20  ck when jumping 
30f0: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69  */.){.  if( p->i
3100: 4f 66 66 73 65 74 3e 3d 30 20 26 26 20 69 43 6f  Offset>=0 && iCo
3110: 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20  ntinue!=0 ){.   
3120: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73   int addr;.    s
3130: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3140: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d  v, OP_MemIncr, -
3150: 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a  1, p->iOffset);.
3160: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
3170: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3180: 50 5f 49 66 4d 65 6d 4e 65 67 2c 20 70 2d 3e 69  P_IfMemNeg, p->i
3190: 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  Offset, 0);.    
31a0: 69 66 28 20 6e 50 6f 70 3e 30 20 29 7b 0a 20 20  if( nPop>0 ){.  
31b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
31c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
31d0: 6e 50 6f 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  nPop, 0);.    }.
31e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
31f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
3200: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
3210: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
3220: 28 76 2c 20 22 23 20 73 6b 69 70 20 4f 46 46 53  (v, "# skip OFFS
3230: 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20  ET records"));. 
3240: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
3250: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
3260: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
3270: 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  d code that will
3280: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   check to make s
3290: 75 72 65 20 74 68 65 20 74 6f 70 20 4e 20 65 6c  ure the top N el
32a0: 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ements of the.**
32b0: 20 73 74 61 63 6b 20 61 72 65 20 64 69 73 74 69   stack are disti
32c0: 6e 63 74 2e 20 20 69 54 61 62 20 69 73 20 61 20  nct.  iTab is a 
32d0: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
32e0: 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75  at holds previou
32f0: 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62  sly.** seen comb
3300: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  inations of the 
3310: 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77  N values.  A new
3320: 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69   entry is made i
3330: 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65  n iTab.** if the
3340: 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65   current N value
3350: 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a  s are new..**.**
3360: 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52   A jump to addrR
3370: 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e  epeat is made an
3380: 64 20 74 68 65 20 4b 20 76 61 6c 75 65 73 20 61  d the K values a
3390: 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  re popped from t
33a0: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74  he.** stack if t
33b0: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
33c0: 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e  s are not distin
33d0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
33e0: 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28  id codeDistinct(
33f0: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
3400: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
3410: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
3420: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61   VM */.  int iTa
3430: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  b,          /* A
3440: 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75   sorting index u
3450: 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20  sed to test for 
3460: 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a  distinctness */.
3470: 20 20 69 6e 74 20 61 64 64 72 52 65 70 65 61 74    int addrRepeat
3480: 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  ,    /* Jump to 
3490: 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74  here if not dist
34a0: 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c  inct */.  int N,
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34c0: 54 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  The top N elemen
34d0: 74 73 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20  ts of the stack 
34e0: 6d 75 73 74 20 62 65 20 64 69 73 74 69 6e 63 74  must be distinct
34f0: 20 2a 2f 0a 20 20 69 6e 74 20 4b 20 20 20 20 20   */.  int K     
3500: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 20           /* Pop 
3510: 4b 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20  K elements from 
3520: 74 68 65 20 73 74 61 63 6b 20 69 66 20 69 6e 64  the stack if ind
3530: 69 73 74 69 6e 63 74 20 2a 2f 0a 29 7b 0a 23 69  istinct */.){.#i
3540: 66 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49  f NULL_ALWAYS_DI
3550: 53 54 49 4e 43 54 0a 20 20 73 71 6c 69 74 65 33  STINCT.  sqlite3
3560: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3570: 49 73 4e 75 6c 6c 2c 20 2d 4e 2c 20 73 71 6c 69  IsNull, -N, sqli
3580: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
3590: 64 72 28 76 29 2b 36 29 3b 0a 23 65 6e 64 69 66  dr(v)+6);.#endif
35a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
35b0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
35c0: 63 6f 72 64 2c 20 2d 4e 2c 20 30 29 3b 0a 20 20  cord, -N, 0);.  
35d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35e0: 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c  (v, OP_Distinct,
35f0: 20 69 54 61 62 2c 20 73 71 6c 69 74 65 33 56 64   iTab, sqlite3Vd
3600: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
3610: 2b 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +3);.  sqlite3Vd
3620: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
3630: 70 2c 20 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, K, 0);.  sqli
3640: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3650: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
3660: 52 65 70 65 61 74 29 3b 0a 20 20 56 64 62 65 43  Repeat);.  VdbeC
3670: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 6b  omment((v, "# sk
3680: 69 70 20 69 6e 64 69 73 74 69 6e 63 74 20 72 65  ip indistinct re
3690: 63 6f 72 64 73 22 29 29 3b 0a 20 20 73 71 6c 69  cords"));.  sqli
36a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
36b0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54  OP_IdxInsert, iT
36c0: 61 62 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ab, 0);.}.../*.*
36d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
36e0: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
36f0: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
3700: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
3710: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
3720: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54  T..**.** If srcT
3730: 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61  ab and nColumn a
3740: 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68  re both zero, th
3750: 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78  en the pEList ex
3760: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
3770: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72   evaluated in or
3780: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64  der to get the d
3790: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ata for this row
37a0: 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a  .  If nColumn>0.
37b0: 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20  ** then data is 
37c0: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54  pulled from srcT
37d0: 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73  ab and pEList is
37e0: 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65   used only to ge
37f0: 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70  t the.** datatyp
3800: 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  es for each colu
3810: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  mn..*/.static in
3820: 74 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  t selectInnerLoo
3830: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
3840: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
3850: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
3860: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
3870: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3880: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
3890: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
38a0: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
38b0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
38c0: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  st,       /* Lis
38d0: 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e  t of values bein
38e0: 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20  g extracted */. 
38f0: 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20   int srcTab,    
3900: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c           /* Pull
3910: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20   data from this 
3920: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  table */.  int n
3930: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
3940: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3950: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73  columns in the s
3960: 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20  ource table */. 
3970: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
3980: 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e  rBy,     /* If n
3990: 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65  ot NULL, sort re
39a0: 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73  sults using this
39b0: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69   key */.  int di
39c0: 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20  stinct,         
39d0: 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b    /* If >=0, mak
39e0: 65 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61  e sure results a
39f0: 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  re distinct */. 
3a00: 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20   int eDest,     
3a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
3a20: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  to dispose of th
3a30: 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
3a40: 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20  nt iParm,       
3a50: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 67         /* An arg
3a60: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 69 73  ument to the dis
3a70: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
3a80: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
3a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
3aa0: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
3ab0: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
3ac0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
3ad0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3ae0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
3af0: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
3b00: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63  nner loop */.  c
3b10: 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20  har *aff        
3b20: 20 20 20 20 20 20 20 2f 2a 20 61 66 66 69 6e 69         /* affini
3b30: 74 79 20 73 74 72 69 6e 67 20 69 66 20 65 44 65  ty string if eDe
3b40: 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20  st is SRT_Union 
3b50: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
3b60: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
3b70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
3b80: 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20  hasDistinct;    
3b90: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
3ba0: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
3bb0: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
3bc0: 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  /..  if( v==0 ) 
3bd0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
3be0: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
3bf0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
3c00: 77 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  was a LIMIT clau
3c10: 73 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  se on the SELECT
3c20: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
3c30: 20 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20   do the check.  
3c40: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ** to see if thi
3c50: 73 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20  s row should be 
3c60: 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 68  output..  */.  h
3c70: 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73  asDistinct = dis
3c80: 74 69 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69  tinct>=0 && pELi
3c90: 73 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20 20 69  st->nExpr>0;.  i
3ca0: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  f( pOrderBy==0 &
3cb0: 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29  & !hasDistinct )
3cc0: 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  {.    codeOffset
3cd0: 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
3ce0: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
3cf0: 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74  Pull the request
3d00: 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f  ed columns..  */
3d10: 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30  .  if( nColumn>0
3d20: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
3d30: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
3d40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
3d50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
3d60: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69  olumn, srcTab, i
3d70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
3d80: 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20  {.    nColumn = 
3d90: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
3da0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
3db0: 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
3dc0: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
3dd0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
3de0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
3df0: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
3e00: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3e10: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
3e20: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
3e30: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
3e40: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
3e50: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
3e60: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
3e70: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
3e80: 6e 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  nct ){.    int n
3e90: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
3ea0: 3b 0a 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e  ;.    codeDistin
3eb0: 63 74 28 76 2c 20 64 69 73 74 69 6e 63 74 2c 20  ct(v, distinct, 
3ec0: 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 2c 20 6e 2b  iContinue, n, n+
3ed0: 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64  1);.    if( pOrd
3ee0: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
3ef0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
3f00: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f  , iContinue, nCo
3f10: 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lumn);.    }.  }
3f20: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ..  switch( eDes
3f30: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
3f40: 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  his mode, write 
3f50: 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c  each query resul
3f60: 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20  t to the key of 
3f70: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
3f80: 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d    ** table iParm
3f90: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
3fa0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
3fb0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20  POUND_SELECT.   
3fc0: 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a   case SRT_Union:
3fd0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
3fe0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3ff0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c  MakeRecord, nCol
4000: 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53  umn, NULL_ALWAYS
4010: 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20 20 20 20  _DISTINCT);.    
4020: 20 20 69 66 28 20 61 66 66 20 29 7b 0a 20 20 20    if( aff ){.   
4030: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4040: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
4050: 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  aff, P3_STATIC);
4060: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
4070: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4080: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
4090: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
40a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
40b0: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
40c0: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
40d0: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
40e0: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
40f0: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
4100: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
4110: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
4120: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
4130: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
4140: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
4150: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
4160: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
4170: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
4180: 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  r;.      addr = 
4190: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
41a0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
41b0: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c  d, nColumn, NULL
41c0: 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54  _ALWAYS_DISTINCT
41d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
41e0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
41f0: 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54  -1, aff, P3_STAT
4200: 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
4210: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4220: 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72  P_NotFound, iPar
4230: 6d 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20  m, addr+3);.    
4240: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4250: 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  Op(v, OP_Delete,
4260: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
4270: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
4280: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74  endif..    /* St
4290: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  ore the result a
42a0: 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75  s data using a u
42b0: 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a  nique key..    *
42c0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  /.    case SRT_T
42d0: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
42e0: 52 54 5f 56 69 72 74 75 61 6c 54 61 62 3a 20 7b  RT_VirtualTab: {
42f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4300: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
4310: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
4320: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  n, 0);.      if(
4330: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
4340: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
4350: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
4360: 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20 20  erBy, p);.      
4370: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
4380: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4390: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
43a0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
43b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
43c0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
43d0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  1, 0);.        s
43e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
43f0: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
4400: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  arm, 0);.      }
4410: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4420: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
4430: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
4440: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
4450: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
4460: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
4470: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
4480: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
4490: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
44a0: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
44b0: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
44c0: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
44d0: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
44e0: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
44f0: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
4500: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4510: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
4520: 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69  int addr1 = sqli
4530: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
4540: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  dr(v);.      int
4550: 20 61 64 64 72 32 3b 0a 0a 20 20 20 20 20 20 61   addr2;..      a
4560: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
4570: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
4580: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4590: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61  P_NotNull, -1, a
45a0: 64 64 72 31 2b 33 29 3b 0a 20 20 20 20 20 20 73  ddr1+3);.      s
45b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
45c0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
45d0: 3b 0a 20 20 20 20 20 20 61 64 64 72 32 20 3d 20  ;.      addr2 = 
45e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
45f0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
4600: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  0);.      if( pO
4610: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
4620: 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c    /* At first gl
4630: 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74  ance you would t
4640: 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70  hink we could op
4650: 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20  timize out the. 
4660: 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20         ** ORDER 
4670: 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  BY in this case 
4680: 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20  since the order 
4690: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
46a0: 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a  e set.        **
46b0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
46c0: 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67  .  But there mig
46d0: 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c  ht be a LIMIT cl
46e0: 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20  ause, in which. 
46f0: 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
4700: 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61  he order does ma
4710: 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  tter */.        
4720: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
4730: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
4740: 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   p);.      }else
4750: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61  {.        char a
4760: 66 66 20 3d 20 28 69 50 61 72 6d 3e 3e 31 36 29  ff = (iParm>>16)
4770: 26 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 61  &0xFF;.        a
4780: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
4790: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69  areAffinity(pELi
47a0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
47b0: 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 73 71  aff);.        sq
47c0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
47d0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31  OP_MakeRecord, 1
47e0: 2c 20 30 2c 20 26 61 66 66 2c 20 31 29 3b 0a 20  , 0, &aff, 1);. 
47f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4800: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
4810: 78 49 6e 73 65 72 74 2c 20 28 69 50 61 72 6d 26  xInsert, (iParm&
4820: 30 78 30 30 30 30 46 46 46 46 29 2c 20 30 29 3b  0x0000FFFF), 0);
4830: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
4840: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
4850: 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20  re(v, addr2);.  
4860: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4870: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20  ..    /* If any 
4880: 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65  row exist in the
4890: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63   result set, rec
48a0: 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e  ord that fact an
48b0: 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a  d abort..    */.
48c0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69      case SRT_Exi
48d0: 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  sts: {.      sql
48e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
48f0: 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 69   OP_MemInt, 1, i
4900: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  Parm);.      sql
4910: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4920: 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e   OP_Pop, nColumn
4930: 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 0);.      /* T
4940: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
4950: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
4960: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
4970: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
4980: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
4990: 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
49a0: 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
49b0: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
49c0: 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
49d0: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
49e0: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
49f0: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
4a00: 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  ell and break ou
4a10: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
4a20: 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
4a30: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  /.    case SRT_M
4a40: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
4a50: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
4a60: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
4a70: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
4a80: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
4a90: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
4aa0: 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   p);.      }else
4ab0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4ac0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4ad0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
4ae0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  , 1);.        /*
4af0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
4b00: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
4b10: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
4b20: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
4b30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4b40: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
4b50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
4b60: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
4b70: 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74 61  /* Send the data
4b80: 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
4b90: 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20   function or to 
4ba0: 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49  a subroutine.  I
4bb0: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73  n the.    ** cas
4bc0: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
4bd0: 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  e, the subroutin
4be0: 65 20 69 74 73 65 6c 66 20 69 73 20 72 65 73 70  e itself is resp
4bf0: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20  onsible for.    
4c00: 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64  ** popping the d
4c10: 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ata from the sta
4c20: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ck..    */.    c
4c30: 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69  ase SRT_Subrouti
4c40: 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ne:.    case SRT
4c50: 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20  _Callback: {.   
4c60: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
4c70: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4c80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4c90: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
4ca0: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
4cb0: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
4cc0: 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  r(pParse, pOrder
4cd0: 42 79 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 65  By, p);.      }e
4ce0: 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53  lse if( eDest==S
4cf0: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b  RT_Subroutine ){
4d00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4d10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4d20: 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29  Gosub, 0, iParm)
4d30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4d40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4d50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61  beAddOp(v, OP_Ca
4d60: 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c  llback, nColumn,
4d70: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
4d80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4d90: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
4da0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
4db0: 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  R).    /* Discar
4dc0: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
4dd0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
4de0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4df0: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
4e00: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
4e10: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
4e20: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
4e30: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
4e40: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
4e50: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
4e60: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
4e70: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
4e80: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
4e90: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
4ea0: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
4eb0: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
4ec0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
4ed0: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
4ee0: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
4ef0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4f00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
4f10: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
4f20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4f30: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
4f40: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
4f50: 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
4f60: 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
4f70: 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
4f80: 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 26  ( p->iLimit>=0 &
4f90: 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  & pOrderBy==0 ){
4fa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4fb0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
4fc0: 6e 63 72 2c 20 2d 31 2c 20 70 2d 3e 69 4c 69 6d  ncr, -1, p->iLim
4fd0: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
4fe0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4ff0: 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c  IfMemZero, p->iL
5000: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  imit, iBreak);. 
5010: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
5020: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
5030: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
5040: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79  , generate a Key
5050: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
5060: 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  hat records.** t
5070: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
5080: 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65  uence for each e
5090: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61  xpression in tha
50a0: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
50b0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
50c0: 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f  ExprList is an O
50d0: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
50e0: 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20   BY clause then 
50f0: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  the resulting.**
5100: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
5110: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
5120: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
5130: 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  ng a virtual ind
5140: 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ex to.** impleme
5150: 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20  nt that clause. 
5160: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
5170: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73   is the result s
5180: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a  et of a SELECT.*
5190: 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e  * then the KeyIn
51a0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
51b0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
51c0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
51d0: 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20  irtual.** index 
51e0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44  to implement a D
51f0: 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a  ISTINCT test..**
5200: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
5210: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
5220: 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
5230: 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20  n from malloc.  
5240: 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  The calling.** f
5250: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f  unction is respo
5260: 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e  nsible for seein
5270: 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75  g that this stru
5280: 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61  cture is eventua
5290: 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41  lly.** freed.  A
52a0: 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  dd the KeyInfo s
52b0: 74 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20  tructure to the 
52c0: 50 33 20 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f  P3 field of an o
52d0: 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50  pcode using.** P
52e0: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
52f0: 46 20 69 73 20 74 68 65 20 75 73 75 61 6c 20 77  F is the usual w
5300: 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77 69  ay of dealing wi
5310: 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74  th this..*/.stat
5320: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
5330: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
5340: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
5350: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
5360: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
5370: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
5380: 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49  nt nExpr;.  KeyI
5390: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74  nfo *pInfo;.  st
53a0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
53b0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
53c0: 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70   i;..  nExpr = p
53d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
53e0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Info = sqliteMal
53f0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e  loc( sizeof(*pIn
5400: 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a  fo) + nExpr*(siz
5410: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29  eof(CollSeq*)+1)
5420: 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20   );.  if( pInfo 
5430: 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53  ){.    pInfo->aS
5440: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
5450: 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45  &pInfo->aColl[nE
5460: 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  xpr];.    pInfo-
5470: 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78 70 72 3b  >nField = nExpr;
5480: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e 63 20  .    pInfo->enc 
5490: 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 66  = ENC(db);.    f
54a0: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
54b0: 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b  ist->a; i<nExpr;
54c0: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
54d0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
54e0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c  Coll;.      pCol
54f0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
5500: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
5510: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
5520: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
5530: 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
5540: 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
5550: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
5560: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  Info->aColl[i] =
5570: 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49   pColl;.      pI
5580: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
5590: 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74  i] = pItem->sort
55a0: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
55b0: 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b  .  return pInfo;
55c0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
55d0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73  e inner loop was
55e0: 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67   generated using
55f0: 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64   a non-null pOrd
5600: 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  erBy argument,.*
5610: 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  * then the resul
5620: 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20 69  ts were placed i
5630: 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74  n a sorter.  Aft
5640: 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74  er the loop is t
5650: 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20  erminated.** we 
5660: 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20  need to run the 
5670: 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75  sorter and outpu
5680: 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  t the results.  
5690: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  The following.**
56a0: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
56b0: 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64  es the code need
56c0: 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ed to do that..*
56d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
56e0: 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a  nerateSortTail(.
56f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5700: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
5710: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
5720: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
5730: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
5740: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62  atement */.  Vdb
5750: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 2f 2a  e *v,         /*
5760: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
5770: 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f  nto this VDBE */
5780: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
5790: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
57a0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61   columns of data
57b0: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c   */.  int eDest,
57c0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
57d0: 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c  the sorted resul
57e0: 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ts here */.  int
57f0: 20 69 50 61 72 6d 20 20 20 20 20 20 20 20 2f 2a   iParm        /*
5800: 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65   Optional parame
5810: 74 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77  ter associated w
5820: 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a  ith eDest */.){.
5830: 20 20 69 6e 74 20 62 72 6b 20 3d 20 73 71 6c 69    int brk = sqli
5840: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
5850: 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 20  (v);.  int cont 
5860: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
5870: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74  eLabel(v);.  int
5880: 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54 61   addr;.  int iTa
5890: 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  b;.  ExprList *p
58a0: 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
58b0: 64 65 72 42 79 3b 0a 0a 20 20 69 54 61 62 20 3d  derBy;..  iTab =
58c0: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
58d0: 73 6f 72 3b 0a 20 20 61 64 64 72 20 3d 20 31 20  sor;.  addr = 1 
58e0: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
58f0: 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  Op(v, OP_Sort, i
5900: 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f 64  Tab, brk);.  cod
5910: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 63 6f  eOffset(v, p, co
5920: 6e 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  nt, 0);.  sqlite
5930: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5940: 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70  _Column, iTab, p
5950: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b  OrderBy->nExpr +
5960: 20 31 29 3b 0a 20 20 73 77 69 74 63 68 28 20 65   1);.  switch( e
5970: 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65  Dest ){.    case
5980: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
5990: 63 61 73 65 20 53 52 54 5f 56 69 72 74 75 61 6c  case SRT_Virtual
59a0: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  Tab: {.      sql
59b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
59c0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
59d0: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  arm, 0);.      s
59e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
59f0: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
5a00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5a10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5a20: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 30  Insert, iParm, 0
5a30: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5a40: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
5a50: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
5a60: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
5a70: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
5a80: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
5a90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5aa0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5ab0: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71 6c  NotNull, -1, sql
5ac0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5ad0: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20  ddr(v)+3);.     
5ae0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5af0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
5b00: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
5b10: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5b20: 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65  _Goto, 0, sqlite
5b30: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
5b40: 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  (v)+3);.      sq
5b50: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
5b60: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31  OP_MakeRecord, 1
5b70: 2c 20 30 2c 20 22 63 22 2c 20 50 33 5f 53 54 41  , 0, "c", P3_STA
5b80: 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TIC);.      sqli
5b90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5ba0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 28 69  OP_IdxInsert, (i
5bb0: 50 61 72 6d 26 30 78 30 30 30 30 46 46 46 46 29  Parm&0x0000FFFF)
5bc0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
5bd0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
5be0: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
5bf0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
5c00: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
5c10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5c20: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
5c30: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
5c40: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
5c50: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
5c60: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
5c70: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
5c80: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
5c90: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 61  .    case SRT_Ca
5ca0: 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61 73 65  llback:.    case
5cb0: 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a   SRT_Subroutine:
5cc0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a   {.      int i;.
5cd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5ce0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
5cf0: 65 67 65 72 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  eger, p->pEList-
5d00: 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  >nExpr, 0);.    
5d10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5d20: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  Op(v, OP_Pull, 1
5d30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , 0);.      for(
5d40: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
5d50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
5d60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5d70: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d  , OP_Column, -1-
5d80: 69 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  i, i);.      }. 
5d90: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
5da0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
5db0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5dc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
5dd0: 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e  allback, nColumn
5de0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
5df0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
5e00: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5e10: 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72  P_Gosub, 0, iPar
5e20: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
5e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5e40: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c  Op(v, OP_Pop, 2,
5e50: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
5e60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
5e70: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
5e80: 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do nothing */.  
5e90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5ea0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
5eb0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
5ec0: 65 20 6c 6f 6f 70 20 77 68 65 6e 20 74 68 65 20  e loop when the 
5ed0: 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
5ee0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
5ef0: 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20  Limit>=0 ){.    
5f00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5f10: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20  (v, OP_MemIncr, 
5f20: 2d 31 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a  -1, p->iLimit);.
5f30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5f40: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  ddOp(v, OP_IfMem
5f50: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
5f60: 20 62 72 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   brk);.  }..  /*
5f70: 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   The bottom of t
5f80: 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  he loop.  */.  s
5f90: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
5fa0: 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b  eLabel(v, cont);
5fb0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5fc0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
5fd0: 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 73  iTab, addr);.  s
5fe0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
5ff0: 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a  eLabel(v, brk);.
6000: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
6010: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
6020: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
6030: 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f   the 'declaratio
6040: 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a  n type' of the.*
6050: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * expression pEx
6060: 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d  pr. The string m
6070: 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ay be treated as
6080: 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63   static by the c
6090: 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aller..**.** If 
60a0: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
60b0: 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63  type is the exac
60c0: 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e  t datatype defin
60d0: 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20  ition extracted 
60e0: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72 69 67  from.** the orig
60f0: 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c  inal CREATE TABL
6100: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74  E statement if t
6110: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
6120: 20 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 0a 2a   a column..** .*
6130: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
6140: 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 20 65 78  n type for an ex
6150: 70 72 65 73 73 69 6f 6e 20 69 73 20 65 69 74 68  pression is eith
6160: 65 72 20 54 45 58 54 2c 20 4e 55 4d 45 52 49 43  er TEXT, NUMERIC
6170: 20 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54 68 65 20   or ANY..** The 
6180: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
6190: 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65   for a ROWID fie
61a0: 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 0a 2a  ld is INTEGER..*
61b0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
61c0: 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28  har *columnType(
61d0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
61e0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
61f0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
6200: 79 70 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  ype;.  int j;.  
6210: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20  if( pExpr==0 || 
6220: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30  pNC->pSrcList==0
6230: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
6240: 2f 2a 20 54 68 65 20 54 4b 5f 41 53 20 6f 70 65  /* The TK_AS ope
6250: 72 61 74 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 6f  rator can only o
6260: 63 63 75 72 20 69 6e 20 4f 52 44 45 52 20 42 59  ccur in ORDER BY
6270: 2c 20 47 52 4f 55 50 20 42 59 2c 20 48 41 56 49  , GROUP BY, HAVI
6280: 4e 47 2c 0a 20 20 2a 2a 20 61 6e 64 20 4c 49 4d  NG,.  ** and LIM
6290: 49 54 20 63 6c 61 75 73 65 73 2e 20 20 42 75 74  IT clauses.  But
62a0: 20 70 45 78 70 72 20 6f 72 69 67 69 6e 61 74 65   pExpr originate
62b0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
62c0: 73 65 74 20 6f 66 20 61 0a 20 20 2a 2a 20 53 45  set of a.  ** SE
62d0: 4c 45 43 54 2e 20 20 53 6f 20 70 45 78 70 72 20  LECT.  So pExpr 
62e0: 63 61 6e 20 6e 65 76 65 72 20 63 6f 6e 74 61 69  can never contai
62f0: 6e 20 61 6e 20 41 53 20 6f 70 65 72 61 74 6f 72  n an AS operator
6300: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
6310: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
6320: 53 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  S );..  switch( 
6330: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
6340: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
6350: 20 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a   {.      Table *
6360: 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
6370: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
6380: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
6390: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21   while( pNC && !
63a0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
63b0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
63c0: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
63d0: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  t;.        for(j
63e0: 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  =0;j<pTabList->n
63f0: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
6400: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
6410: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b  Expr->iTable;j++
6420: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
6430: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
6440: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
6450: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
6460: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  j].pTab;.       
6470: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6480: 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65    pNC = pNC->pNe
6490: 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  xt;.        }.  
64a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
64b0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
64c0: 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a 20 20     /* FIX ME:.  
64d0: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61        ** This ca
64e0: 6e 20 6f 63 63 75 72 73 20 69 66 20 79 6f 75 20  n occurs if you 
64f0: 68 61 76 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c  have something l
6500: 69 6b 65 20 22 53 45 4c 45 43 54 20 6e 65 77 2e  ike "SELECT new.
6510: 78 3b 22 20 69 6e 73 69 64 65 0a 20 20 20 20 20  x;" inside.     
6520: 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2e     ** a trigger.
6530: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
6540: 2c 20 69 66 20 79 6f 75 20 72 65 66 65 72 65 6e  , if you referen
6550: 63 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 22  ce the special "
6560: 6e 65 77 22 0a 20 20 20 20 20 20 20 20 2a 2a 20  new".        ** 
6570: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 72 65 73  table in the res
6580: 75 6c 74 20 73 65 74 20 6f 66 20 61 20 73 65 6c  ult set of a sel
6590: 65 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ect.  We do not 
65a0: 68 61 76 65 20 61 20 67 6f 6f 64 20 77 61 79 0a  have a good way.
65b0: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69          ** to fi
65c0: 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 74 61  nd the actual ta
65d0: 62 6c 65 20 74 79 70 65 2c 20 73 6f 20 63 61 6c  ble type, so cal
65e0: 6c 20 69 74 20 22 54 45 58 54 22 2e 20 20 54 68  l it "TEXT".  Th
65f0: 69 73 20 69 73 20 72 65 61 6c 6c 79 0a 20 20 20  is is really.   
6600: 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e       ** somethin
6610: 67 20 6f 66 20 61 20 62 75 67 2c 20 62 75 74 20  g of a bug, but 
6620: 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f  I do not know ho
6630: 77 20 74 6f 20 66 69 78 20 69 74 2e 0a 20 20 20  w to fix it..   
6640: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
6650: 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 6f 65  ** This code doe
6660: 73 20 6e 6f 74 20 70 72 6f 64 75 63 65 20 74 68  s not produce th
6670: 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
6680: 20 2d 20 69 74 20 6a 75 73 74 20 70 72 65 76 65   - it just preve
6690: 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  nts.        ** a
66a0: 20 73 65 67 66 61 75 6c 74 2e 20 20 53 65 65 20   segfault.  See 
66b0: 74 69 63 6b 65 74 20 23 31 32 32 39 2e 0a 20 20  ticket #1229..  
66c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
66d0: 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b   zType = "TEXT";
66e0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
66f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
6700: 73 65 72 74 28 20 70 54 61 62 20 29 3b 0a 20 20  sert( pTab );.  
6710: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
6720: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
6730: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
6740: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
6750: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
6760: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
6770: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
6780: 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  ){.        zType
6790: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
67a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
67b0: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
67c0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
67d0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
67e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
67f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6800: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
6810: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
6820: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
6830: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
6840: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
6850: 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
6860: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
6870: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  pExpr->pSelect->
6880: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
6890: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
68a0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
68b0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 53 2d 3e  nType(&sNC, pS->
68c0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
68d0: 70 72 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  pr); .      brea
68e0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
68f0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
6900: 20 20 20 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20     zType = 0;.  
6910: 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 7a 54  }.  .  return zT
6920: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
6930: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
6940: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
6950: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
6960: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
6970: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
6980: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
6990: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
69a0: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
69b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
69c0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
69d0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
69e0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
69f0: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
6a00: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
6a10: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
6a20: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
6a30: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
6a40: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
6a50: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
6a60: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  e;.  int i;.  Na
6a70: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
6a80: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
6a90: 70 54 61 62 4c 69 73 74 3b 0a 20 20 66 6f 72 28  pTabList;.  for(
6aa0: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
6ab0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
6ac0: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
6ad0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
6ae0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
6af0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
6b00: 28 26 73 4e 43 2c 20 70 29 3b 0a 20 20 20 20 69  (&sNC, p);.    i
6b10: 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20 63 6f  f( zType==0 ) co
6b20: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 54  ntinue;.    /* T
6b30: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
6b40: 65 20 69 74 27 73 20 6f 77 6e 20 63 6f 70 79 20  e it's own copy 
6b50: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79  of the column-ty
6b60: 70 65 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  pe, in case the 
6b70: 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 20 69  .    ** schema i
6b80: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
6b90: 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
6ba0: 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  ine is deleted..
6bb0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
6bc0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
6bd0: 28 76 2c 20 69 2b 70 45 4c 69 73 74 2d 3e 6e 45  (v, i+pEList->nE
6be0: 78 70 72 2c 20 7a 54 79 70 65 2c 20 73 74 72 6c  xpr, zType, strl
6bf0: 65 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20 7d 0a  en(zType));.  }.
6c00: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
6c10: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
6c20: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
6c30: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
6c40: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
6c50: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
6c60: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
6c70: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
6c80: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
6c90: 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c  lues in the call
6ca0: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
6cb0: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
6cc0: 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  umnNames(.  Pars
6cd0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6ce0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
6cf0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
6d00: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
6d10: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
6d20: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
6d30: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
6d40: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
6d50: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
6d60: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
6d70: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
6d80: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
6d90: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6da0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
6db0: 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65  Names, shortName
6dc0: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
6dd0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
6de0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
6df0: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
6e00: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
6e10: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
6e20: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
6e30: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
6e40: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
6e50: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
6e60: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d  olNamesSet || v=
6e70: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c  =0 || sqlite3Mal
6e80: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20 72 65  locFailed() ) re
6e90: 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e  turn;.  pParse->
6ea0: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
6eb0: 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28  .  fullNames = (
6ec0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
6ed0: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
6ee0: 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65  !=0;.  shortName
6ef0: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
6f00: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
6f10: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c  Names)!=0;.  sql
6f20: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
6f30: 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  ls(v, pEList->nE
6f40: 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  xpr);.  for(i=0;
6f50: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
6f60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
6f70: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c   *p;.    p = pEL
6f80: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
6f90: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
6fa0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
6fb0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
6fc0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
6fd0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
6fe0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
6ff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7000: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
7010: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
7020: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63  zName));.      c
7030: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
7040: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
7050: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c  _COLUMN && pTabL
7060: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ist ){.      Tab
7070: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
7080: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
7090: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
70a0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
70b0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69  or(j=0; j<pTabLi
70c0: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
70d0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
70e0: 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a  or!=p->iTable; j
70f0: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65  ++){}.      asse
7100: 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  rt( j<pTabList->
7110: 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54  nSrc );.      pT
7120: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
7130: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
7140: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
7150: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
7160: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
7170: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
7180: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
7190: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
71a0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
71b0: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
71c0: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
71d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
71e0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
71f0: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
7200: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68   }.      if( !sh
7210: 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c  ortNames && !ful
7220: 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61  lNames && p->spa
7230: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
7240: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  [0] ){.        s
7250: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
7260: 4e 61 6d 65 28 76 2c 20 69 2c 20 28 63 68 61 72  Name(v, i, (char
7270: 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e  *)p->span.z, p->
7280: 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d  span.n);.      }
7290: 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d  else if( fullNam
72a0: 65 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d  es || (!shortNam
72b0: 65 73 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  es && pTabList->
72c0: 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20  nSrc>1) ){.     
72d0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
72e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   0;.        char
72f0: 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20 20   *zTab;. .      
7300: 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73    zTab = pTabLis
7310: 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a  t->a[j].zAlias;.
7320: 20 20 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c          if( full
7330: 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30  Names || zTab==0
7340: 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e   ) zTab = pTab->
7350: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73  zName;.        s
7360: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
7370: 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e  &zName, zTab, ".
7380: 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29  ", zCol, (char*)
7390: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
73a0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
73b0: 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 50  e(v, i, zName, P
73c0: 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  3_DYNAMIC);.    
73d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
73e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
73f0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 43 6f  olName(v, i, zCo
7400: 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 29  l, strlen(zCol))
7410: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
7420: 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e  lse if( p->span.
7430: 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30  z && p->span.z[0
7440: 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ] ){.      sqlit
7450: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
7460: 28 76 2c 20 69 2c 20 28 63 68 61 72 2a 29 70 2d  (v, i, (char*)p-
7470: 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e  >span.z, p->span
7480: 2e 6e 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71  .n);.      /* sq
7490: 6c 69 74 65 33 56 64 62 65 43 6f 6d 70 72 65 73  lite3VdbeCompres
74a0: 73 53 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b  sSpace(v, addr);
74b0: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
74c0: 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b       char zName[
74d0: 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  30];.      asser
74e0: 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  t( p->op!=TK_COL
74f0: 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d  UMN || pTabList=
7500: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 70 72 69  =0 );.      spri
7510: 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75  ntf(zName, "colu
7520: 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20  mn%d", i+1);.   
7530: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
7540: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a  tColName(v, i, z
7550: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Name, 0);.    }.
7560: 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f    }.  generateCo
7570: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
7580: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
7590: 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  st);.}..#ifndef 
75a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
75b0: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
75c0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
75d0: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
75e0: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
75f0: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
7600: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
7610: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
7620: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
7630: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
7640: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
7650: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
7660: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
7670: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
7680: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
7690: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
76a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
76b0: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
76c0: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
76d0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
76e0: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
76f0: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
7700: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
7710: 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn z;.}.#endif 
7720: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
7730: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
7740: 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  /../*.** Forward
7750: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
7760: 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 53  static int prepS
7770: 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65 2a  electStmt(Parse*
7780: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a  , Select*);../*.
7790: 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43  ** Given a SELEC
77a0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e  T statement, gen
77b0: 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74  erate a Table st
77c0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
77d0: 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65  cribes.** the re
77e0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74  sult set of that
77f0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c   SELECT..*/.Tabl
7800: 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74  e *sqlite3Result
7810: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
7820: 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20  e *pParse, char 
7830: 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63  *zTabName, Selec
7840: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
7850: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e  able *pTab;.  in
7860: 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69  t i, j;.  ExprLi
7870: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f  st *pEList;.  Co
7880: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f  lumn *aCol, *pCo
7890: 6c 3b 0a 0a 20 20 69 66 28 20 70 72 65 70 53 65  l;..  if( prepSe
78a0: 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c  lectStmt(pParse,
78b0: 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20   pSelect) ){.   
78c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
78d0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
78e0: 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
78f0: 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 20 29 7b  , pSelect, 0) ){
7900: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7910: 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69   }.  pTab = sqli
7920: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
7930: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
7940: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
7950: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7960: 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
7970: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
7980: 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74  zTabName ? sqlit
7990: 65 53 74 72 44 75 70 28 7a 54 61 62 4e 61 6d 65  eStrDup(zTabName
79a0: 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20  ) : 0;.  pEList 
79b0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
79c0: 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  t;.  pTab->nCol 
79d0: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
79e0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
79f0: 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61  >nCol>0 );.  pTa
7a00: 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d  b->aCol = aCol =
7a10: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
7a20: 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c  izeof(pTab->aCol
7a30: 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20  [0])*pTab->nCol 
7a40: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  );.  for(i=0, pC
7a50: 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d  ol=aCol; i<pTab-
7a60: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
7a70: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
7a80: 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68 61 72 20  , *pR;.    char 
7a90: 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63 68 61 72  *zType;.    char
7aa0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61   *zName;.    cha
7ab0: 72 20 2a 7a 42 61 73 65 6e 61 6d 65 3b 0a 20 20  r *zBasename;.  
7ac0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
7ad0: 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20  ;.    int cnt;. 
7ae0: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
7af0: 4e 43 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20  NC;.    .    /* 
7b00: 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61  Get an appropria
7b10: 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  te name for the 
7b20: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20  column.    */.  
7b30: 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b    p = pEList->a[
7b40: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  i].pExpr;.    as
7b50: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d  sert( p->pRight=
7b60: 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d  =0 || p->pRight-
7b70: 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70  >token.z==0 || p
7b80: 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e  ->pRight->token.
7b90: 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69  z[0]!=0 );.    i
7ba0: 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  f( (zName = pELi
7bb0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21  st->a[i].zName)!
7bc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
7bd0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e  f the column con
7be0: 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61  tains an "AS <na
7bf0: 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65  me>" phrase, use
7c00: 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e   <name> as the n
7c10: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
7c20: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
7c30: 70 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  p(zName);.    }e
7c40: 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  lse if( p->op==T
7c50: 4b 5f 44 4f 54 20 0a 20 20 20 20 20 20 20 20 20  K_DOT .         
7c60: 20 20 20 20 20 26 26 20 28 70 52 3d 70 2d 3e 70       && (pR=p->p
7c70: 52 69 67 68 74 29 21 3d 30 20 26 26 20 70 52 2d  Right)!=0 && pR-
7c80: 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e  >token.z && pR->
7c90: 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  token.z[0] ){.  
7ca0: 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d      /* For colum
7cb0: 6e 73 20 6f 66 20 74 68 65 20 66 72 6f 6d 20 41  ns of the from A
7cc0: 2e 42 20 75 73 65 20 42 20 61 73 20 74 68 65 20  .B use B as the 
7cd0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e  name */.      zN
7ce0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
7cf0: 69 6e 74 66 28 22 25 54 22 2c 20 26 70 52 2d 3e  intf("%T", &pR->
7d00: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  token);.    }els
7d10: 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20  e if( p->span.z 
7d20: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
7d30: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 73 65 20  ){.      /* Use 
7d40: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
7d50: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
7d60: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74  expression as it
7d70: 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  s name */.      
7d80: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
7d90: 50 72 69 6e 74 66 28 22 25 54 22 2c 20 26 70 2d  Printf("%T", &p-
7da0: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  >span);.    }els
7db0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61  e{.      /* If a
7dc0: 6c 6c 20 65 6c 73 65 20 66 61 69 6c 73 2c 20 6d  ll else fails, m
7dd0: 61 6b 65 20 75 70 20 61 20 6e 61 6d 65 20 2a 2f  ake up a name */
7de0: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
7df0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 63  qlite3MPrintf("c
7e00: 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a  olumn%d", i+1);.
7e10: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7e20: 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
7e30: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
7e40: 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
7e50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
7e60: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ee(zName);.     
7e70: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
7e80: 62 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a 20 20  ble(0, pTab);.  
7e90: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7ea0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
7eb0: 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e   sure the column
7ec0: 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e   name is unique.
7ed0: 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73    If the name is
7ee0: 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20   not unique,.   
7ef0: 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74   ** append a int
7f00: 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65  eger to the name
7f10: 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f   so that it beco
7f20: 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20  mes unique..    
7f30: 2a 2f 0a 20 20 20 20 7a 42 61 73 65 6e 61 6d 65  */.    zBasename
7f40: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 66 6f   = zName;.    fo
7f50: 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20  r(j=cnt=0; j<i; 
7f60: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
7f70: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61  sqlite3StrICmp(a
7f80: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  Col[j].zName, zN
7f90: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
7fa0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
7fb0: 65 33 4d 50 72 69 6e 74 66 28 22 25 73 3a 25 64  e3MPrintf("%s:%d
7fc0: 22 2c 20 7a 42 61 73 65 6e 61 6d 65 2c 20 2b 2b  ", zBasename, ++
7fd0: 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 20  cnt);.        j 
7fe0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66  = -1;.        if
7ff0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ( zName==0 ) bre
8000: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
8010: 7d 0a 20 20 20 20 69 66 28 20 7a 42 61 73 65 6e  }.    if( zBasen
8020: 61 6d 65 21 3d 7a 4e 61 6d 65 20 29 7b 0a 20 20  ame!=zName ){.  
8030: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
8040: 42 61 73 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Basename);.    }
8050: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  .    pCol->zName
8060: 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f   = zName;..    /
8070: 2a 20 47 65 74 20 74 68 65 20 74 79 70 65 6e 61  * Get the typena
8080: 6d 65 2c 20 74 79 70 65 20 61 66 66 69 6e 69 74  me, type affinit
8090: 79 2c 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  y, and collating
80a0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
80b0: 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e  e.    ** column.
80c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
80d0: 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
80e0: 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
80f0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65  C.pSrcList = pSe
8100: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20  lect->pSrc;.    
8110: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 53 74  zType = sqliteSt
8120: 72 44 75 70 28 63 6f 6c 75 6d 6e 54 79 70 65 28  rDup(columnType(
8130: 26 73 4e 43 2c 20 70 29 29 3b 0a 20 20 20 20 70  &sNC, p));.    p
8140: 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a 54 79  Col->zType = zTy
8150: 70 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  pe;.    pCol->af
8160: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
8170: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
8180: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
8190: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
81a0: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
81b0: 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
81c0: 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d     pCol->zColl =
81d0: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 43   sqliteStrDup(pC
81e0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
81f0: 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69   }.  }.  pTab->i
8200: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74  PKey = -1;.  ret
8210: 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
8220: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 53 45 4c  ** Prepare a SEL
8230: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  ECT statement fo
8240: 72 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20  r processing by 
8250: 64 6f 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  doing the follow
8260: 69 6e 67 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a  ing.** things:.*
8270: 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b  *.**    (1)  Mak
8280: 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73  e sure VDBE curs
8290: 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
82a0: 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
82b0: 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20   every.**       
82c0: 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65    element of the
82d0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
82e0: 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c  .**    (2)  Fill
82f0: 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
8300: 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64  ->a[].pTab field
8310: 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  s in the SrcList
8320: 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20   that .**       
8330: 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63    defines FROM c
8340: 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65  lause.  When vie
8350: 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ws appear in the
8360: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a   FROM clause,.**
8370: 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54           fill pT
8380: 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c  abList->a[].pSel
8390: 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20  ect with a copy 
83a0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
83b0: 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
83c0: 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e     that implemen
83d0: 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20  ts the view.  A 
83e0: 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
83f0: 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43  the view's SELEC
8400: 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61  T.**         sta
8410: 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
8420: 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64  e can freely mod
8430: 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68  ify or delete th
8440: 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  at statement.** 
8450: 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20          without 
8460: 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d  worrying about m
8470: 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 72  essing up the pr
8480: 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65  esistent represe
8490: 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ntation.**      
84a0: 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a     of the view..
84b0: 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64  **.**    (3)  Ad
84c0: 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57  d terms to the W
84d0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61  HERE clause to a
84e0: 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41  ccomodate the NA
84f0: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a  TURAL keyword.**
8500: 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e           on join
8510: 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64  s and the ON and
8520: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
8530: 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   joins..**.**   
8540: 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c   (4)  Scan the l
8550: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ist of columns i
8560: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
8570: 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e   (pEList) lookin
8580: 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  g.**         for
8590: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
85a0: 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f  e "*" operator o
85b0: 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70  r the TABLE.* op
85c0: 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20  erator..**      
85d0: 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70     If found, exp
85e0: 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20  and each "*" to 
85f0: 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
8600: 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a  in every table.*
8610: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41  *         and TA
8620: 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72  BLE.* to be ever
8630: 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c  y column in TABL
8640: 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  E..**.** Return 
8650: 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  0 on success.  I
8660: 66 20 74 68 65 72 65 20 61 72 65 20 70 72 6f 62  f there are prob
8670: 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  lems, leave an e
8680: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
8690: 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
86a0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
86b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65  /.static int pre
86c0: 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73  pSelectStmt(Pars
86d0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
86e0: 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  t *p){.  int i, 
86f0: 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c  j, k, rc;.  SrcL
8700: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
8710: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
8720: 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  t;.  Table *pTab
8730: 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
8740: 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
8750: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
8760: 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c  ->pSrc==0 || sql
8770: 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
8780: 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  () ){.    return
8790: 20 31 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69   1;.  }.  pTabLi
87a0: 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
87b0: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
87c0: 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  st;..  /* Make s
87d0: 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ure cursor numbe
87e0: 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
87f0: 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74  igned to all ent
8800: 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65  ries in.  ** the
8810: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
8820: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
8830: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ment..  */.  sql
8840: 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
8850: 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
8860: 20 70 2d 3e 70 53 72 63 29 3b 0a 0a 20 20 2f 2a   p->pSrc);..  /*
8870: 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74   Look up every t
8880: 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  able named in th
8890: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
88a0: 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66   the select.  If
88b0: 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f  .  ** an entry o
88c0: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
88d0: 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  e is a subquery 
88e0: 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62  instead of a tab
88f0: 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a  le or view,.  **
8900: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74   then create a t
8910: 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
8920: 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63  tructure to desc
8930: 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72  ribe the subquer
8940: 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
8950: 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
8960: 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
8970: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
8980: 6f 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  om++){.    if( p
8990: 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b  From->pTab!=0 ){
89a0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
89b0: 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72  tatement has alr
89c0: 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72  eady been prepar
89d0: 65 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ed.  There is no
89e0: 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74   need.      ** t
89f0: 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f  o go further. */
8a00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
8a10: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  ==0 );.      ret
8a20: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
8a30: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d   if( pFrom->zNam
8a40: 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  e==0 ){.#ifndef 
8a50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
8a60: 55 45 52 59 0a 20 20 20 20 20 20 2f 2a 20 41 20  UERY.      /* A 
8a70: 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
8a80: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
8a90: 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
8aa0: 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
8ab0: 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20  >pSelect!=0 );. 
8ac0: 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e       if( pFrom->
8ad0: 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20  zAlias==0 ){.   
8ae0: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69       pFrom->zAli
8af0: 61 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73  as =.          s
8b00: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 73  qlite3MPrintf("s
8b10: 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25  qlite_subquery_%
8b20: 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 46 72 6f  p_", (void*)pFro
8b30: 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
8b40: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
8b50: 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
8b60: 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
8b70: 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
8b80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8b90: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
8ba0: 74 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 2d  t(pParse, pFrom-
8bb0: 3e 7a 41 6c 69 61 73 2c 20 70 46 72 6f 6d 2d 3e  >zAlias, pFrom->
8bc0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
8bd0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
8be0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
8bf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
8c00: 2a 20 54 68 65 20 69 73 54 72 61 6e 73 69 65 6e  * The isTransien
8c10: 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
8c20: 20 74 68 61 74 20 74 68 65 20 54 61 62 6c 65 20   that the Table 
8c30: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 62 65  structure has be
8c40: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e 61  en.      ** dyna
8c50: 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
8c60: 64 20 61 6e 64 20 6d 61 79 20 62 65 20 66 72 65  d and may be fre
8c70: 65 64 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 20  ed at any time. 
8c80: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
8c90: 0a 20 20 20 20 20 20 2a 2a 20 70 54 61 62 20 69  .      ** pTab i
8ca0: 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74  s not pointing t
8cb0: 6f 20 61 20 70 65 72 73 69 73 74 65 6e 74 20 74  o a persistent t
8cc0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
8cd0: 68 61 74 20 64 65 66 69 6e 65 73 0a 20 20 20 20  hat defines.    
8ce0: 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65    ** part of the
8cf0: 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20   schema. */.    
8d00: 20 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69    pTab->isTransi
8d10: 65 6e 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  ent = 1;.#endif.
8d20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8d30: 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
8d40: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
8d50: 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
8d60: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
8d70: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
8d80: 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
8d90: 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
8da0: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
8db0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
8dc0: 70 50 61 72 73 65 2c 70 46 72 6f 6d 2d 3e 7a 4e  pParse,pFrom->zN
8dd0: 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61  ame,pFrom->zData
8de0: 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  base);.      if(
8df0: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
8e00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8e10: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62      }.      pTab
8e20: 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 6e 64 65  ->nRef++;.#ifnde
8e30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
8e40: 45 57 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  EW.      if( pTa
8e50: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
8e60: 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63        /* We reac
8e70: 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e 61  h here if the na
8e80: 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20 72  med table is a r
8e90: 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a  eally a view */.
8ea0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
8eb0: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
8ec0: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
8ed0: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
8ee0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
8ef0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
8f00: 49 66 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  If pFrom->pSelec
8f10: 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20 77 65  t!=0 it means we
8f20: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
8f30: 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  h a.        ** v
8f40: 69 65 77 20 77 69 74 68 69 6e 20 61 20 76 69 65  iew within a vie
8f50: 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  w.  The SELECT s
8f60: 74 72 75 63 74 75 72 65 20 68 61 73 20 61 6c 72  tructure has alr
8f70: 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 20 20  eady been.      
8f80: 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79 20 74    ** copied by t
8f90: 68 65 20 6f 75 74 65 72 20 76 69 65 77 20 73 6f  he outer view so
8fa0: 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74 68 65   we can skip the
8fb0: 20 63 6f 70 79 20 73 74 65 70 20 68 65 72 65 0a   copy step here.
8fc0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
8fd0: 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20  e inner view..  
8fe0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
8ff0: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c   if( pFrom->pSel
9000: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
9010: 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
9020: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
9030: 63 74 44 75 70 28 70 54 61 62 2d 3e 70 53 65 6c  ctDup(pTab->pSel
9040: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ect);.        }.
9050: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
9060: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
9070: 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b  rocess NATURAL k
9080: 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20  eywords, and ON 
9090: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
90a0: 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f  s of joins..  */
90b0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f  .  if( sqlitePro
90c0: 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
90d0: 20 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   p) ) return 1;.
90e0: 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
90f0: 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
9100: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
9110: 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
9120: 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
9130: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
9140: 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
9150: 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
9160: 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
9170: 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
9180: 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
9190: 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
91a0: 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
91b0: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
91c0: 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65  h the TK_ALL ope
91d0: 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
91e0: 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
91f0: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
9200: 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ist..  ** The fo
9210: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
9220: 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
9230: 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65  the TK_ALL expre
9240: 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
9250: 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20  d.  ** each one 
9260: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
9270: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
9280: 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
9290: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
92a0: 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
92b0: 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
92c0: 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
92d0: 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
92e0: 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
92f0: 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
9300: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
9310: 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  k++){.    Expr *
9320: 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
9330: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
9340: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   pE->op==TK_ALL 
9350: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
9360: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
9370: 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26  && pE->pRight &&
9380: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
9390: 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20  =TK_ALL.        
93a0: 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26   && pE->pLeft &&
93b0: 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
93c0: 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20  TK_ID ) break;. 
93d0: 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69   }.  rc = 0;.  i
93e0: 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
93f0: 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
9400: 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
9410: 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
9420: 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
9430: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
9440: 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
9450: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
9460: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
9470: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
9480: 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
9490: 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
94a0: 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
94b0: 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
94c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
94d0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
94e0: 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
94f0: 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
9500: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
9510: 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65  t flags = pParse
9520: 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ->db->flags;.   
9530: 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d   int longNames =
9540: 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
9550: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
9560: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
9570: 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67             (flag
9580: 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
9590: 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20  ColNames)==0;.. 
95a0: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
95b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
95c0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
95d0: 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
95e0: 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
95f0: 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20  !=TK_ALL &&.    
9600: 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d         (pE->op!=
9610: 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
9620: 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70  ight==0 || pE->p
9630: 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  Right->op!=TK_AL
9640: 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  L) ){.        /*
9650: 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
9660: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
9670: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
9680: 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20  expanded..      
9690: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
96a0: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
96b0: 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20  istAppend(pNew, 
96c0: 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  a[k].pExpr, 0);.
96d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
96e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
96f0: 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
9700: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
9710: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
9720: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9730: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
9740: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
9750: 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
9760: 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d      a[k].zName =
9770: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
9780: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
9790: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
97a0: 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45   "*" or a "TABLE
97b0: 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  .*" and needs to
97c0: 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   be.        ** e
97d0: 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  xpanded. */.    
97e0: 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65      int tableSee
97f0: 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  n = 0;      /* S
9800: 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42  et to 1 when TAB
9810: 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  LE matches */.  
9820: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61        char *zTNa
9830: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
9840: 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
9850: 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
9860: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
9870: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65  K_DOT && pE->pLe
9880: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
9890: 7a 54 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  zTName = sqlite3
98a0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70  NameFromToken(&p
98b0: 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29  E->pLeft->token)
98c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
98d0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d  .          zTNam
98e0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
98f0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
9900: 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
9910: 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
9920: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
9930: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
9940: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
9950: 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
9960: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
9970: 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c  ame = pFrom->zAl
9980: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ias;.          i
9990: 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  f( zTabName==0 |
99a0: 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
99b0: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
99c0: 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
99d0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
99e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
99f0: 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 28 7a 54  f( zTName && (zT
9a00: 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61  abName==0 || zTa
9a10: 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a  bName[0]==0 || .
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
9a40: 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  zTName, zTabName
9a50: 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )!=0) ){.       
9a60: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
9a70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9a80: 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d       tableSeen =
9a90: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   1;.          fo
9aa0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
9ab0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
9ac0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
9ad0: 70 72 2c 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69  pr, *pLeft, *pRi
9ae0: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
9af0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
9b00: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
9b10: 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  me;..           
9b20: 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
9b30: 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
9b40: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
9b50: 4c 65 66 74 20 3d 20 26 70 54 61 62 4c 69 73 74  Left = &pTabList
9b60: 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20  ->a[i-1];.      
9b70: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 65          if( (pLe
9b80: 66 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ft->jointype & J
9b90: 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26  T_NATURAL)!=0 &&
9ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9bb0: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49           columnI
9bc0: 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 54 61 62  ndex(pLeft->pTab
9bd0: 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9bf0: 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a  * In a NATURAL j
9c00: 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f  oin, omit the jo
9c10: 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  in columns from 
9c20: 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
9c30: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e       ** table on
9c40: 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
9c60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
9c70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9c80: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9c90: 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 4c 65  3IdListIndex(pLe
9ca0: 66 74 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d  ft->pUsing, zNam
9cb0: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
9cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
9cd0: 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49   join with a USI
9ce0: 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20  NG clause, omit 
9cf0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20  columns in the. 
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
9d10: 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66  * using clause f
9d20: 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e  rom the table on
9d30: 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
9d50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
9d60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9d70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9d80: 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69     pRight = sqli
9d90: 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  te3Expr(TK_ID, 0
9da0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
9db0: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 3d       if( pRight=
9dc0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
9dd0: 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e          setToken
9de0: 28 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c  (&pRight->token,
9df0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
9e00: 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
9e10: 65 20 26 26 20 28 6c 6f 6e 67 4e 61 6d 65 73 20  e && (longNames 
9e20: 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  || pTabList->nSr
9e30: 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  c>1) ){.        
9e40: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71        pLeft = sq
9e50: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c  lite3Expr(TK_ID,
9e60: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
9e70: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
9e80: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
9e90: 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  DOT, pLeft, pRig
9ea0: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
9eb0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 3d        if( pExpr=
9ec0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
9ed0: 20 20 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b            setTok
9ee0: 65 6e 28 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  en(&pLeft->token
9ef0: 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  , zTabName);.   
9f00: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54 6f             setTo
9f10: 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73 70 61 6e  ken(&pExpr->span
9f20: 2c 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  , sqlite3MPrintf
9f30: 28 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61  ("%s.%s", zTabNa
9f40: 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  me, zName));.   
9f50: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
9f60: 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a  ->span.dyn = 1;.
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
9f80: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30  xpr->token.z = 0
9f90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
9fa0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d  pExpr->token.n =
9fb0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
9fc0: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64    pExpr->token.d
9fd0: 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  yn = 0;.        
9fe0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9ff0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
a000: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
a010: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70         pExpr->sp
a020: 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65  an = pExpr->toke
a030: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  n;.            }
a040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
a050: 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20   longNames ){.  
a060: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
a070: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
a080: 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 70  stAppend(pNew, p
a090: 45 78 70 72 2c 20 26 70 45 78 70 72 2d 3e 73 70  Expr, &pExpr->sp
a0a0: 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  an);.           
a0b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a0c0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
a0d0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
a0e0: 6e 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20  nd(pNew, pExpr, 
a0f0: 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b  &pRight->token);
a100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
a110: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a120: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
a130: 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
a140: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
a150: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
a160: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
a170: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
a180: 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
a190: 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  zTName);.       
a1a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a1b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
a1c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
a1d0: 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
a1e0: 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
a1f0: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
a200: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
a210: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
a220: 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  (zTName);.      
a230: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
a240: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
a250: 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  e(pEList);.    p
a260: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
a270: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
a280: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
a290: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
a2a0: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54  D_SELECT./*.** T
a2b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 6f  his routine asso
a2c0: 63 69 61 74 65 73 20 65 6e 74 72 69 65 73 20 69  ciates entries i
a2d0: 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 65 78  n an ORDER BY ex
a2e0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 77 69  pression list wi
a2f0: 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e  th.** columns in
a300: 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20   a result.  For 
a310: 65 61 63 68 20 4f 52 44 45 52 20 42 59 20 65 78  each ORDER BY ex
a320: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 6f 70  pression, the op
a330: 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  code of.** the t
a340: 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73  op-level node is
a350: 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43   changed to TK_C
a360: 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20 69 43  OLUMN and the iC
a370: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66 0a 2a  olumn value of.*
a380: 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  * the top-level 
a390: 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 69  node is filled i
a3a0: 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 6e 75  n with column nu
a3b0: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 54 61  mber and the iTa
a3c0: 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  ble.** value of 
a3d0: 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f  the top-level no
a3e0: 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  de is filled wit
a3f0: 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d 65 74  h iTable paramet
a400: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
a410: 72 65 20 61 72 65 20 70 72 69 6f 72 20 53 45 4c  re are prior SEL
a420: 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74 68 65  ECT clauses, the
a430: 79 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20  y are processed 
a440: 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63 68 0a  first.  A match.
a450: 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69 65 72  ** in an earlier
a460: 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20 70 72   SELECT takes pr
a470: 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20 61 20  ecedence over a 
a480: 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a 2a 2a  later SELECT..**
a490: 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20 74 68  .** Any entry th
a4a0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  at does not matc
a4b0: 68 20 69 73 20 66 6c 61 67 67 65 64 20 61 73 20  h is flagged as 
a4c0: 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6e  an error.  The n
a4d0: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f  umber.** of erro
a4e0: 72 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  rs is returned..
a4f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61  */.static int ma
a500: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
a510: 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
a520: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
a530: 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65 61 76   A place to leav
a540: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  e error messages
a550: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
a560: 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a  elect,        /*
a570: 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75 6c 74   Match to result
a580: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 69 73   columns of this
a590: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45 78 70   SELECT */.  Exp
a5a0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
a5b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
a5c0: 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f 20 6d  R BY values to m
a5d0: 61 74 63 68 20 61 67 61 69 6e 73 74 20 63 6f 6c  atch against col
a5e0: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  umns */.  int iT
a5f0: 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
a600: 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 69 73    /* Insert this
a610: 20 76 61 6c 75 65 20 69 6e 20 69 54 61 62 6c 65   value in iTable
a620: 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 43 6f   */.  int mustCo
a630: 6d 70 6c 65 74 65 20 20 20 20 20 20 20 20 2f 2a  mplete        /*
a640: 20 49 66 20 54 52 55 45 20 61 6c 6c 20 4f 52 44   If TRUE all ORD
a650: 45 52 20 42 59 73 20 6d 75 73 74 20 6d 61 74 63  ER BYs must matc
a660: 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  h */.){.  int nE
a670: 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c  rr = 0;.  int i,
a680: 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   j;.  ExprList *
a690: 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70  pEList;..  if( p
a6a0: 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 4f 72  Select==0 || pOr
a6b0: 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
a6c0: 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75 73 74 43  n 1;.  if( mustC
a6d0: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 66  omplete ){.    f
a6e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
a6f0: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
a700: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
a710: 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a  done = 0; }.  }.
a720: 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74    if( prepSelect
a730: 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53 65  Stmt(pParse, pSe
a740: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74  lect) ){.    ret
a750: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
a760: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
a770: 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 74 63   ){.    if( matc
a780: 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e  hOrderbyToColumn
a790: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
a7a0: 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65 72  ->pPrior, pOrder
a7b0: 42 79 2c 20 69 54 61 62 6c 65 2c 20 30 29 20 29  By, iTable, 0) )
a7c0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
a7d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45  ;.    }.  }.  pE
a7e0: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
a7f0: 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d  pEList;.  for(i=
a800: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
a810: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
a820: 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65  Expr *pE = pOrde
a830: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
a840: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
a850: 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64  -1;.    if( pOrd
a860: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
a870: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
a880: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
a890: 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
a8a0: 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ol) ){.      if(
a8b0: 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c   iCol<=0 || iCol
a8c0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
a8d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a8e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a8f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52 44  ,.          "ORD
a900: 45 52 20 42 59 20 70 6f 73 69 74 69 6f 6e 20 25  ER BY position %
a910: 64 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77  d should be betw
a920: 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a 20  een 1 and %d",. 
a930: 20 20 20 20 20 20 20 20 20 69 43 6f 6c 2c 20 70           iCol, p
a940: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
a950: 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20         nErr++;. 
a960: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a970: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a980: 21 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 20  !mustComplete ) 
a990: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
a9a0: 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  iCol--;.    }.  
a9b0: 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c 3c    for(j=0; iCol<
a9c0: 30 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e  0 && j<pEList->n
a9d0: 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
a9e0: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
a9f0: 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d  j].zName && (pE-
aa00: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45  >op==TK_ID || pE
aa10: 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29  ->op==TK_STRING)
aa20: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
aa30: 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c   *zName, *zLabel
aa40: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
aa50: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  = pEList->a[j].z
aa60: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 4c  Name;.        zL
aa70: 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  abel = sqlite3Na
aa80: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 45 2d  meFromToken(&pE-
aa90: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20  >token);.       
aaa0: 20 61 73 73 65 72 74 28 20 7a 4c 61 62 65 6c 21   assert( zLabel!
aab0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
aac0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
aad0: 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d  (zName, zLabel)=
aae0: 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  =0 ){ .         
aaf0: 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20   iCol = j;.     
ab00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
ab10: 69 74 65 46 72 65 65 28 7a 4c 61 62 65 6c 29 3b  iteFree(zLabel);
ab20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ab30: 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 73 71 6c  f( iCol<0 && sql
ab40: 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
ab50: 70 45 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  pE, pEList->a[j]
ab60: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
ab70: 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20     iCol = j;.   
ab80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
ab90: 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
aba0: 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f      pE->op = TK_
abb0: 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45  COLUMN;.      pE
abc0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
abd0: 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 54 61 62  ;.      pE->iTab
abe0: 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20  le = iTable;.   
abf0: 20 20 20 70 45 2d 3e 69 41 67 67 20 3d 20 2d 31     pE->iAgg = -1
ac00: 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
ac10: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b  ->a[i].done = 1;
ac20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
ac30: 43 6f 6c 3c 30 20 26 26 20 6d 75 73 74 43 6f 6d  Col<0 && mustCom
ac40: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 73  plete ){.      s
ac50: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
ac60: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
ac70: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75  ORDER BY term nu
ac80: 6d 62 65 72 20 25 64 20 64 6f 65 73 20 6e 6f 74  mber %d does not
ac90: 20 6d 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c   match any resul
aca0: 74 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b  t column", i+1);
acb0: 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  .      nErr++;. 
acc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
acd0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
ace0: 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20  Err;  .}.#endif 
acf0: 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
ad00: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
ad10: 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SELECT */../*.**
ad20: 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20   Get a VDBE for 
ad30: 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72  the given parser
ad40: 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74   context.  Creat
ad50: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
ad60: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20  ecessary..** If 
ad70: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
ad80: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
ad90: 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65   leave a message
ada0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56   in pParse..*/.V
adb0: 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56  dbe *sqlite3GetV
adc0: 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  dbe(Parse *pPars
add0: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
ade0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
adf0: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
ae00: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
ae10: 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  be = sqlite3Vdbe
ae20: 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64  Create(pParse->d
ae30: 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  b);.  }.  return
ae40: 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   v;.}.../*.** Co
ae50: 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74  mpute the iLimit
ae60: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65   and iOffset fie
ae70: 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lds of the SELEC
ae80: 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  T based on the.*
ae90: 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  * pLimit and pOf
aea0: 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73  fset expressions
aeb0: 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  .  pLimit and pO
aec0: 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65  ffset hold the e
aed0: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68  xpressions.** th
aee0: 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  at appear in the
aef0: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
af00: 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68  atement after th
af10: 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
af20: 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20  ET.** keywords. 
af30: 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73   Or NULL if thos
af40: 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f  e keywords are o
af50: 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61  mitted. iLimit a
af60: 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61  nd iOffset .** a
af70: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d  re the integer m
af80: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e  emory register n
af90: 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74  umbers for count
afa0: 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ers used to comp
afb0: 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69  ute .** the limi
afc0: 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49  t and offset.  I
afd0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69  f there is no li
afe0: 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65  mit and/or offse
aff0: 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d  t, then .** iLim
b000: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61  it and iOffset a
b010: 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  re negative..**.
b020: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b030: 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75  changes the valu
b040: 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64  es of iLimit and
b050: 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66   iOffset only if
b060: 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f  .** a limit or o
b070: 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  ffset is defined
b080: 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70   by pLimit and p
b090: 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20  Offset.  iLimit 
b0a0: 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73  and.** iOffset s
b0b0: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
b0c0: 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70  preset to approp
b0d0: 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61  riate default va
b0e0: 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79  lues.** (usually
b0f0: 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20   but not always 
b100: 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  -1) prior to cal
b110: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
b120: 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c  e..** Only if pL
b130: 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73  imit!=0 or pOffs
b140: 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d  et!=0 do the lim
b150: 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74  it registers get
b160: 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20  .** redefined.  
b170: 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
b180: 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73  erator uses this
b190: 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72   property to for
b1a0: 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20  ce.** the reuse 
b1b0: 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69  of the same limi
b1c0: 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67  t and offset reg
b1d0: 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75  isters across mu
b1e0: 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54  ltiple.** SELECT
b1f0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
b200: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
b210: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
b220: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
b230: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
b240: 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20  iBreak){.  Vdbe 
b250: 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c  *v = 0;.  int iL
b260: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  imit = 0;.  int 
b270: 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61  iOffset;.  int a
b280: 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 0a 20 20  ddr1, addr2;..  
b290: 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20  /* .  ** "LIMIT 
b2a0: 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73  -1" always shows
b2b0: 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72   all rows.  Ther
b2c0: 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63  e is some.  ** c
b2d0: 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74  ontraversy about
b2e0: 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   what the correc
b2f0: 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c  t behavior shoul
b300: 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  d be..  ** The c
b310: 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
b320: 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73  ation interprets
b330: 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65   "LIMIT 0" to me
b340: 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e  an.  ** no rows.
b350: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
b360: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
b370: 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20  iLimit = iLimit 
b380: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
b390: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
b3a0: 20 2b 3d 20 32 3b 0a 20 20 20 20 76 20 3d 20 73   += 2;.    v = s
b3b0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
b3c0: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
b3d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
b3e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b3f0: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69  e(pParse, p->pLi
b400: 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mit);.    sqlite
b410: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b420: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30  _MustBeInt, 0, 0
b430: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
b440: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
b450: 6d 53 74 6f 72 65 2c 20 69 4c 69 6d 69 74 2c 20  mStore, iLimit, 
b460: 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  0);.    VdbeComm
b470: 65 6e 74 28 28 76 2c 20 22 23 20 4c 49 4d 49 54  ent((v, "# LIMIT
b480: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
b490: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b4a0: 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72  p(v, OP_IfMemZer
b4b0: 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  o, iLimit, iBrea
b4c0: 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  k);.  }.  if( p-
b4d0: 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
b4e0: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66  p->iOffset = iOf
b4f0: 66 73 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  fset = pParse->n
b500: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 76 20 3d 20 73  Mem++;.    v = s
b510: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
b520: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
b530: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
b540: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b550: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66  e(pParse, p->pOf
b560: 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  fset);.    sqlit
b570: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b580: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20  P_MustBeInt, 0, 
b590: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
b5a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
b5b0: 65 6d 53 74 6f 72 65 2c 20 69 4f 66 66 73 65 74  emStore, iOffset
b5c0: 2c 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 29 3b  , p->pLimit==0);
b5d0: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
b5e0: 28 28 76 2c 20 22 23 20 4f 46 46 53 45 54 20 63  ((v, "# OFFSET c
b5f0: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 61  ounter"));.    a
b600: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
b610: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
b620: 4d 65 6d 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c  MemPos, iOffset,
b630: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
b640: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b650: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
b660: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b670: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
b680: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
b690: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
b6a0: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 69 66  , addr1);.    if
b6b0: 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ( p->pLimit ){. 
b6c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b6d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 2c  AddOp(v, OP_Add,
b6e0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
b6f0: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  }.  if( p->pLimi
b700: 74 20 29 7b 0a 20 20 20 20 61 64 64 72 31 20 3d  t ){.    addr1 =
b710: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b720: 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73  p(v, OP_IfMemPos
b730: 2c 20 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20  , iLimit, 0);.  
b740: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b750: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
b760: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
b770: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b780: 4d 65 6d 49 6e 74 2c 20 2d 31 2c 20 69 4c 69 6d  MemInt, -1, iLim
b790: 69 74 2b 31 29 3b 0a 20 20 20 20 61 64 64 72 32  it+1);.    addr2
b7a0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
b7b0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
b7c0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
b7d0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
b7e0: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71  , addr1);.    sq
b7f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b800: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
b810: 4c 69 6d 69 74 2b 31 2c 20 31 29 3b 0a 20 20 20  Limit+1, 1);.   
b820: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
b830: 20 22 23 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54   "# LIMIT+OFFSET
b840: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
b850: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
b860: 61 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  addr2);.  }.}../
b870: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
b880: 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
b890: 20 75 73 65 20 66 6f 72 20 73 6f 72 74 69 6e 67   use for sorting
b8a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b8b0: 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e   createSortingIn
b8c0: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
b8d0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 45 78  e, Select *p, Ex
b8e0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
b8f0: 29 7b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  ){.  if( pOrderB
b900: 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  y ){.    int add
b910: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
b920: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
b930: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 64  r==0 );.    pOrd
b940: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d  erBy->iECursor =
b950: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
b960: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
b970: 74 65 33 56 64 62 65 41 64 64 4f 70 28 70 50 61  te3VdbeAddOp(pPa
b980: 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4f  rse->pVdbe, OP_O
b990: 70 65 6e 56 69 72 74 75 61 6c 2c 0a 20 20 20 20  penVirtual,.    
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9b0: 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
b9c0: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64  ->iECursor, pOrd
b9d0: 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a  erBy->nExpr+1);.
b9e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
b9f0: 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20 3d  ddrOpenVirt[2] =
ba00: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 70 2d 3e 61  = -1 );.    p->a
ba10: 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20 3d  ddrOpenVirt[2] =
ba20: 20 61 64 64 72 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   addr;.  }.}../*
ba30: 0a 2a 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 61  .** The opcode a
ba40: 74 20 61 64 64 72 20 69 73 20 61 6e 20 4f 50 5f  t addr is an OP_
ba50: 4f 70 65 6e 56 69 72 74 75 61 6c 20 74 68 61 74  OpenVirtual that
ba60: 20 63 72 65 61 74 65 64 20 61 20 73 6f 72 74 69   created a sorti
ba70: 6e 67 0a 2a 2a 20 69 6e 64 65 78 20 74 68 61 20  ng.** index tha 
ba80: 77 65 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20  we ended up not 
ba90: 6e 65 65 64 69 6e 67 2e 20 20 54 68 69 73 20 72  needing.  This r
baa0: 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74  outine changes t
bab0: 68 61 74 0a 2a 2a 20 6f 70 63 6f 64 65 20 74 6f  hat.** opcode to
bac0: 20 4f 50 5f 4e 6f 6f 70 2e 0a 2a 2f 0a 73 74 61   OP_Noop..*/.sta
bad0: 74 69 63 20 76 6f 69 64 20 75 6e 63 72 65 61 74  tic void uncreat
bae0: 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 50 61  eSortingIndex(Pa
baf0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
bb00: 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65 20 2a   addr){.  Vdbe *
bb10: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
bb20: 65 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  e;.  VdbeOp *pOp
bb30: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
bb40: 74 4f 70 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  tOp(v, addr);.  
bb50: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
bb60: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 30 2c 20  eP3(v, addr, 0, 
bb70: 30 29 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64  0);.  pOp->opcod
bb80: 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 70  e = OP_Noop;.  p
bb90: 4f 70 2d 3e 70 31 20 3d 20 30 3b 0a 20 20 70 4f  Op->p1 = 0;.  pO
bba0: 70 2d 3e 70 32 20 3d 20 30 3b 0a 7d 0a 0a 23 69  p->p2 = 0;.}..#i
bbb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
bbc0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
bbd0: 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T./*.** Return t
bbe0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
bbf0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
bc00: 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74  e for the iCol-t
bc10: 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  h column of.** t
bc20: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f  he result set fo
bc30: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73  r the compound-s
bc40: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
bc50: 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  "p".  Return NUL
bc60: 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  L if.** the colu
bc70: 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c  mn has no defaul
bc80: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
bc90: 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ence..**.** The 
bca0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
bcb0: 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  ce for the compo
bcc0: 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61  und select is ta
bcd0: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ken from the.** 
bce0: 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
bcf0: 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61  f the select tha
bd00: 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  t has a collatin
bd10: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  g sequence..*/.s
bd20: 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d  tatic CollSeq *m
bd30: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
bd40: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
bd50: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
bd60: 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  iCol){.  CollSeq
bd70: 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d   *pRet;.  if( p-
bd80: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
bd90: 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  Ret = multiSelec
bda0: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
bdb0: 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c   p->pPrior, iCol
bdc0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
bdd0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
bde0: 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20  if( pRet==0 ){. 
bdf0: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
be00: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
be10: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
be20: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a  a[iCol].pExpr);.
be30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
be40: 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t;.}.#endif /* S
be50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
be60: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23  UND_SELECT */..#
be70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
be80: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
be90: 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CT./*.** This ro
bea0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
beb0: 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75 65  to process a que
bec0: 72 79 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c  ry that is reall
bed0: 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f  y the union.** o
bee0: 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  r intersection o
bef0: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  f two or more se
bf00: 70 61 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a  parate queries..
bf10: 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
bf20: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
bf30: 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
bf40: 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
bf50: 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
bf60: 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
bf70: 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
bf80: 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
bf90: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
bfa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
bfb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
bfc0: 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
bfd0: 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
bfe0: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
bff0: 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
c000: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
c010: 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
c020: 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
c030: 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
c040: 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
c050: 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
c060: 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
c070: 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
c080: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
c090: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
c0a0: 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
c0b0: 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
c0c0: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
c0d0: 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
c0e0: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
c0f0: 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
c100: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
c110: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
c120: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
c130: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
c140: 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
c150: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
c170: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
c180: 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
c190: 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
c1a0: 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
c1b0: 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
c1c0: 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
c1d0: 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
c1e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
c1f0: 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
c200: 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
c210: 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
c220: 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
c230: 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
c240: 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
c250: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
c260: 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
c270: 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
c280: 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
c290: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
c2a0: 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
c2b0: 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
c2c0: 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
c2d0: 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
c2e0: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
c2f0: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
c300: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
c310: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
c320: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
c330: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
c340: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
c350: 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
c360: 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 65  coded */.  int e
c370: 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Dest,           
c380: 20 2f 2a 20 5c 5f 5f 5f 20 20 53 74 6f 72 65 20   /* \___  Store 
c390: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 61 73  query results as
c3a0: 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 20 20   specified */.  
c3b0: 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20  int iParm,      
c3c0: 20 20 20 20 20 20 2f 2a 20 2f 20 20 20 20 20 62        /* /     b
c3d0: 79 20 74 68 65 73 65 20 74 77 6f 20 70 61 72 61  y these two para
c3e0: 6d 65 74 65 72 73 2e 20 20 20 20 20 20 20 20 20  meters.         
c3f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20  */.  char *aff  
c400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
c410: 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e   eDest is SRT_Un
c420: 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74  ion, the affinit
c430: 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
c440: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c450: 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73  _OK;   /* Succes
c460: 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75  s code from a su
c470: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65  broutine */.  Se
c480: 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
c490: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
c4a0: 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
c4b0: 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
c4c0: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
c4d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
c4e0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
c4f0: 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  s VDBE */.  int 
c500: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
c510: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
c520: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
c530: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78  sult set */.  Ex
c540: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
c550: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
c560: 20 42 59 20 63 6c 61 75 73 65 20 6f 6e 20 70 20   BY clause on p 
c570: 2a 2f 0a 20 20 69 6e 74 20 61 53 65 74 50 32 5b  */.  int aSetP2[
c580: 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  2];        /* Se
c590: 74 20 50 32 20 76 61 6c 75 65 20 6f 66 20 74 68  t P2 value of th
c5a0: 65 73 65 20 6f 70 20 74 6f 20 6e 75 6d 62 65 72  ese op to number
c5b0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20   of columns */. 
c5c0: 20 69 6e 74 20 6e 53 65 74 50 32 20 3d 20 30 3b   int nSetP2 = 0;
c5d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c5e0: 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61 53 65   of slots in aSe
c5f0: 74 50 32 5b 5d 20 75 73 65 64 20 2a 2f 0a 0a 20  tP2[] used */.. 
c600: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
c610: 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
c620: 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75  BY or LIMIT clau
c630: 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
c640: 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20  CTs.  Only.  ** 
c650: 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d  the last (right-
c660: 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20  most) SELECT in 
c670: 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
c680: 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
c690: 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
c6a0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e   if( p==0 || p->
c6b0: 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
c6c0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
c6d0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
c6e0: 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72  nd;.  }.  pPrior
c6f0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
c700: 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
c710: 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72 69  pRightmost!=pPri
c720: 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  or );.  assert( 
c730: 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f  pPrior->pRightmo
c740: 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73  st==p->pRightmos
c750: 74 20 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  t );.  if( pPrio
c760: 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  r->pOrderBy ){. 
c770: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
c780: 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52  sg(pParse,"ORDER
c790: 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c   BY clause shoul
c7a0: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
c7b0: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
c7c0: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
c7d0: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
c7e0: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
c7f0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c800: 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72    }.  if( pPrior
c810: 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
c820: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
c830: 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c  pParse,"LIMIT cl
c840: 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
c850: 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
c860: 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c  fore",.      sel
c870: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
c880: 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
c890: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
c8a0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
c8b0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
c8c0: 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 71 75   have a valid qu
c8d0: 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20  ery engine.  If 
c8e0: 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65  not, create a ne
c8f0: 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20  w one..  */.  v 
c900: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
c910: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
c920: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  v==0 ){.    rc =
c930: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
c940: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
c950: 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20   }..  /* Create 
c960: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
c970: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
c980: 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a  if necessary.  *
c990: 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
c9a0: 52 54 5f 56 69 72 74 75 61 6c 54 61 62 20 29 7b  RT_VirtualTab ){
c9b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
c9c0: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 61 73  pEList );.    as
c9d0: 73 65 72 74 28 20 6e 53 65 74 50 32 3c 73 69 7a  sert( nSetP2<siz
c9e0: 65 6f 66 28 61 53 65 74 50 32 29 2f 73 69 7a 65  eof(aSetP2)/size
c9f0: 6f 66 28 61 53 65 74 50 32 5b 30 5d 29 20 29 3b  of(aSetP2[0]) );
ca00: 0a 20 20 20 20 61 53 65 74 50 32 5b 6e 53 65 74  .    aSetP2[nSet
ca10: 50 32 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56  P2++] = sqlite3V
ca20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
ca30: 70 65 6e 56 69 72 74 75 61 6c 2c 20 69 50 61 72  penVirtual, iPar
ca40: 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44 65 73 74  m, 0);.    eDest
ca50: 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20   = SRT_Table;.  
ca60: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
ca70: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
ca80: 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
ca90: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
caa0: 20 20 2a 2f 0a 20 20 70 4f 72 64 65 72 42 79 20    */.  pOrderBy 
cab0: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
cac0: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
cad0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
cae0: 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L: {.      if( p
caf0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
cb00: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
cb10: 20 30 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   0;.        asse
cb20: 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69  rt( !pPrior->pLi
cb30: 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  mit );.        p
cb40: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20  Prior->pLimit = 
cb50: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
cb60: 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73     pPrior->pOffs
cb70: 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
cb80: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
cb90: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
cba0: 73 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65 73  se, pPrior, eDes
cbb0: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
cbc0: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20  0, aff);.       
cbd0: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
cbe0: 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73          p->pOffs
cbf0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
cc00: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
cc10: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
cc20: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
cc30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
cc40: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
cc50: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
cc60: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
cc70: 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73          p->iOffs
cc80: 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
cc90: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66  fset;.        if
cca0: 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29  ( p->iLimit>=0 )
ccb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72  {.          addr
ccc0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ccd0: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a  dOp(v, OP_IfMemZ
cce0: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
ccf0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  0);.          Vd
cd00: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
cd10: 20 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c   Jump ahead if L
cd20: 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
cd30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cd40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
cd50: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
cd60: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30   eDest, iParm, 0
cd70: 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
cd80: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
cd90: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
cda0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
cdb0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
cdc0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
cdd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
cde0: 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20  f( addr ){.     
cdf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ce00: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
ce10: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ce20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ce30: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72    }.      /* For
ce40: 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f   UNION ALL ... O
ce50: 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68 72  RDER BY fall thr
ce60: 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
ce70: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20   case */.    }. 
ce80: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
ce90: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  T:.    case TK_U
cea0: 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NION: {.      in
ceb0: 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f  t unionTab;    /
cec0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
ced0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
cee0: 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
cef0: 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69  esult */.      i
cf00: 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20  nt op = 0;      
cf10: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52  /* One of the SR
cf20: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  T_ operations to
cf30: 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a   apply to self *
cf40: 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  /.      int prio
cf50: 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rOp;     /* The 
cf60: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74  SRT_ operation t
cf70: 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72  o apply to prior
cf80: 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20   selects */.    
cf90: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
cfa0: 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76  *pOffset; /* Sav
cfb0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
cfc0: 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f  nLimit and p->nO
cfd0: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69  ffset */.      i
cfe0: 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20  nt addr;..      
cff0: 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d  priorOp = p->op=
d000: 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61  =TK_ALL ? SRT_Ta
d010: 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b  ble : SRT_Union;
d020: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
d030: 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70 4f 72  ==priorOp && pOr
d040: 64 65 72 42 79 3d 3d 30 20 26 26 20 21 70 2d 3e  derBy==0 && !p->
d050: 70 4c 69 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f  pLimit && !p->pO
d060: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  ffset ){.       
d070: 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65   /* We can reuse
d080: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
d090: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  le generated by 
d0a0: 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a  a SELECT to our.
d0b0: 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74          ** right
d0c0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
d0d0: 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
d0e0: 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  iParm;.      }el
d0f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  se{.        /* W
d100: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
d110: 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
d120: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
d130: 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
d140: 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
d150: 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
d160: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
d170: 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
d180: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
d190: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26   if( pOrderBy &&
d1a0: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
d1b0: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c  olumn(pParse, p,
d1c0: 20 70 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e   pOrderBy, union
d1d0: 54 61 62 2c 31 29 20 29 7b 0a 20 20 20 20 20 20  Tab,1) ){.      
d1e0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
d1f0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
d200: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
d210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
d220: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
d230: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
d240: 6e 56 69 72 74 75 61 6c 2c 20 75 6e 69 6f 6e 54  nVirtual, unionT
d250: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
d260: 69 66 28 20 70 72 69 6f 72 4f 70 3d 3d 53 52 54  if( priorOp==SRT
d270: 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  _Table ){.      
d280: 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 65 74      assert( nSet
d290: 50 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32  P2<sizeof(aSetP2
d2a0: 29 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b  )/sizeof(aSetP2[
d2b0: 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  0]) );.         
d2c0: 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b   aSetP2[nSetP2++
d2d0: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
d2e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d2f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
d300: 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20 3d 3d  drOpenVirt[0] ==
d310: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20   -1 );.         
d320: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74   p->addrOpenVirt
d330: 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
d340: 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d        p->pRightm
d350: 6f 73 74 2d 3e 75 73 65 73 56 69 72 74 20 3d 20  ost->usesVirt = 
d360: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
d370: 20 20 20 20 20 63 72 65 61 74 65 53 6f 72 74 69       createSorti
d380: 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  ngIndex(pParse, 
d390: 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p, pOrderBy);.  
d3a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
d3b0: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
d3c0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
d3d0: 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
d3e0: 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
d3f0: 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  eft.      */.   
d400: 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
d410: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a  or->pOrderBy );.
d420: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d430: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
d440: 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70   pPrior, priorOp
d450: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30  , unionTab, 0, 0
d460: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
d470: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
d480: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
d490: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
d4a0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
d4b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
d4c0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
d4d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69      */.      swi
d4e0: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
d4f0: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45         case TK_E
d500: 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54  XCEPT:  op = SRT
d510: 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b  _Except;   break
d520: 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
d530: 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d  TK_UNION:   op =
d540: 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62   SRT_Union;    b
d550: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
d560: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
d570: 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20  op = SRT_Table; 
d580: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d590: 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
d5a0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  r = 0;.      p->
d5b0: 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
d5c0: 20 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f      p->disallowO
d5d0: 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
d5e0: 79 21 3d 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d  y!=0;.      pLim
d5f0: 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
d600: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
d610: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
d620: 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
d630: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
d640: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  t = 0;.      rc 
d650: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
d660: 70 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75  pParse, p, op, u
d670: 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30  nionTab, 0, 0, 0
d680: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d  , aff);.      p-
d690: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
d6a0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
d6b0: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
d6c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d6d0: 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69  rDelete(p->pLimi
d6e0: 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
d6f0: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
d700: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
d710: 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   pOffset;.      
d720: 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a  p->iLimit = -1;.
d730: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
d740: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28   = -1;.      if(
d750: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
d760: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
d770: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a  _end;.      }...
d780: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
d790: 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   the data in the
d7a0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
d7b0: 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
d7c0: 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  orm.      ** it 
d7d0: 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
d7e0: 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
d7f0: 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20   */      .      
d800: 69 66 28 20 65 44 65 73 74 21 3d 70 72 69 6f 72  if( eDest!=prior
d810: 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d  Op || unionTab!=
d820: 69 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  iParm ){.       
d830: 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
d840: 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
d850: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
d860: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  EList );.       
d870: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
d880: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
d890: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
d8a0: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
d8b0: 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  , 0, p->pEList);
d8c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d8d0: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
d8e0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
d8f0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
d900: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
d910: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
d920: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
d930: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
d940: 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
d950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d960: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
d970: 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
d980: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
d990: 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
d9a0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
d9b0: 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63  r(v);.        rc
d9c0: 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f   = selectInnerLo
d9d0: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
d9e0: 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61  >pEList, unionTa
d9f0: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  b, p->pEList->nE
da00: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da20: 20 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20    pOrderBy, -1, 
da30: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20  eDest, iParm, . 
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da50: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e              iCon
da60: 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20  t, iBreak, 0);. 
da70: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
da80: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
da90: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  1;.          got
daa0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
dab0: 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
dac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dad0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
dae0: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
daf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
db00: 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e  p(v, OP_Next, un
db10: 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b  ionTab, iStart);
db20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
db30: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
db40: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
db50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
db60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
db70: 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
db80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
db90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
dba0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
dbb0: 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  T: {.      int t
dbc0: 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20  ab1, tab2;.     
dbd0: 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
dbe0: 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
dbf0: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
dc00: 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  *pOffset;.      
dc10: 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20  int addr;..     
dc20: 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73   /* INTERSECT is
dc30: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
dc40: 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65  the others since
dc50: 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20   it requires.   
dc60: 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72     ** two tempor
dc70: 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e  ary tables.  Hen
dc80: 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77  ce it has its ow
dc90: 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20  n case.  Begin. 
dca0: 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63       ** by alloc
dcb0: 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73  ating the tables
dcc0: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20   we will need.. 
dcd0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61       */.      ta
dce0: 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b1 = pParse->nTa
dcf0: 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20  b++;.      tab2 
dd00: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
dd10: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
dd20: 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64  erBy && matchOrd
dd30: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61  erbyToColumn(pPa
dd40: 72 73 65 2c 70 2c 70 4f 72 64 65 72 42 79 2c 74  rse,p,pOrderBy,t
dd50: 61 62 31 2c 31 29 20 29 7b 0a 20 20 20 20 20 20  ab1,1) ){.      
dd60: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
dd70: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
dd80: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
dd90: 0a 20 20 20 20 20 20 63 72 65 61 74 65 53 6f 72  .      createSor
dda0: 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65  tingIndex(pParse
ddb0: 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , p, pOrderBy);.
ddc0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
ddd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
dde0: 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c  , OP_OpenVirtual
ddf0: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
de00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
de10: 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20 3d 3d 20  rOpenVirt[0] == 
de20: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
de30: 64 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20 3d  ddrOpenVirt[0] =
de40: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
de50: 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73  pRightmost->uses
de60: 56 69 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Virt = 1;.      
de70: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
de80: 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
de90: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
dea0: 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
deb0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
dec0: 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
ded0: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
dee0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
def0: 65 2c 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55  e, pPrior, SRT_U
df00: 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30  nion, tab1, 0, 0
df10: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
df20: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
df30: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
df40: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
df50: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
df60: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
df70: 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  ECT into tempora
df80: 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a  ry table "tab2".
df90: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
dfa0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
dfb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
dfc0: 6e 56 69 72 74 75 61 6c 2c 20 74 61 62 32 2c 20  nVirtual, tab2, 
dfd0: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
dfe0: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72  ( p->addrOpenVir
dff0: 74 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  t[1] == -1 );.  
e000: 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56      p->addrOpenV
e010: 69 72 74 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  irt[1] = addr;. 
e020: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
e030: 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
e040: 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
e050: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
e060: 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
e070: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
e080: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
e090: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
e0a0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
e0b0: 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69  arse, p, SRT_Uni
e0c0: 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c 20  on, tab2, 0, 0, 
e0d0: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70  0, aff);.      p
e0e0: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
e0f0: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
e100: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
e110: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
e120: 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
e130: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
e140: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
e150: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
e160: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
e170: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
e180: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
e190: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
e1a0: 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
e1b0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
e1c0: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
e1d0: 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
e1e0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
e1f0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
e200: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
e210: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
e220: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
e230: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
e240: 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74  se, 0, p->pEList
e250: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e260: 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
e270: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
e280: 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  );.      iCont =
e290: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
e2a0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
e2b0: 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
e2c0: 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
e2d0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
e2e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e2f0: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
e300: 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ab1, iBreak);.  
e310: 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
e320: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
e330: 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31   OP_RowKey, tab1
e340: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
e350: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e360: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62  OP_NotFound, tab
e370: 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  2, iCont);.     
e380: 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65   rc = selectInne
e390: 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
e3a0: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31   p->pEList, tab1
e3b0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
e3c0: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3e0: 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65   pOrderBy, -1, e
e3f0: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20  Dest, iParm, .  
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e410: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74             iCont
e420: 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20  , iBreak, 0);.  
e430: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
e440: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
e450: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
e460: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
e470: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
e480: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
e490: 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
e4a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e4b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
e4c0: 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a   tab1, iStart);.
e4d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e4e0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
e4f0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
e500: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e510: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
e520: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
e530: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
e540: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31  , OP_Close, tab1
e550: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
e560: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
e570: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
e580: 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
e590: 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
e5a0: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
e5b0: 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
e5c0: 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
e5d0: 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
e5e0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
e5f0: 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
e600: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   );.  if( p->pEL
e610: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69  ist->nExpr!=pPri
e620: 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
e630: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
e640: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
e650: 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
e660: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
e670: 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
e680: 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
e690: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
e6a0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
e6b0: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
e6c0: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
e6d0: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
e6e0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
e6f0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75  .  /* Set the nu
e700: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
e710: 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
e720: 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20  les.  */.  nCol 
e730: 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
e740: 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 65  pr;.  while( nSe
e750: 74 50 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tP2 ){.    sqlit
e760: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
e770: 2c 20 61 53 65 74 50 32 5b 2d 2d 6e 53 65 74 50  , aSetP2[--nSetP
e780: 32 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a  2], nCol);.  }..
e790: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
e7a0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
e7b0: 20 75 73 65 64 20 62 79 20 65 69 74 68 65 72 20   used by either 
e7c0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
e7d0: 75 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61  use or.  ** by a
e7e0: 6e 79 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ny temporary tab
e7f0: 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d  les needed to im
e800: 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70  plement the comp
e810: 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
e820: 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79  * Attach the Key
e830: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
e840: 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  o all temporary 
e850: 74 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20  tables.  Invoke 
e860: 74 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42  the.  ** ORDER B
e870: 59 20 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20  Y processing if 
e880: 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
e890: 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a  R BY clause..  *
e8a0: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74  *.  ** This sect
e8b0: 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68  ion is run by th
e8c0: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
e8d0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
e8e0: 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20  ly..  ** SELECT 
e8f0: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68  statements to th
e900: 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b  e left always sk
e910: 69 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54  ip this part.  T
e920: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
e930: 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20  ** SELECT might 
e940: 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70  also skip this p
e950: 61 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f  art if it has no
e960: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
e970: 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d   and.  ** no tem
e980: 70 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71  p tables are req
e990: 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  uired..  */.  if
e9a0: 28 20 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d  ( pOrderBy || p-
e9b0: 3e 75 73 65 73 56 69 72 74 20 29 7b 0a 20 20 20  >usesVirt ){.   
e9c0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e9e0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
e9f0: 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
ea00: 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  KeyInfo;        
ea10: 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
ea20: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
ea30: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
ea40: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
ea50: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
ea60: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
ea70: 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20   through SELECT 
ea80: 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
ea90: 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f    CollSeq **apCo
eaa0: 6c 6c 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  ll;.    CollSeq 
eab0: 2a 2a 61 43 6f 70 79 3b 0a 0a 20 20 20 20 61 73  **aCopy;..    as
eac0: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d  sert( p->pRightm
ead0: 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 4b  ost==p );.    pK
eae0: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d  eyInfo = sqliteM
eaf0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4b  alloc(sizeof(*pK
eb00: 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 32 2a 73  eyInfo)+nCol*2*s
eb10: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20  izeof(CollSeq*) 
eb20: 2b 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  + nCol);.    if(
eb30: 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
eb40: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
eb50: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
eb60: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
eb70: 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  nd;.    }..    p
eb80: 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45  KeyInfo->enc = E
eb90: 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  NC(pParse->db);.
eba0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46      pKeyInfo->nF
ebb0: 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20  ield = nCol;..  
ebc0: 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c    for(i=0, apCol
ebd0: 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  l=pKeyInfo->aCol
ebe0: 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
ebf0: 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20  apColl++){.     
ec00: 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69   *apColl = multi
ec10: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
ec20: 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
ec30: 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c     if( 0==*apCol
ec40: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70  l ){.        *ap
ec50: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
ec60: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
ec70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
ec80: 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
ec90: 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
eca0: 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
ecb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
ecc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
ecd0: 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61   addr = pLoop->a
ece0: 64 64 72 4f 70 65 6e 56 69 72 74 5b 69 5d 3b 0a  ddrOpenVirt[i];.
ecf0: 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72          if( addr
ed00: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
ed10: 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75  /* If [0] is unu
ed20: 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20  sed then [1] is 
ed30: 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f  also unused.  So
ed40: 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20   we can.        
ed50: 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65    ** always safe
ed60: 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e  ly abort as soon
ed70: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e   as the first un
ed80: 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75  used slot is fou
ed90: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
eda0: 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
edb0: 64 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d 3c 30  ddrOpenVirt[1]<0
edc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   );.          br
edd0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
ede0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
edf0: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
ee00: 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  dr, nCol);.     
ee10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
ee20: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
ee30: 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
ee40: 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P3_KEYINFO);.  
ee50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
ee60: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
ee70: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
ee80: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 54  prList_item *pOT
ee90: 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  erm = pOrderBy->
eea0: 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72  a;.      int nOr
eeb0: 64 65 72 42 79 45 78 70 72 20 3d 20 70 4f 72 64  derByExpr = pOrd
eec0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
eed0: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
eee0: 20 20 20 75 38 20 2a 70 53 6f 72 74 4f 72 64 65     u8 *pSortOrde
eef0: 72 3b 0a 0a 20 20 20 20 20 20 61 43 6f 70 79 20  r;..      aCopy 
ef00: 3d 20 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  = &pKeyInfo->aCo
ef10: 6c 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  ll[nCol];.      
ef20: 70 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65  pSortOrder = pKe
ef30: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
ef40: 72 20 3d 20 28 75 38 2a 29 26 61 43 6f 70 79 5b  r = (u8*)&aCopy[
ef50: 6e 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  nCol];.      mem
ef60: 63 70 79 28 61 43 6f 70 79 2c 20 70 4b 65 79 49  cpy(aCopy, pKeyI
ef70: 6e 66 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e 43 6f 6c  nfo->aColl, nCol
ef80: 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
ef90: 29 29 3b 0a 20 20 20 20 20 20 61 70 43 6f 6c 6c  ));.      apColl
efa0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
efb0: 6c 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ll;.      for(i=
efc0: 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 45 78 70  0; i<nOrderByExp
efd0: 72 3b 20 69 2b 2b 2c 20 70 4f 54 65 72 6d 2b 2b  r; i++, pOTerm++
efe0: 2c 20 61 70 43 6f 6c 6c 2b 2b 2c 20 70 53 6f 72  , apColl++, pSor
eff0: 74 4f 72 64 65 72 2b 2b 29 7b 0a 20 20 20 20 20  tOrder++){.     
f000: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
f010: 20 70 4f 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a   pOTerm->pExpr;.
f020: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
f030: 61 6d 65 20 3d 20 70 4f 54 65 72 6d 2d 3e 7a 4e  ame = pOTerm->zN
f040: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ame;.        ass
f050: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
f060: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
f070: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c  pr->iColumn<nCol
f080: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
f090: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
f0a0: 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 73 71 6c     *apColl = sql
f0b0: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
f0c0: 71 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c  q(pParse, zName,
f0d0: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65   -1);.        }e
f0e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  lse{.          *
f0f0: 61 70 43 6f 6c 6c 20 3d 20 61 43 6f 70 79 5b 70  apColl = aCopy[p
f100: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a  Expr->iColumn];.
f110: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f120: 20 20 2a 70 53 6f 72 74 4f 72 64 65 72 20 3d 20    *pSortOrder = 
f130: 70 4f 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65  pOTerm->sortOrde
f140: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
f150: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
f160: 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20  htmost==p );.   
f170: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
f180: 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 3e 3d 30  drOpenVirt[2]>=0
f190: 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   );.      addr =
f1a0: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74   p->addrOpenVirt
f1b0: 5b 32 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [2];.      sqlit
f1c0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
f1d0: 2c 20 61 64 64 72 2c 20 70 2d 3e 70 45 4c 69 73  , addr, p->pELis
f1e0: 74 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20  t->nExpr+2);.   
f1f0: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69     pKeyInfo->nFi
f200: 65 6c 64 20 3d 20 6e 4f 72 64 65 72 42 79 45 78  eld = nOrderByEx
f210: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
f220: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
f230: 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b   addr, (char*)pK
f240: 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
f250: 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
f260: 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b     pKeyInfo = 0;
f270: 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53  .      generateS
f280: 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
f290: 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  p, v, p->pEList-
f2a0: 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69  >nExpr, eDest, i
f2b0: 50 61 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Parm);.    }..  
f2c0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65    sqliteFree(pKe
f2d0: 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c  yInfo);.  }..mul
f2e0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  ti_select_end:. 
f2f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
f300: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
f310: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
f320: 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECT */..#ifndef 
f330: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
f340: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f  ./*.** Scan thro
f350: 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69  ugh the expressi
f360: 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61  on pExpr.  Repla
f370: 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ce every referen
f380: 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d  ce to.** a colum
f390: 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
f3a0: 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20  r iTable with a 
f3b0: 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
f3c0: 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20  umn-th.** entry 
f3d0: 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
f3e0: 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
f3f0: 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
f400: 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
f410: 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ged.).**.** This
f420: 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
f430: 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
f440: 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
f450: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
f460: 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
f470: 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
f480: 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
f490: 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
f4a0: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
f4b0: 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
f4c0: 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
f4d0: 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
f4e0: 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
f4f0: 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
f500: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
f510: 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ake the necessar
f520: 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
f530: 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69   pExpr so that i
f540: 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
f550: 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  y to the source 
f560: 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20  table.** of the 
f570: 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20  subquery rather 
f580: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
f590: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
f5a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
f5b0: 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70  ubstExprList(Exp
f5c0: 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72 4c  rList*,int,ExprL
f5d0: 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61  ist*);  /* Forwa
f5e0: 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69  rd Decl */.stati
f5f0: 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
f600: 63 74 28 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74  ct(Select *, int
f610: 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 20 20  , ExprList *);  
f620: 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20  /* Forward Decl 
f630: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
f640: 75 62 73 74 45 78 70 72 28 45 78 70 72 20 2a 70  ubstExpr(Expr *p
f650: 45 78 70 72 2c 20 69 6e 74 20 69 54 61 62 6c 65  Expr, int iTable
f660: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
f670: 73 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  st){.  if( pExpr
f680: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
f690: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
f6a0: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
f6b0: 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
f6c0: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
f6d0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
f6e0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
f6f0: 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
f700: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
f710: 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61  r *pNew;.      a
f720: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
f730: 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
f740: 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  mn<pEList->nExpr
f750: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
f760: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
f770: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
f780: 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ht==0 && pExpr->
f790: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
f7a0: 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d    pNew = pEList-
f7b0: 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
f7c0: 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  n].pExpr;.      
f7d0: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20  assert( pNew!=0 
f7e0: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
f7f0: 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20  op = pNew->op;. 
f800: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
f810: 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a  pr->pLeft==0 );.
f820: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
f830: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
f840: 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74 29  Dup(pNew->pLeft)
f850: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f860: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
f870: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
f880: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
f890: 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70  3ExprDup(pNew->p
f8a0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73  Right);.      as
f8b0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69  sert( pExpr->pLi
f8c0: 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  st==0 );.      p
f8d0: 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71  Expr->pList = sq
f8e0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
f8f0: 28 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20  (pNew->pList);. 
f900: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
f910: 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c  le = pNew->iTabl
f920: 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  e;.      pExpr->
f930: 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e  iColumn = pNew->
f940: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
f950: 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65  Expr->iAgg = pNe
f960: 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73  w->iAgg;.      s
f970: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
f980: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26  &pExpr->token, &
f990: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  pNew->token);.  
f9a0: 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
f9b0: 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 73 70 61  Copy(&pExpr->spa
f9c0: 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b  n, &pNew->span);
f9d0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 53  .      pExpr->pS
f9e0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
f9f0: 65 6c 65 63 74 44 75 70 28 70 4e 65 77 2d 3e 70  electDup(pNew->p
fa00: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 70  Select);.      p
fa10: 45 78 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e  Expr->flags = pN
fa20: 65 77 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ew->flags;.    }
fa30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75  .  }else{.    su
fa40: 62 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70  bstExpr(pExpr->p
fa50: 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  Left, iTable, pE
fa60: 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
fa70: 45 78 70 72 28 70 45 78 70 72 2d 3e 70 52 69 67  Expr(pExpr->pRig
fa80: 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ht, iTable, pELi
fa90: 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 53 65  st);.    substSe
faa0: 6c 65 63 74 28 70 45 78 70 72 2d 3e 70 53 65 6c  lect(pExpr->pSel
fab0: 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ect, iTable, pEL
fac0: 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
fad0: 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70  xprList(pExpr->p
fae0: 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
faf0: 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
fb00: 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
fb10: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
fb20: 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69 54 61 62  *pList, int iTab
fb30: 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45  le, ExprList *pE
fb40: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
fb50: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
fb60: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
fb70: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
fb80: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75  pr; i++){.    su
fb90: 62 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61  bstExpr(pList->a
fba0: 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
fbb0: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
fbc0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
fbd0: 62 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74  bstSelect(Select
fbe0: 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c   *p, int iTable,
fbf0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
fc00: 74 29 7b 0a 20 20 69 66 28 20 21 70 20 29 20 72  t){.  if( !p ) r
fc10: 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78  eturn;.  substEx
fc20: 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
fc30: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
fc40: 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
fc50: 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  st(p->pGroupBy, 
fc60: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
fc70: 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
fc80: 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54  (p->pOrderBy, iT
fc90: 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
fca0: 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48   substExpr(p->pH
fcb0: 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70  aving, iTable, p
fcc0: 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
fcd0: 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69  xpr(p->pWhere, i
fce0: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
fcf0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
fd00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
fd10: 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 6e 64  _VIEW) */..#ifnd
fd20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
fd30: 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  IEW./*.** This r
fd40: 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
fd50: 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
fd60: 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74  eries in order t
fd70: 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75  o speed.** execu
fd80: 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e  tion.  It return
fd90: 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
fda0: 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
fdb0: 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a   no flattening.*
fdc0: 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  * occurs..**.** 
fdd0: 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  To understand th
fde0: 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61  e concept of fla
fdf0: 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65  ttening, conside
fe00: 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  r the following.
fe10: 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  ** query:.**.** 
fe20: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
fe30: 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53  M (SELECT x+y AS
fe40: 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
fe50: 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e   z<100) WHERE a>
fe60: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  5.**.** The defa
fe70: 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65  ult way of imple
fe80: 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65  menting this que
fe90: 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65  ry is to execute
fea0: 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79   the.** subquery
feb0: 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65   first and store
fec0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
fed0: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
fee0: 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74  e, then.** run t
fef0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f  he outer query o
ff00: 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
ff10: 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65   table.  This re
ff20: 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61  quires two.** pa
ff30: 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61  sses over the da
ff40: 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ta.  Furthermore
ff50: 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65  , because the te
ff60: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a  mporary table.**
ff70: 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c   has no indices,
ff80: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
ff90: 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e on the outer q
ffa0: 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  uery cannot be.*
ffb0: 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a  * optimized..**.
ffc0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ffd0: 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72  attempts to rewr
ffe0: 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68  ite queries such
fff0: 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e   as the above in
10000 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66  to.** a single f
10010 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65  lat select, like
10020 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
10030 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61   SELECT x+y AS a
10040 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
10050 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a  <100 AND a>5.**.
10060 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
10070 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73  rated for this s
10080 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76  impification giv
10090 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  es the same resu
100a0 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68  lt.** but only h
100b0 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  as to scan the d
100c0 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62  ata once.  And b
100d0 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d  ecause indices m
100e0 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f  ight .** exist o
100f0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20  n the table t1, 
10100 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20  a complete scan 
10110 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68  of the data migh
10120 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e  t be.** avoided.
10130 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e  .**.** Flattenin
10140 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  g is only attemp
10150 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  ted if all of th
10160 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
10170 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
10180 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
10190 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
101a0 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
101b0 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a  use aggregates..
101c0 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65  **.**   (2)  The
101d0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
101e0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
101f0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
10200 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
10210 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65  **.**   (3)  The
10220 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
10230 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
10240 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
10250 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20  er join, or.**  
10260 20 20 20 20 20 20 74 68 65 20 73 75 62 71 75 65        the subque
10270 72 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66  ry is not itself
10280 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65   a join.  (Ticke
10290 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20  t #306).**.**   
102a0 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
102b0 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
102c0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
102d0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
102e0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20  in..**.**   (5) 
102f0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
10300 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72   not DISTINCT or
10310 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
10320 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
10330 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
10340 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20  es..**.**   (6) 
10350 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
10360 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
10370 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
10380 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
10390 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
103a0 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20  CT..**.**   (7) 
103b0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61   The subquery ha
103c0 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  s a FROM clause.
103d0 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68  .**.**   (8)  Th
103e0 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
103f0 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
10400 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
10410 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
10420 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65  **.**   (9)  The
10430 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
10440 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
10450 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
10460 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
10470 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65         aggregate
10480 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20  s..**.**  (10)  
10490 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
104a0 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
104b0 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
104c0 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
104d0 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c  .**        use L
104e0 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31  IMIT..**.**  (11
104f0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
10500 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
10510 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
10520 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c  have ORDER BY cl
10530 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  auses..**.**  (1
10540 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
10550 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
10560 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
10570 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74   OUTER JOIN or t
10580 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  he.**        sub
10590 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
105a0 52 45 20 63 6c 61 75 73 65 2e 20 20 28 61 64 64  RE clause.  (add
105b0 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35  ed by ticket #35
105c0 30 29 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20  0).**.**  (13)  
105d0 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
105e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
105f0 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d  not both use LIM
10600 49 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20  IT.**.**  (14)  
10610 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
10620 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54  s not use OFFSET
10630 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72  .**.** In this r
10640 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20  outine, the "p" 
10650 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
10660 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75  ointer to the ou
10670 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ter query..** Th
10680 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d  e subquery is p-
10690 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  >pSrc->a[iFrom].
106a0 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20    isAgg is true 
106b0 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
106c0 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65  ry.** uses aggre
106d0 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65  gates and subque
106e0 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20  ryIsAgg is true 
106f0 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
10700 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e  uses aggregates.
10710 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65  .**.** If flatte
10720 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65  ning is not atte
10730 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74  mpted, this rout
10740 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61  ine is a no-op a
10750 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  nd returns 0..**
10760 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
10770 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73  s attempted this
10780 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
10790 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66   1..**.** All of
107a0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
107b0 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63  analysis must oc
107c0 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20  cur on both the 
107d0 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a  outer query and.
107e0 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ** the subquery 
107f0 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
10800 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61  ine runs..*/.sta
10810 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53  tic int flattenS
10820 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65  ubquery(.  Parse
10830 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10840 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
10850 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
10860 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
10870 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
10880 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73  r outer SELECT s
10890 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
108a0 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
108b0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
108c0 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74  ->pSrc->a[] of t
108d0 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72  he inner subquer
108e0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  y */.  int isAgg
108f0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
10900 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c  rue if outer SEL
10910 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61  ECT uses aggrega
10920 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
10930 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73    int subqueryIs
10940 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69  Agg    /* True i
10950 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
10960 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
10970 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  nctions */.){.  
10980 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
10990 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
109a0 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
109b0 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ery" */.  SrcLis
109c0 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  t *pSrc;      /*
109d0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
109e0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
109f0 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
10a00 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20   *pSubSrc;   /* 
10a10 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
10a20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
10a30 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
10a40 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
10a50 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
10a60 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
10a70 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
10a80 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63         /* VDBE c
10a90 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
10aa0 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20  the pSub result 
10ab0 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  set temp table *
10ac0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
10ad0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
10ae0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70  counter */.  Exp
10af0 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
10b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b10 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
10b20 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
10b30 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62  cList_item *pSub
10b40 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73  item;   /* The s
10b50 75 62 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a  ubquery */..  /*
10b60 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
10b70 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
10b80 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72  ermitted.  Retur
10b90 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f  n 0 if not..  */
10ba0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
10bb0 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
10bc0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
10bd0 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
10be0 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
10bf0 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
10c00 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
10c10 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 70 53 75 62  a[iFrom];.  pSub
10c20 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
10c30 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20  lect;.  assert( 
10c40 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSub!=0 );.  if(
10c50 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65   isAgg && subque
10c60 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e  ryIsAgg ) return
10c70 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
10c80 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
10c90 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28  on (1)  */.  if(
10ca0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26   subqueryIsAgg &
10cb0 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  & pSrc->nSrc>1 )
10cc0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
10cd0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
10ce0 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75  on (2)  */.  pSu
10cf0 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
10d00 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  c;.  assert( pSu
10d10 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69  bSrc );.  /* Pri
10d20 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e  or to version 3.
10d30 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20  1.2, when LIMIT 
10d40 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74  and OFFSET had t
10d50 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73  o be simple cons
10d60 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20  tants,.  ** not 
10d70 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
10d80 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77  ssions, we allow
10d90 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e  ed some combinin
10da0 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f  g of LIMIT and O
10db0 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75  FFSET.  ** becau
10dc0 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65  se they could be
10dd0 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d   computed at com
10de0 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20  pile-time.  But 
10df0 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
10e00 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d  FFSET.  ** becam
10e10 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  e arbitrary expr
10e20 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65  essions, we were
10e30 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72   forced to add r
10e40 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29  estrictions (13)
10e50 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20  .  ** and (14). 
10e60 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
10e70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d  Limit && p->pLim
10e80 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
10e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10ea0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20  estriction (13) 
10eb0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
10ec0 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20  Offset ) return 
10ed0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10ef0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20  estriction (14) 
10f00 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 53 72 63  */.  if( pSubSrc
10f10 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ->nSrc==0 ) retu
10f20 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
10f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10f40 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20  estriction (7)  
10f50 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e  */.  if( (pSub->
10f60 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53  isDistinct || pS
10f70 75 62 2d 3e 70 4c 69 6d 69 74 29 20 0a 20 20 20  ub->pLimit) .   
10f80 20 20 20 20 20 20 26 26 20 28 70 53 72 63 2d 3e        && (pSrc->
10f90 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29  nSrc>1 || isAgg)
10fa0 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   ){          /* 
10fb0 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29  Restrictions (4)
10fc0 28 35 29 28 38 29 28 39 29 20 2a 2f 0a 20 20 20  (5)(8)(9) */.   
10fd0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
10fe0 20 20 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e    .  }.  if( p->
10ff0 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 73 75  isDistinct && su
11000 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65  bqueryIsAgg ) re
11010 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
11020 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
11030 36 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  6)  */.  if( (p-
11040 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79  >disallowOrderBy
11050 20 7c 7c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29   || p->pOrderBy)
11060 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
11070 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  By ){.     retur
11080 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
11090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
110b0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
110c0 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  1) */.  }..  /* 
110d0 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20  Restriction 3:  
110e0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
110f0 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20  is a join, make 
11100 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
11110 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75  y is .  ** not u
11120 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74  sed as the right
11130 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f   operand of an o
11140 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d  uter join.  Exam
11150 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
11160 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c  .  ** is not all
11170 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
11180 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
11190 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a  OUTER JOIN (t2 J
111a0 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a  OIN t3).  **.  *
111b0 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
111c0 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
111d0 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
111e0 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
111f0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
11200 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20  ) JOIN t3.  **. 
11210 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74   ** which is not
11220 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65   at all the same
11230 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69   thing..  */.  i
11240 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
11250 3e 31 20 26 26 20 69 46 72 6f 6d 3e 30 20 26 26  >1 && iFrom>0 &&
11260 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d   (pSrc->a[iFrom-
11270 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  1].jointype & JT
11280 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20  _OUTER)!=0 ){.  
11290 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
112a0 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
112b0 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75  n 12:  If the su
112c0 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
112d0 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
112e0 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a   left outer.  **
112f0 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
11300 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
11310 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
11320 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70  e..  ** An examp
11330 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20  les of why this 
11340 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
11350 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
11360 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
11370 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  JOIN (SELECT * F
11380 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e  ROM t2 WHERE t2.
11390 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  x>0).  **.  ** I
113a0 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
113b0 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
113c0 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
113d0 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
113e0 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57  OUTER JOIN t2) W
113f0 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a  HERE t2.x>0.  **
11400 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32  .  ** But the t2
11410 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61  .x>0 test will a
11420 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20  lways fail on a 
11430 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20  NULL row of t2, 
11440 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63  which.  ** effec
11450 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20  tively converts 
11460 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69  the OUTER JOIN i
11470 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49  nto an INNER JOI
11480 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 46  N..  */.  if( iF
11490 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e  rom>0 && (pSrc->
114a0 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74  a[iFrom-1].joint
114b0 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
114c0 3d 30 20 0a 20 20 20 20 20 20 26 26 20 70 53 75  =0 .      && pSu
114d0 62 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a  b->pWhere!=0 ){.
114e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
114f0 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  }..  /* If we re
11500 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
11510 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e  it means flatten
11520 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
11530 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46   for the.  ** iF
11540 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
11550 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
11560 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
11570 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d  ry..  */..  /* M
11580 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46  ove all of the F
11590 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  ROM elements of 
115a0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
115b0 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46  o the.  ** the F
115c0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
115d0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
115e0 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69  Before doing thi
115f0 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a  s, remember.  **
11600 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
11610 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69  er for the origi
11620 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20  nal outer query 
11630 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a  FROM element in.
11640 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54    ** iParent.  T
11650 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f  he iParent curso
11660 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  r will never be 
11670 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e  used.  Subsequen
11680 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c  t code.  ** will
11690 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e   scan expression
116a0 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50  s looking for iP
116b0 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73  arent references
116c0 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a   and replace.  *
116d0 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63  * those referenc
116e0 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69  es with expressi
116f0 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65  ons that resolve
11700 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79   to the subquery
11710 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65   FROM.  ** eleme
11720 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63  nts we are now c
11730 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a  opying in..  */.
11740 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
11750 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
11760 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53   {.    int nSubS
11770 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
11780 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e  rc;.    int join
11790 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
117a0 3e 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20 20  >jointype;..    
117b0 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
117c0 6c 65 28 30 2c 20 70 53 75 62 69 74 65 6d 2d 3e  le(0, pSubitem->
117d0 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
117e0 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e  eFree(pSubitem->
117f0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
11800 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62 69  sqliteFree(pSubi
11810 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
11820 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62   sqliteFree(pSub
11830 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  item->zAlias);. 
11840 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
11850 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
11860 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20  tra = nSubSrc - 
11870 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  1;.      for(i=1
11880 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
11890 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 20  ){.        pSrc 
118a0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
118b0 41 70 70 65 6e 64 28 70 53 72 63 2c 20 30 2c 20  Append(pSrc, 0, 
118c0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
118d0 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
118e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53  ;.      for(i=pS
118f0 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78  rc->nSrc-1; i-ex
11900 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29  tra>=iFrom; i--)
11910 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e  {.        pSrc->
11920 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69  a[i] = pSrc->a[i
11930 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d  -extra];.      }
11940 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
11950 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =0; i<nSubSrc; i
11960 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d  ++){.      pSrc-
11970 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
11980 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
11990 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53     memset(&pSubS
119a0 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a  rc->a[i], 0, siz
119b0 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69  eof(pSubSrc->a[i
119c0 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ]));.    }.    p
119d0 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e 53 75  Src->a[iFrom+nSu
119e0 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  bSrc-1].jointype
119f0 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d   = jointype;.  }
11a00 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e  ..  /* Now begin
11a10 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75   substituting su
11a20 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65  bquery result se
11a30 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  t expressions fo
11a40 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  r .  ** referenc
11a50 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
11a60 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
11a70 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a  uery..  ** .  **
11a80 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
11a90 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
11aa0 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
11ab0 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
11ac0 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
11ad0 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a   WHERE a>b;.  **
11ae0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
11af0 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
11b00 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
11b10 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
11b20 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20        /.  **    
11b30 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
11b40 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
11b50 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
11b60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
11b70 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  _/.  **.  ** We 
11b80 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
11b90 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
11ba0 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
11bb0 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
11bc0 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65 20 73  ee.  ** "a" we s
11bd0 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20  ubstitute "x*3" 
11be0 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
11bf0 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75  we see "b" we su
11c00 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e  bstitute "y+10".
11c10 0a 20 20 2a 2f 0a 20 20 73 75 62 73 74 45 78 70  .  */.  substExp
11c20 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
11c30 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
11c40 70 45 4c 69 73 74 29 3b 0a 20 20 70 4c 69 73 74  pEList);.  pList
11c50 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
11c60 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
11c70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
11c80 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a     Expr *pExpr;.
11c90 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
11ca0 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20  [i].zName==0 && 
11cb0 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  (pExpr = pList->
11cc0 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61  a[i].pExpr)->spa
11cd0 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  n.z!=0 ){.      
11ce0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
11cf0 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
11d00 70 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  p((char*)pExpr->
11d10 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73  span.z, pExpr->s
11d20 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  pan.n);.    }.  
11d30 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  }.  if( isAgg ){
11d40 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
11d50 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  st(p->pGroupBy, 
11d60 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
11d70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
11d80 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
11d90 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
11da0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  >pEList);.  }.  
11db0 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
11dc0 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  By ){.    assert
11dd0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
11de0 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65   );.    p->pOrde
11df0 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
11e00 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e  erBy;.    pSub->
11e10 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
11e20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f 72  }else if( p->pOr
11e30 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 75 62  derBy ){.    sub
11e40 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  stExprList(p->pO
11e50 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c  rderBy, iParent,
11e60 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
11e70 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e    }.  if( pSub->
11e80 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57  pWhere ){.    pW
11e90 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
11ea0 70 72 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65  prDup(pSub->pWhe
11eb0 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  re);.  }else{.  
11ec0 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
11ed0 7d 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  }.  if( subquery
11ee0 49 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73  IsAgg ){.    ass
11ef0 65 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d  ert( p->pHaving=
11f00 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  =0 );.    p->pHa
11f10 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65  ving = p->pWhere
11f20 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
11f30 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75  = pWhere;.    su
11f40 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69  bstExpr(p->pHavi
11f50 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
11f60 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
11f70 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c  p->pHaving = sql
11f80 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70  ite3ExprAnd(p->p
11f90 48 61 76 69 6e 67 2c 20 73 71 6c 69 74 65 33 45  Having, sqlite3E
11fa0 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70 48 61  xprDup(pSub->pHa
11fb0 76 69 6e 67 29 29 3b 0a 20 20 20 20 61 73 73 65  ving));.    asse
11fc0 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  rt( p->pGroupBy=
11fd0 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72  =0 );.    p->pGr
11fe0 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
11ff0 78 70 72 4c 69 73 74 44 75 70 28 70 53 75 62 2d  xprListDup(pSub-
12000 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65  >pGroupBy);.  }e
12010 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78  lse{.    substEx
12020 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69 50  pr(p->pWhere, iP
12030 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
12040 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68  ist);.    p->pWh
12050 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
12060 72 41 6e 64 28 70 2d 3e 70 57 68 65 72 65 2c 20  rAnd(p->pWhere, 
12070 70 57 68 65 72 65 29 3b 0a 20 20 7d 0a 0a 20 20  pWhere);.  }..  
12080 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64  /* The flattened
12090 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
120a0 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65  ct if either the
120b0 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20   inner or the.  
120c0 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
120d0 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 2a  s distinct. .  *
120e0 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  /.  p->isDistinc
120f0 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
12100 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73  t || pSub->isDis
12110 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  tinct;..  /*.  *
12120 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
12130 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
12140 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
12150 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
12160 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 65 20  ;.  **.  ** One 
12170 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72  is tempted to tr
12180 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62  y to add a and b
12190 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
121a0 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69  limits.  But thi
121b0 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  s.  ** does not 
121c0 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c  work if either l
121d0 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
121e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
121f0 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
12200 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75   p->pLimit = pSu
12210 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70  b->pLimit;.    p
12220 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  Sub->pLimit = 0;
12230 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61  .  }..  /* Finia
12240 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74  lly, delete what
12250 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20   is left of the 
12260 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74  subquery and ret
12270 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  urn.  ** success
12280 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
12290 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75  SelectDelete(pSu
122a0 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  b);.  return 1;.
122b0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
122c0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
122d0 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
122e0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
122f0 65 6e 74 20 70 61 73 73 65 64 20 69 6e 20 61 73  ent passed in as
12300 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   an argument to 
12310 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  see if it.** is 
12320 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f  a simple min() o
12330 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20  r max() query.  
12340 49 66 20 69 74 20 69 73 20 61 6e 64 20 74 68 69  If it is and thi
12350 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a  s query can be.*
12360 2a 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e  * satisfied usin
12370 67 20 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20  g a single seek 
12380 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
12390 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e   or end of an in
123a0 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e  dex,.** then gen
123b0 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 66  erate the code f
123c0 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 61  or this SELECT a
123d0 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66  nd return 1.  If
123e0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a   this is not a .
123f0 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20  ** simple min() 
12400 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20  or max() query, 
12410 74 68 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a  then return 0;.*
12420 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69  *.** A simply mi
12430 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
12440 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  ry looks like th
12450 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
12460 45 43 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20  ECT min(a) FROM 
12470 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c  table;.**    SEL
12480 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20  ECT max(a) FROM 
12490 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  table;.**.** The
124a0 20 71 75 65 72 79 20 6d 61 79 20 68 61 76 65 20   query may have 
124b0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
124c0 62 6c 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ble in its FROM 
124d0 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65  argument.  There
124e0 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52  .** can be no GR
124f0 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47  OUP BY or HAVING
12500 20 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65   or WHERE clause
12510 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 73  s.  The result s
12520 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68  et must.** be th
12530 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
12540 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   of a single col
12550 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
12560 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  .  The column.**
12570 20 69 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   in the min() or
12580 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20   max() function 
12590 6d 75 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e  must be indexed.
125a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d  .**.** The param
125b0 65 74 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f  eters to this ro
125c0 75 74 69 6e 65 20 61 72 65 20 74 68 65 20 73 61  utine are the sa
125d0 6d 65 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65  me as for sqlite
125e0 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65  3Select()..** Se
125f0 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
12600 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75  ment on that rou
12610 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
12620 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
12630 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
12640 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79  impleMinMaxQuery
12650 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12660 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65  Select *p, int e
12670 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
12680 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  {.  Expr *pExpr;
12690 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54  .  int iCol;.  T
126a0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
126b0 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
126c0 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20 2a 76   base;.  Vdbe *v
126d0 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a  ;.  int seekOp;.
126e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
126f0 73 74 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69 73  st, *pList, eLis
12700 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  t;.  struct Expr
12710 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49  List_item eListI
12720 74 65 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  tem;.  SrcList *
12730 70 53 72 63 3b 0a 20 20 69 6e 74 20 62 72 6b 3b  pSrc;.  int brk;
12740 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 2f  .  int iDb;..  /
12750 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
12760 66 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  f this query is 
12770 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f  a simple min() o
12780 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20  r max() query.  
12790 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f  Return.  ** zero
127a0 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a   if it is  not..
127b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47    */.  if( p->pG
127c0 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61  roupBy || p->pHa
127d0 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72  ving || p->pWher
127e0 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  e ) return 0;.  
127f0 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
12800 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
12810 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
12820 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
12830 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69  List;.  if( pELi
12840 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
12850 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72  eturn 0;.  pExpr
12860 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e   = pEList->a[0].
12870 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
12880 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
12890 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
128a0 20 30 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 45   0;.  pList = pE
128b0 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66  xpr->pList;.  if
128c0 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c  ( pList==0 || pL
128d0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
128e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
128f0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  pExpr->token.n!=
12900 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  3 ) return 0;.  
12910 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
12920 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78 70 72  Cmp((char*)pExpr
12930 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c  ->token.z,"min",
12940 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65  3)==0 ){.    see
12950 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b  kOp = OP_Rewind;
12960 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
12970 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
12980 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
12990 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29  .z,"max",3)==0 )
129a0 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f  {.    seekOp = O
129b0 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b  P_Last;.  }else{
129c0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
129d0 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 70 4c 69   }.  pExpr = pLi
129e0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
129f0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
12a00 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
12a10 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20  urn 0;.  iCol = 
12a20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
12a30 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61    pTab = pSrc->a
12a40 5b 30 5d 2e 70 54 61 62 3b 0a 0a 0a 20 20 2f 2a  [0].pTab;...  /*
12a50 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 68 65   If we get to he
12a60 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  re, it means the
12a70 20 71 75 65 72 79 20 69 73 20 6f 66 20 74 68 65   query is of the
12a80 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20   correct form.. 
12a90 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   ** Check to mak
12aa0 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
12ab0 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65  n index and make
12ac0 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20 74   pIdx point to t
12ad0 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72 69  he.  ** appropri
12ae0 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20 74  ate index.  If t
12af0 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
12b00 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47  ) is on an INTEG
12b10 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20  ER PRIMARY.  ** 
12b20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69  key column, no i
12b30 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73 61 72  ndex is necessar
12b40 79 20 73 6f 20 73 65 74 20 70 49 64 78 20 74 6f  y so set pIdx to
12b50 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20   NULL.  If no.  
12b60 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78 20  ** usable index 
12b70 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  is found, return
12b80 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69   0..  */.  if( i
12b90 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49 64  Col<0 ){.    pId
12ba0 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  x = 0;.  }else{.
12bb0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
12bc0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
12bd0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
12be0 70 45 78 70 72 29 3b 0a 20 20 20 20 66 6f 72 28  pExpr);.    for(
12bf0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
12c00 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
12c10 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
12c20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
12c30 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20  nColumn>=1 );.  
12c40 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
12c50 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20  Column[0]==iCol 
12c60 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d  && .          0=
12c70 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
12c80 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c  pIdx->azColl[0],
12c90 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 20 29   pColl->zName) )
12ca0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
12cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12cc0 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29     if( pIdx==0 )
12cd0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
12ce0 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f    /* Identify co
12cf0 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20 77 65  lumn types if we
12d00 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74   will be using t
12d10 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68  he callback.  Th
12d20 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20  is.  ** step is 
12d30 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f  skipped if the o
12d40 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
12d50 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d  o a table or a m
12d60 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a  emory cell..  **
12d70 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
12d80 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
12d90 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20 69 6e  een generated in
12da0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
12db0 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20  ction..  */.  v 
12dc0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
12dd0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
12de0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) return 0;
12df0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
12e00 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
12e10 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
12e20 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
12e30 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
12e40 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 56  if( eDest==SRT_V
12e50 69 72 74 75 61 6c 54 61 62 20 29 7b 0a 20 20 20  irtualTab ){.   
12e60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12e70 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74  p(v, OP_OpenVirt
12e80 75 61 6c 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ual, iParm, 1);.
12e90 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
12ea0 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e  ting code to fin
12eb0 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65  d the min or the
12ec0 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79   max.  Basically
12ed0 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a   all we have.  *
12ee0 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20  * to do is find 
12ef0 74 68 65 20 66 69 72 73 74 20 6f 72 20 74 68 65  the first or the
12f00 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
12f10 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e  he chosen index.
12f20 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69    If.  ** the mi
12f30 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20  n() or max() is 
12f40 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  on the INTEGER P
12f50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e  RIMARY KEY, then
12f60 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a   find the first.
12f70 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74    ** or last ent
12f80 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74  ry in the main t
12f90 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 44 62  able..  */.  iDb
12fa0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
12fb0 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
12fc0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
12fd0 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  a);.  assert( iD
12fe0 62 3e 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 69 73  b>=0 || pTab->is
12ff0 54 72 61 6e 73 69 65 6e 74 20 29 3b 0a 20 20 73  Transient );.  s
13000 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
13010 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
13020 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61  Db);.  sqlite3Ta
13030 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
13040 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
13050 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
13060 3b 0a 20 20 62 61 73 65 20 3d 20 70 53 72 63 2d  ;.  base = pSrc-
13070 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[0].iCursor;. 
13080 20 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64   brk = sqlite3Vd
13090 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
130a0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
130b0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
130c0 70 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28 20 70  p, brk);.  if( p
130d0 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
130e0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
130f0 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
13100 72 73 65 2c 20 62 61 73 65 2c 20 69 44 62 2c 20  rse, base, iDb, 
13110 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
13120 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  d);.  }.  if( pI
13130 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  dx==0 ){.    sql
13140 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13150 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30   seekOp, base, 0
13160 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
13170 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74  /* Even though t
13180 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 74  he cursor used t
13190 6f 20 6f 70 65 6e 20 74 68 65 20 69 6e 64 65 78  o open the index
131a0 20 68 65 72 65 20 69 73 20 63 6c 6f 73 65 64 0a   here is closed.
131b0 20 20 20 20 2a 2a 20 61 73 20 73 6f 6f 6e 20 61      ** as soon a
131c0 73 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65  s a single value
131d0 20 68 61 73 20 62 65 65 6e 20 72 65 61 64 20 66   has been read f
131e0 72 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63 61 74 65  rom it, allocate
131f0 20 69 74 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67   it.    ** using
13200 20 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b   (pParse->nTab++
13210 29 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65  ) to prevent the
13220 20 63 75 72 73 6f 72 20 69 64 20 66 72 6f 6d 20   cursor id from 
13230 62 65 69 6e 67 20 0a 20 20 20 20 2a 2a 20 72 65  being .    ** re
13240 75 73 65 64 2e 20 54 68 69 73 20 69 73 20 69 6d  used. This is im
13250 70 6f 72 74 61 6e 74 20 66 6f 72 20 73 74 61 74  portant for stat
13260 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  ements of the fo
13270 72 6d 20 0a 20 20 20 20 2a 2a 20 22 49 4e 53 45  rm .    ** "INSE
13280 52 54 20 49 4e 54 4f 20 78 20 53 45 4c 45 43 54  RT INTO x SELECT
13290 20 6d 61 78 28 29 20 46 52 4f 4d 20 78 22 2e 0a   max() FROM x"..
132a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69      */.    int i
132b0 49 64 78 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  Idx;.    KeyInfo
132c0 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
132d0 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61  IndexKeyinfo(pPa
132e0 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  rse, pIdx);.    
132f0 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iIdx = pParse->n
13300 54 61 62 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  Tab++;.    asser
13310 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61  t( pIdx->pSchema
13320 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
13330 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13340 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
13350 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a  teger, iDb, 0);.
13360 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
13370 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
13380 64 2c 20 69 49 64 78 2c 20 70 49 64 78 2d 3e 74  d, iIdx, pIdx->t
13390 6e 75 6d 2c 20 0a 20 20 20 20 20 20 20 20 28 63  num, .        (c
133a0 68 61 72 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45  har*)pKey, P3_KE
133b0 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
133c0 20 20 20 20 69 66 28 20 73 65 65 6b 4f 70 3d 3d      if( seekOp==
133d0 4f 50 5f 52 65 77 69 6e 64 20 29 7b 0a 20 20 20  OP_Rewind ){.   
133e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
133f0 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  dOp(v, OP_Null, 
13400 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
13410 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13420 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
13430 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 65 65  1, 0);.      see
13440 6b 4f 70 20 3d 20 4f 50 5f 4d 6f 76 65 47 74 3b  kOp = OP_MoveGt;
13450 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
13460 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73  e3VdbeAddOp(v, s
13470 65 65 6b 4f 70 2c 20 69 49 64 78 2c 20 30 29 3b  eekOp, iIdx, 0);
13480 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13490 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52  AddOp(v, OP_IdxR
134a0 6f 77 69 64 2c 20 69 49 64 78 2c 20 30 29 3b 0a  owid, iIdx, 0);.
134b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
134c0 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
134d0 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  , iIdx, 0);.    
134e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
134f0 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 62  (v, OP_MoveGe, b
13500 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65  ase, 0);.  }.  e
13510 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a  List.nExpr = 1;.
13520 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74 49    memset(&eListI
13530 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65  tem, 0, sizeof(e
13540 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c  ListItem));.  eL
13550 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49 74  ist.a = &eListIt
13560 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d  em;.  eList.a[0]
13570 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
13580 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
13590 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26 65 4c  p(pParse, p, &eL
135a0 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31  ist, 0, 0, 0, -1
135b0 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
135c0 62 72 6b 2c 20 62 72 6b 2c 20 30 29 3b 0a 20 20  brk, brk, 0);.  
135d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
135e0 76 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b  veLabel(v, brk);
135f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13600 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
13610 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 0a 20 20   base, 0);.  .  
13620 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
13630 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f  ** Analyze and O
13640 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
13650 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20   BY clause in a 
13660 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13670 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
13680 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
13690 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e  s seen..**.** An
136a0 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
136b0 55 50 20 42 59 20 69 73 20 61 20 6c 69 73 74 20  UP BY is a list 
136c0 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  of expressions. 
136d0 20 49 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   If any expressi
136e0 6f 6e 0a 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65  on.** is an inte
136f0 67 65 72 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68  ger constant, th
13700 65 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69  en that expressi
13710 6f 6e 20 69 73 20 72 65 70 6c 61 63 65 64 20 62  on is replaced b
13720 79 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  y the.** corresp
13730 6f 6e 64 69 6e 67 20 65 6e 74 72 79 20 69 6e 20  onding entry in 
13740 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
13750 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
13760 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42  ocessOrderGroupB
13770 79 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  y(.  NameContext
13780 20 2a 70 4e 43 2c 20 20 20 20 20 2f 2a 20 4e 61   *pNC,     /* Na
13790 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68  me context of th
137a0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
137b0 6e 74 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  nt. */.  ExprLis
137c0 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
137d0 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f  * The ORDER BY o
137e0 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
137f0 65 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65  e to be processe
13800 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
13810 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20  r *zType     /* 
13820 45 69 74 68 65 72 20 22 4f 52 44 45 52 22 20 6f  Either "ORDER" o
13830 72 20 22 47 52 4f 55 50 22 2c 20 61 73 20 61 70  r "GROUP", as ap
13840 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a  propriate */.){.
13850 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c    int i;.  ExprL
13860 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 4e  ist *pEList = pN
13870 43 2d 3e 70 45 4c 69 73 74 3b 20 20 20 20 20 2f  C->pEList;     /
13880 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
13890 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a   of the SELECT *
138a0 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
138b0 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
138c0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75       /* The resu
138d0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
138e0 4c 45 43 54 20 2a 2f 0a 20 20 61 73 73 65 72 74  LECT */.  assert
138f0 28 20 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 69  ( pEList );..  i
13900 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
13910 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
13920 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
13930 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
13940 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
13950 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64   Expr *pE = pOrd
13960 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
13970 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
13980 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
13990 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20  E, &iCol) ){.   
139a0 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 26 26     if( iCol>0 &&
139b0 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e   iCol<=pEList->n
139c0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
139d0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
139e0 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70  e(pE);.        p
139f0 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
13a00 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  i].pExpr = sqlit
13a10 65 33 45 78 70 72 44 75 70 28 70 45 4c 69 73 74  e3ExprDup(pEList
13a20 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70  ->a[iCol-1].pExp
13a30 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
13a40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13a50 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13a60 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 25 73   .           "%s
13a70 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65   BY column numbe
13a80 72 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67  r %d out of rang
13a90 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a  e - should be ".
13aa0 20 20 20 20 20 20 20 20 20 20 20 22 62 65 74 77             "betw
13ab0 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 7a  een 1 and %d", z
13ac0 54 79 70 65 2c 20 69 43 6f 6c 2c 20 70 45 4c 69  Type, iCol, pELi
13ad0 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
13ae0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
13af0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13b00 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
13b10 65 73 6f 6c 76 65 4e 61 6d 65 73 28 70 4e 43 2c  esolveNames(pNC,
13b20 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 72 65   pE) ){.      re
13b30 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
13b40 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
13b50 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20  rIsConstant(pE) 
13b60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13b70 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13b80 0a 20 20 20 20 20 20 20 20 20 20 22 25 73 20 42  .          "%s B
13b90 59 20 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74  Y terms must not
13ba0 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20   be non-integer 
13bb0 63 6f 6e 73 74 61 6e 74 73 22 2c 20 7a 54 79 70  constants", zTyp
13bc0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
13bd0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
13be0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
13bf0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13c00 72 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e 61 6d  resolves any nam
13c10 65 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 72  es used in the r
13c20 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
13c30 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 53 45 4c  .** supplied SEL
13c40 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 49  ECT statement. I
13c50 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
13c60 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 73  tement being res
13c70 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20 73 75  olved.** is a su
13c80 62 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 70  b-select, then p
13c90 4f 75 74 65 72 4e 43 20 69 73 20 61 20 70 6f 69  OuterNC is a poi
13ca0 6e 74 65 72 20 74 6f 20 74 68 65 20 4e 61 6d 65  nter to the Name
13cb0 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66 20 74  Context .** of t
13cc0 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54  he parent SELECT
13cd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13ce0 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 0a 20  SelectResolve(. 
13cf0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
13d00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
13d10 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
13d20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
13d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13d40 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
13d50 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
13d60 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
13d70 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 54 68  *pOuterNC  /* Th
13d80 65 20 6f 75 74 65 72 20 6e 61 6d 65 20 63 6f 6e  e outer name con
13d90 74 65 78 74 2e 20 4d 61 79 20 62 65 20 4e 55 4c  text. May be NUL
13da0 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  L. */.){.  ExprL
13db0 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
13dc0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
13dd0 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  set. */.  int i;
13de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13df0 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f 70       /* For-loop
13e00 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20 69   variable used i
13e10 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
13e20 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  s */.  NameConte
13e30 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20  xt sNC;         
13e40 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65 2d    /* Local name-
13e50 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
13e60 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
13e70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67          /* The g
13e80 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
13e90 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
13ea0 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20  routine has run 
13eb0 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 20 69  before, return i
13ec0 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  mmediately. */. 
13ed0 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c 76   if( p->isResolv
13ee0 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
13ef0 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a 20  ( !pOuterNC );. 
13f00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13f10 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 73  _OK;.  }.  p->is
13f20 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a 20  Resolved = 1;.. 
13f30 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61 76   /* If there hav
13f40 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65  e already been e
13f50 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69 6e  rrors, do nothin
13f60 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  g. */.  if( pPar
13f70 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20  se->nErr>0 ){.  
13f80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13f90 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
13fa0 20 50 72 65 70 61 72 65 20 74 68 65 20 73 65 6c   Prepare the sel
13fb0 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ect statement. T
13fc0 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c  his call will al
13fd0 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  locate all curso
13fe0 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  rs.  ** required
13ff0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 74   to handle the t
14000 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71 75 65  ables and subque
14010 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
14020 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
14030 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74  if( prepSelectSt
14040 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  mt(pParse, p) ){
14050 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14060 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
14070 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20   /* Resolve the 
14080 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
14090 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
140a0 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 65  SET clauses. The
140b0 73 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20  se.  ** are not 
140c0 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72  allowed to refer
140d0 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73   to any names, s
140e0 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20  o pass an empty 
140f0 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 2a  NameContext..  *
14100 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  /.  memset(&sNC,
14110 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
14120 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
14130 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 73   pParse;.  if( s
14140 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
14150 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
14160 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20  pLimit) ||.     
14170 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
14180 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
14190 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20  ->pOffset) ){.  
141a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
141b0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
141c0 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61   Set up the loca
141d0 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74  l name-context t
141e0 6f 20 70 61 73 73 20 74 6f 20 45 78 70 72 52 65  o pass to ExprRe
141f0 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 74 6f 0a  solveNames() to.
14200 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 65    ** resolve the
14210 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
14220 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c  ..  */.  sNC.all
14230 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 73 4e 43  owAgg = 1;.  sNC
14240 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70  .pSrcList = p->p
14250 53 72 63 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74  Src;.  sNC.pNext
14260 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 0a 20 20   = pOuterNC;..  
14270 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  /* Resolve names
14280 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
14290 65 74 2e 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  et. */.  pEList 
142a0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
142b0 66 28 20 21 70 45 4c 69 73 74 20 29 20 72 65 74  f( !pEList ) ret
142c0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
142d0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
142e0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
142f0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58  +){.    Expr *pX
14300 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
14310 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73  pExpr;.    if( s
14320 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
14330 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 58 29  eNames(&sNC, pX)
14340 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
14350 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
14360 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
14370 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61  f there are no a
14380 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
14390 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
143a0 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f  -set, and no GRO
143b0 55 50 20 42 59 20 0a 20 20 2a 2a 20 65 78 70 72  UP BY .  ** expr
143c0 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61  ession, do not a
143d0 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65 73 20  llow aggregates 
143e0 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6f 74  in any of the ot
143f0 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  her expressions.
14400 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
14410 21 70 2d 3e 69 73 41 67 67 20 29 3b 0a 20 20 70  !p->isAgg );.  p
14420 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
14430 6f 75 70 42 79 3b 0a 20 20 69 66 28 20 70 47 72  oupBy;.  if( pGr
14440 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61 73  oupBy || sNC.has
14450 41 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73  Agg ){.    p->is
14460 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Agg = 1;.  }else
14470 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41  {.    sNC.allowA
14480 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  gg = 0;.  }..  /
14490 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c  * If a HAVING cl
144a0 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c  ause is present,
144b0 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
144c0 20 62 65 20 61 20 47 52 4f 55 50 20 42 59 20 63   be a GROUP BY c
144d0 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  lause..  */.  if
144e0 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20  ( p->pHaving && 
144f0 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  !pGroupBy ){.   
14500 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14510 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55  (pParse, "a GROU
14520 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 72  P BY clause is r
14530 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 48  equired before H
14540 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 72 65 74  AVING");.    ret
14550 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
14560 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
14570 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
14580 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d  ist to the name-
14590 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20 70  context before p
145a0 61 72 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  arsing the.  ** 
145b0 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
145c0 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
145d0 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
145e0 69 73 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20  is so that.  ** 
145f0 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
14600 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
14610 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66 65 72  (etc.) can refer
14620 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20   to expressions 
14630 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65 73 20  by.  ** aliases 
14640 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
14650 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69 6e  t..  **.  ** Min
14660 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74 68 69  or point: If thi
14670 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
14680 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
14690 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  on will be.  ** 
146a0 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66 6f 72  re-evaluated for
146b0 20 65 61 63 68 20 72 65 66 65 72 65 6e 63 65 20   each reference 
146c0 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e  to it..  */.  sN
146d0 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45  C.pEList = p->pE
146e0 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71 6c 69  List;.  if( sqli
146f0 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
14700 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68  mes(&sNC, p->pWh
14710 65 72 65 29 20 7c 7c 0a 20 20 20 20 20 20 73 71  ere) ||.      sq
14720 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
14730 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
14740 48 61 76 69 6e 67 29 20 7c 7c 0a 20 20 20 20 20  Having) ||.     
14750 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f   processOrderGro
14760 75 70 42 79 28 26 73 4e 43 2c 20 70 2d 3e 70 4f  upBy(&sNC, p->pO
14770 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
14780 20 7c 7c 0a 20 20 20 20 20 20 70 72 6f 63 65 73   ||.      proces
14790 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26 73  sOrderGroupBy(&s
147a0 4e 43 2c 20 70 47 72 6f 75 70 42 79 2c 20 22 47  NC, pGroupBy, "G
147b0 52 4f 55 50 22 29 0a 20 20 29 7b 0a 20 20 20 20  ROUP").  ){.    
147c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
147d0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ROR;.  }..  /* M
147e0 61 6b 65 20 73 75 72 65 20 74 68 65 20 47 52 4f  ake sure the GRO
147f0 55 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65  UP BY clause doe
14800 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67  s not contain ag
14810 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
14820 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 47  s..  */.  if( pG
14830 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 74  roupBy ){.    st
14840 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
14850 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20  em *pItem;.  .  
14860 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
14870 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c  =pGroupBy->a; i<
14880 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
14890 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
148a0 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
148b0 73 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d  sProperty(pItem-
148c0 3e 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20  >pExpr, EP_Agg) 
148d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
148e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
148f0 65 2c 20 22 61 67 67 72 65 67 61 74 65 20 66 75  e, "aggregate fu
14900 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  nctions are not 
14910 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20  allowed in ".   
14920 20 20 20 20 20 20 20 20 20 22 74 68 65 20 47 52           "the GR
14930 4f 55 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b  OUP BY clause");
14940 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
14950 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
14960 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14970 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14980 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
14990 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
149a0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  e accumulator..*
149b0 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61  *.** The aggrega
149c0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69  te accumulator i
149d0 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72  s a set of memor
149e0 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c  y cells that hol
149f0 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74  d.** intermediat
14a00 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20  e results while 
14a10 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61  calculating an a
14a20 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a  ggregate.  This.
14a30 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c  ** routine simpl
14a40 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  y stores NULLs i
14a50 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
14a60 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  emory cells..*/.
14a70 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65  static void rese
14a80 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  tAccumulator(Par
14a90 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
14aa0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
14ab0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
14ac0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
14ad0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
14ae0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63  Info_func *pFunc
14af0 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f  ;.  if( pAggInfo
14b00 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f  ->nFunc+pAggInfo
14b10 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a  ->nColumn==0 ){.
14b20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
14b30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
14b40 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  gInfo->nColumn; 
14b50 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
14b60 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14b70 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 41 67 67 49 6e  _MemNull, pAggIn
14b80 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
14b90 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  , 0);.  }.  for(
14ba0 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
14bb0 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
14bc0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
14bd0 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
14be0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14bf0 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c  Op(v, OP_MemNull
14c00 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 2c 20 30  , pFunc->iMem, 0
14c10 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  );.    if( pFunc
14c20 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
14c30 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
14c40 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b   = pFunc->pExpr;
14c50 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 70  .      if( pE->p
14c60 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70  List==0 || pE->p
14c70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
14c80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14c90 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14ca0 2c 20 22 44 49 53 54 49 4e 43 54 20 69 6e 20 61  , "DISTINCT in a
14cb0 67 67 72 65 67 61 74 65 20 6d 75 73 74 20 62 65  ggregate must be
14cc0 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20 20 20 20   followed ".    
14cd0 20 20 20 20 20 20 20 22 62 79 20 61 6e 20 65 78         "by an ex
14ce0 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20  pression");.    
14cf0 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74      pFunc->iDist
14d00 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
14d10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14d20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
14d30 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
14d40 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
14d50 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  pE->pList);.    
14d60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
14d70 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72  p3(v, OP_OpenVir
14d80 74 75 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69  tual, pFunc->iDi
14d90 73 74 69 6e 63 74 2c 20 30 2c 20 0a 20 20 20 20  stinct, 0, .    
14da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14db0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
14dc0 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  yInfo, P3_KEYINF
14dd0 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
14de0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
14df0 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
14e00 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65  e OP_AggFinalize
14e10 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72   opcode for ever
14e20 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  y aggregate func
14e30 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41  tion.** in the A
14e40 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
14e50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14e60 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
14e70 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61  tions(Parse *pPa
14e80 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
14e90 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
14ea0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
14eb0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
14ec0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
14ed0 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d  nc *pF;.  for(i=
14ee0 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
14ef0 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
14f00 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
14f10 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  F++){.    ExprLi
14f20 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
14f30 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
14f40 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
14f50 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c  (v, OP_AggFinal,
14f60 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74   pF->iMem, pList
14f70 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
14f80 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : 0,.           
14f90 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
14fa0 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 33 5f  *)pF->pFunc, P3_
14fb0 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a  FUNCDEF);.  }.}.
14fc0 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
14fd0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65  e accumulator me
14fe0 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  mory cells for a
14ff0 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65  n aggregate base
15000 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  d on.** the curr
15010 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
15020 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
15030 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75  oid updateAccumu
15040 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
15050 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
15060 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
15070 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
15080 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
15090 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
150a0 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74  nc *pF;.  struct
150b0 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
150c0 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64  ;..  pAggInfo->d
150d0 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
150e0 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
150f0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
15100 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
15110 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
15120 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
15130 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
15140 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
15150 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
15160 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 66 28  ->pList;.    if(
15170 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
15180 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nArg = pList->nE
15190 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
151a0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
151b0 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
151c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
151d0 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20      nArg = 0;.  
151e0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
151f0 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
15200 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d        addrNext =
15210 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
15220 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
15230 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20  assert( nArg==1 
15240 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73  );.      codeDis
15250 74 69 6e 63 74 28 76 2c 20 70 46 2d 3e 69 44 69  tinct(v, pF->iDi
15260 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74  stinct, addrNext
15270 2c 20 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 2);.    }. 
15280 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
15290 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b  ->needCollSeq ){
152a0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
152b0 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
152c0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
152d0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
152e0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
152f0 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
15300 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c  pList->a; !pColl
15310 20 26 26 20 6a 3c 70 4c 69 73 74 2d 3e 6e 45 78   && j<pList->nEx
15320 70 72 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; j++, pItem++
15330 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
15340 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
15350 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
15360 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
15370 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
15380 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
15390 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d   pColl = pParse-
153a0 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
153b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
153c0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
153d0 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
153e0 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
153f0 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P3_COLLSEQ);.  
15400 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
15410 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67  dbeOp3(v, OP_Agg
15420 53 74 65 70 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20  Step, pF->iMem, 
15430 6e 41 72 67 2c 20 28 76 6f 69 64 2a 29 70 46 2d  nArg, (void*)pF-
15440 3e 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44  >pFunc, P3_FUNCD
15450 45 46 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  EF);.    if( add
15460 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73  rNext ){.      s
15470 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
15480 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65  eLabel(v, addrNe
15490 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  xt);.    }.  }. 
154a0 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67   for(i=0, pC=pAg
154b0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70  gInfo->aCol; i<p
154c0 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
154d0 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b  lator; i++, pC++
154e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
154f0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
15500 43 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73  C->pExpr);.    s
15510 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15520 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
15530 70 43 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20  pC->iMem, 1);.  
15540 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  }.  pAggInfo->di
15550 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d 0a  rectMode = 0;.}.
15560 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
15570 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69   code for the gi
15580 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65  ven SELECT state
15590 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
155a0 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74  results are dist
155b0 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f  ributed in vario
155c0 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e  us ways dependin
155d0 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75  g on the.** valu
155e0 65 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 69  e of eDest and i
155f0 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
15600 65 44 65 73 74 20 56 61 6c 75 65 20 20 20 20 20  eDest Value     
15610 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20    Result.**     
15620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
15630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
15660 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20     SRT_Callback 
15670 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61     Invoke the ca
15680 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20  llback for each 
15690 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
156a0 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  t..**.**     SRT
156b0 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f  _Mem         Sto
156c0 72 65 20 66 69 72 73 74 20 72 65 73 75 6c 74 20  re first result 
156d0 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  in memory cell i
156e0 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
156f0 52 54 5f 53 65 74 20 20 20 20 20 20 20 20 20 53  RT_Set         S
15700 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20  tore results as 
15710 6b 65 79 73 20 6f 66 20 74 61 62 6c 65 20 69 50  keys of table iP
15720 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  arm..**.**     S
15730 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53  RT_Union       S
15740 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20  tore results as 
15750 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f  a key in a tempo
15760 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
15770 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45  .**.**     SRT_E
15780 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76  xcept      Remov
15790 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74  e results from t
157a0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
157b0 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  le iParm..**.** 
157c0 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20      SRT_Table   
157d0 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
157e0 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  s in temporary t
157f0 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  able iParm.**.**
15800 20 54 68 65 20 74 61 62 6c 65 20 61 62 6f 76 65   The table above
15810 20 69 73 20 69 6e 63 6f 6d 70 6c 65 74 65 2e 20   is incomplete. 
15820 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 44 69 73   Additional eDis
15830 74 20 76 61 6c 75 65 20 68 61 76 65 20 62 65 20  t value have be 
15840 61 64 64 65 64 0a 2a 2a 20 73 69 6e 63 65 20 74  added.** since t
15850 68 69 73 20 63 6f 6d 6d 65 6e 74 20 77 61 73 20  his comment was 
15860 77 72 69 74 74 65 6e 2e 20 20 53 65 65 20 74 68  written.  See th
15870 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  e selectInnerLoo
15880 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  p() function for
15890 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65 74 65 20 6c  .** a complete l
158a0 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 61 6c  isting of the al
158b0 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20  lowed values of 
158c0 65 44 65 73 74 20 61 6e 64 20 74 68 65 69 72 20  eDest and their 
158d0 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20  meanings..**.** 
158e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
158f0 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
15900 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
15910 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a  ny errors are.**
15920 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
15930 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  en an appropriat
15940 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
15950 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50  is left in.** pP
15960 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
15970 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15980 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20  e does NOT free 
15990 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63  the Select struc
159a0 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20  ture passed in. 
159b0 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
159c0 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  function needs t
159d0 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a  o do that..**.**
159e0 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61   The pParent, pa
159f0 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50  rentTab, and *pP
15a00 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20  arentAgg fields 
15a10 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66  are filled in if
15a20 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20   this.** SELECT 
15a30 69 73 20 61 20 73 75 62 71 75 65 72 79 2e 20 20  is a subquery.  
15a40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
15a50 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20   try to combine 
15a60 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77  this SELECT.** w
15a70 69 74 68 20 69 74 73 20 70 61 72 65 6e 74 20 74  ith its parent t
15a80 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  o form a single 
15a90 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20  flat query.  In 
15aa0 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67  so doing, it mig
15ab0 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65  ht.** change the
15ac0 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 66 72   parent query fr
15ad0 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61  om a non-aggrega
15ae0 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61  te to an aggrega
15af0 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72  te query..** For
15b00 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68   that reason, th
15b10 65 20 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61  e pParentAgg fla
15b20 67 20 69 73 20 70 61 73 73 65 64 20 61 73 20 61  g is passed as a
15b30 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a   pointer, so it.
15b40 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ** can be change
15b50 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  d..**.** Example
15b60 20 31 3a 20 20 20 54 68 65 20 6d 65 61 6e 69 6e   1:   The meanin
15b70 67 20 6f 66 20 74 68 65 20 70 50 61 72 65 6e 74  g of the pParent
15b80 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
15b90 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
15ba0 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45  OM t1 JOIN (SELE
15bb0 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46  CT x, count(*) F
15bc0 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b  ROM t2) JOIN t3;
15bd0 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20 20 20 20  .**    \        
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
15bf0 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
15c00 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
15c10 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20 20 20  /.**     \      
15c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c50 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f  /.**      \_____
15c60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20  _______________ 
15c70 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f  outer query ____
15c80 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
15c90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
15ca0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
15cb0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
15cc0 79 20 66 69 72 73 74 2e 20 20 20 46 6f 72 20 74  y first.   For t
15cd0 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61  hat call,.** pPa
15ce0 72 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  rent will be NUL
15cf0 4c 2e 20 20 44 75 72 69 6e 67 20 74 68 65 20 70  L.  During the p
15d00 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65  rocessing of the
15d10 20 6f 75 74 65 72 20 71 75 65 72 79 2c 20 74 68   outer query, th
15d20 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  is .** routine i
15d30 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  s called recursi
15d40 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20 74  vely to handle t
15d50 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 46 6f  he subquery.  Fo
15d60 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 0a  r the recursive.
15d70 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74  ** call, pParent
15d80 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74   will point to t
15d90 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
15da0 20 42 65 63 61 75 73 65 20 74 68 65 20 73 75 62   Because the sub
15db0 71 75 65 72 79 20 69 73 0a 2a 2a 20 74 68 65 20  query is.** the 
15dc0 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69  second element i
15dd0 6e 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  n a three-way jo
15de0 69 6e 2c 20 74 68 65 20 70 61 72 65 6e 74 54 61  in, the parentTa
15df0 62 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c  b parameter will
15e00 0a 2a 2a 20 62 65 20 31 20 28 74 68 65 20 32 6e  .** be 1 (the 2n
15e10 64 20 76 61 6c 75 65 20 6f 66 20 61 20 30 2d 69  d value of a 0-i
15e20 6e 64 65 78 65 64 20 61 72 72 61 79 2e 29 0a 2a  ndexed array.).*
15e30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
15e40 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
15e50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
15e60 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
15e70 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
15e80 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
15e90 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
15ea0 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
15eb0 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 44  ded. */.  int eD
15ec0 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  est,            
15ed0 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
15ee0 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  se of the result
15ef0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  s */.  int iParm
15f00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
15f10 20 41 20 70 61 72 61 6d 65 74 65 72 20 75 73 65   A parameter use
15f20 64 20 62 79 20 74 68 65 20 65 44 65 73 74 20 64  d by the eDest d
15f30 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a  isposal method *
15f40 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72  /.  Select *pPar
15f50 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e  ent,       /* An
15f60 6f 74 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72  other SELECT for
15f70 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20 61   which this is a
15f80 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20   sub-query */.  
15f90 69 6e 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20  int parentTab,  
15fa0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
15fb0 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63  in pParent->pSrc
15fc0 20 6f 66 20 74 68 69 73 20 71 75 65 72 79 20 2a   of this query *
15fd0 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74  /.  int *pParent
15fe0 41 67 67 2c 20 20 20 20 20 20 20 2f 2a 20 54 72  Agg,       /* Tr
15ff0 75 65 20 69 66 20 70 50 61 72 65 6e 74 20 75 73  ue if pParent us
16000 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
16010 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72  ctions */.  char
16020 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20   *aff           
16030 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69     /* If eDest i
16040 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65  s SRT_Union, the
16050 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
16060 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
16070 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
16080 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
16090 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
160a0 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  *pWInfo;     /* 
160b0 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69  Return from sqli
160c0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
160d0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
160e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
160f0 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
16100 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ne under constru
16110 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
16120 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20  sAgg;           
16130 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
16140 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
16150 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
16160 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
16170 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
16180 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
16190 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
161a0 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
161b0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
161c0 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
161d0 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
161e0 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
161f0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
16200 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
16210 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
16220 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20  pOrderBy;    /* 
16230 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
16240 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
16250 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
16260 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a  *pGroupBy;    /*
16270 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
16280 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
16290 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  LL */.  Expr *pH
162a0 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  aving;         /
162b0 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * The HAVING cla
162c0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
162d0 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73  L */.  int isDis
162e0 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
162f0 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
16300 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
16310 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
16320 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20  t distinct;     
16330 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
16340 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
16350 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69  tinct set */.  i
16360 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
16370 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
16380 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
16390 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
163a0 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64   int addrSortInd
163b0 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  ex;     /* Addre
163c0 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e  ss of an OP_Open
163d0 56 69 72 74 75 61 6c 20 69 6e 73 74 72 75 63 74  Virtual instruct
163e0 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f  ion */.  AggInfo
163f0 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20   sAggInfo;      
16400 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  /* Information u
16410 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65  sed by aggregate
16420 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e   queries */.  in
16430 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t iEnd;         
16440 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
16450 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  of the end of th
16460 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66  e query */..  if
16470 28 20 70 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ( p==0 || sqlite
16480 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
16490 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
164a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
164b0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
164c0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
164d0 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
164e0 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
164f0 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74  turn 1;.  memset
16500 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73  (&sAggInfo, 0, s
16510 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29  izeof(sAggInfo))
16520 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
16530 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
16540 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74  SELECT.  /* If t
16550 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65  here is are a se
16560 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65  quence of querie
16570 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65  s, do the earlie
16580 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20  r ones first..  
16590 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
165a0 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  or ){.    if( p-
165b0 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29  >pRightmost==0 )
165c0 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  {.      Select *
165d0 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 66 6f 72  pLoop;.      for
165e0 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b  (pLoop=p; pLoop;
165f0 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50   pLoop=pLoop->pP
16600 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 20 20 70  rior){.        p
16610 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  Loop->pRightmost
16620 20 3d 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = p;.      }.  
16630 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6d    }.    return m
16640 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
16650 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61  e, p, eDest, iPa
16660 72 6d 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 23 65  rm, aff);.  }.#e
16670 6e 64 69 66 0a 0a 20 20 70 4f 72 64 65 72 42 79  ndif..  pOrderBy
16680 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
16690 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f    if( IgnorableO
166a0 72 64 65 72 62 79 28 65 44 65 73 74 29 20 29 7b  rderby(eDest) ){
166b0 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
166c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
166d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
166e0 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2c 20  olve(pParse, p, 
166f0 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  0) ){.    goto s
16700 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
16710 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
16720 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4d  OrderBy;..  /* M
16730 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73  ake local copies
16740 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
16750 72 73 20 66 6f 72 20 74 68 69 73 20 71 75 65 72  rs for this quer
16760 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69  y..  */.  pTabLi
16770 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
16780 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
16790 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d  re;.  pGroupBy =
167a0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
167b0 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
167c0 76 69 6e 67 3b 0a 20 20 69 73 41 67 67 20 3d 20  ving;.  isAgg = 
167d0 70 2d 3e 69 73 41 67 67 3b 0a 20 20 69 73 44 69  p->isAgg;.  isDi
167e0 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69  stinct = p->isDi
167f0 73 74 69 6e 63 74 3b 0a 20 20 70 45 4c 69 73 74  stinct;.  pEList
16800 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
16810 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 20  if( pEList==0 ) 
16820 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
16830 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20  ..  /* .  ** Do 
16840 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74  not even attempt
16850 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79   to generate any
16860 20 63 6f 64 65 20 69 66 20 77 65 20 68 61 76 65   code if we have
16870 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20   already seen.  
16880 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65  ** errors before
16890 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74   this routine st
168a0 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  arts..  */.  if(
168b0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
168c0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
168d0 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74  d;..  /* If writ
168e0 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72  ing to memory or
168f0 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65   generating a se
16900 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  t.  ** only a si
16910 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20  ngle column may 
16920 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
16930 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16940 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69  MIT_SUBQUERY.  i
16950 66 28 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d  f( (eDest==SRT_M
16960 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
16970 5f 53 65 74 29 20 26 26 20 70 45 4c 69 73 74 2d  _Set) && pEList-
16980 3e 6e 45 78 70 72 3e 31 20 29 7b 0a 20 20 20 20  >nExpr>1 ){.    
16990 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
169a0 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20  pParse, "only a 
169b0 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c  single result al
169c0 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20  lowed for ".    
169d0 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61     "a SELECT tha
169e0 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
169f0 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20  expression");.  
16a00 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
16a10 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  d;.  }.#endif.. 
16a20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20   /* ORDER BY is 
16a30 69 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65  ignored for some
16a40 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20   destinations.. 
16a50 20 2a 2f 0a 20 20 69 66 28 20 49 67 6e 6f 72 61   */.  if( Ignora
16a60 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65 73 74  bleOrderby(eDest
16a70 29 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42  ) ){.    pOrderB
16a80 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  y = 0;.  }..  /*
16a90 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
16aa0 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76  g code..  */.  v
16ab0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
16ac0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
16ad0 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c   v==0 ) goto sel
16ae0 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49  ect_end;..  /* I
16af0 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e  dentify column n
16b00 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20  ames if we will 
16b10 62 65 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e  be using them in
16b20 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68   a callback.  Th
16b30 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20  is.  ** step is 
16b40 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f  skipped if the o
16b50 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
16b60 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 65 73  o some other des
16b70 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  tination..  */. 
16b80 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
16b90 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
16ba0 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
16bb0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
16bc0 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20  List, pEList);. 
16bd0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
16be0 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73  e code for all s
16bf0 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68  ub-queries in th
16c00 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
16c10 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
16c20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16c30 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
16c40 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
16c50 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  EW).  for(i=0; i
16c60 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
16c70 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
16c80 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74   char *zSavedAut
16c90 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20  hContext = 0;.  
16ca0 20 20 69 6e 74 20 6e 65 65 64 52 65 73 74 6f 72    int needRestor
16cb0 65 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 73 74  eContext;.    st
16cc0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
16cd0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
16ce0 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 0a 20 20 20  List->a[i];..   
16cf0 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
16d00 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ect==0 ) continu
16d10 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  e;.    if( pItem
16d20 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  ->zName!=0 ){.  
16d30 20 20 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f      zSavedAuthCo
16d40 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
16d50 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
16d60 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
16d70 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65 6d  hContext = pItem
16d80 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e  ->zName;.      n
16d90 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
16da0 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 1;.    }else
16db0 7b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74  {.      needRest
16dc0 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a  oreContext = 0;.
16dd0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
16de0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
16df0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
16e00 53 52 54 5f 56 69 72 74 75 61 6c 54 61 62 2c 20  SRT_VirtualTab, 
16e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16e20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
16e30 2c 20 70 2c 20 69 2c 20 26 69 73 41 67 67 2c 20  , p, i, &isAgg, 
16e40 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64  0);.    if( need
16e50 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 29  RestoreContext )
16e60 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
16e70 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
16e80 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
16e90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
16ea0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
16eb0 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e      pWhere = p->
16ec0 70 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28 20  pWhere;.    if( 
16ed0 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
16ee0 79 28 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(eDest) ){.    
16ef0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
16f00 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
16f10 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
16f20 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
16f30 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
16f40 76 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73 74  ving;.    isDist
16f50 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
16f60 69 6e 63 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  inct;.  }.#endif
16f70 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
16f80 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
16f90 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72 20  e of a min() or 
16fa0 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 62  max() function b
16fb0 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e  y itself.  ** in
16fc0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
16fd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70  .  */.  if( simp
16fe0 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70 50  leMinMaxQuery(pP
16ff0 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20  arse, p, eDest, 
17000 69 50 61 72 6d 29 20 29 7b 0a 20 20 20 20 72 63  iParm) ){.    rc
17010 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73   = 0;.    goto s
17020 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
17030 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
17040 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  e if this is a s
17050 75 62 71 75 65 72 79 20 74 68 61 74 20 63 61 6e  ubquery that can
17060 20 62 65 20 22 66 6c 61 74 74 65 6e 65 64 22 20   be "flattened" 
17070 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e  into its parent.
17080 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  .  ** If flatten
17090 69 6e 67 20 69 73 20 61 20 70 6f 73 73 69 62 6c  ing is a possibl
170a0 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72  ity, do so and r
170b0 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
170c0 79 2e 20 20 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  y.  .  */.#ifnde
170d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
170e0 45 57 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  EW.  if( pParent
170f0 20 26 26 20 70 50 61 72 65 6e 74 41 67 67 20 26   && pParentAgg &
17100 26 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53  &.      flattenS
17110 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20  ubquery(pParse, 
17120 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54  pParent, parentT
17130 61 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67 2c  ab, *pParentAgg,
17140 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 69   isAgg) ){.    i
17150 66 28 20 69 73 41 67 67 20 29 20 2a 70 50 61 72  f( isAgg ) *pPar
17160 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  entAgg = 1;.    
17170 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
17180 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
17190 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
171a0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
171b0 2c 20 72 65 73 6f 6c 76 65 20 61 6e 79 20 63 6f  , resolve any co
171c0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
171d0 73 0a 20 20 2a 2a 20 6e 61 6d 65 73 20 74 68 61  s.  ** names tha
171e0 74 20 68 61 76 65 20 62 65 65 6e 20 65 78 70 6c  t have been expl
171f0 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64  icitly specified
17200 20 61 6e 64 20 63 72 65 61 74 65 20 61 20 73 6f   and create a so
17210 72 74 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 2a  rting index..  *
17220 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 6f 72 74  *.  ** This sort
17230 69 6e 67 20 69 6e 64 65 78 20 6d 69 67 68 74 20  ing index might 
17240 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75  end up being unu
17250 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20  sed if the data 
17260 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74  can be .  ** ext
17270 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f  racted in pre-so
17280 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20  rted order.  If 
17290 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
172a0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
172b0 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 20 69  OP_OpenVirtual i
172c0 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
172d0 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e  be changed to an
172e0 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20   OP_Noop once.  
172f0 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74  ** we figure out
17300 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e   that the sortin
17310 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e  g index is not n
17320 65 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72  eeded.  The addr
17330 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76  SortIndex.  ** v
17340 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
17350 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68  to facilitate th
17360 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  at change..  */.
17370 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
17380 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
17390 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72  rList_item *pTer
173a0 6d 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  m;.    KeyInfo *
173b0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 66 6f  pKeyInfo;.    fo
173c0 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 4f 72  r(i=0, pTerm=pOr
173d0 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64  derBy->a; i<pOrd
173e0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
173f0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
17400 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 7a 4e 61    if( pTerm->zNa
17410 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  me ){.        pT
17420 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c  erm->pExpr->pCol
17430 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  l = sqlite3Locat
17440 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
17450 20 70 54 65 72 6d 2d 3e 7a 4e 61 6d 65 2c 20 2d   pTerm->zName, -
17460 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
17470 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  }.    if( pParse
17480 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ->nErr ){.      
17490 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
174a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 49  .    }.    pKeyI
174b0 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
174c0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
174d0 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
174e0 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
174f0 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
17500 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64  ab++;.    p->add
17510 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20 3d 20 61  rOpenVirt[2] = a
17520 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20  ddrSortIndex =. 
17530 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17540 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 56  eOp3(v, OP_OpenV
17550 69 72 74 75 61 6c 2c 20 70 4f 72 64 65 72 42 79  irtual, pOrderBy
17560 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64  ->iECursor, pOrd
17570 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 0a  erBy->nExpr+2, .
17580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17590 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
175a0 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49  KeyInfo, P3_KEYI
175b0 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
175c0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53  }else{.    addrS
175d0 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  ortIndex = -1;. 
175e0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
175f0 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20   limiter..  */. 
17600 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
17610 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
17620 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
17630 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
17640 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a   p, iEnd);..  /*
17650 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
17660 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
17670 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
17680 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
17690 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  e..  */.  if( eD
176a0 65 73 74 3d 3d 53 52 54 5f 56 69 72 74 75 61 6c  est==SRT_Virtual
176b0 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
176c0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
176d0 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 69  P_OpenVirtual, i
176e0 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
176f0 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  xpr);.  }..  /* 
17700 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69  Open a virtual i
17710 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
17720 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74  the distinct set
17730 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44  ..  */.  if( isD
17740 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b  istinct ){.    K
17750 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
17760 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  ;.    distinct =
17770 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
17780 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
17790 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
177a0 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ist(pParse, p->p
177b0 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
177c0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
177d0 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 64 69  _OpenVirtual, di
177e0 73 74 69 6e 63 74 2c 20 30 2c 20 0a 20 20 20 20  stinct, 0, .    
177f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17800 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
17810 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  nfo, P3_KEYINFO_
17820 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73  HANDOFF);.  }els
17830 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  e{.    distinct 
17840 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
17850 41 67 67 72 65 67 61 74 65 20 61 6e 64 20 6e 6f  Aggregate and no
17860 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n-aggregate quer
17870 69 65 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ies are handled 
17880 64 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20  differently */. 
17890 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70   if( !isAgg && p
178a0 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
178b0 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 69    /* This case i
178c0 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67 72 65 67  s for non-aggreg
178d0 61 74 65 20 71 75 65 72 69 65 73 0a 20 20 20 20  ate queries.    
178e0 2a 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74  ** Begin the dat
178f0 61 62 61 73 65 20 73 63 61 6e 0a 20 20 20 20 2a  abase scan.    *
17900 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73  /.    pWInfo = s
17910 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
17920 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
17930 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4f 72 64  t, pWhere, &pOrd
17940 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  erBy);.    if( p
17950 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
17960 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20  select_end;..   
17970 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69   /* If sorting i
17980 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63 72  ndex that was cr
17990 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72  eated by a prior
179a0 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 20   OP_OpenVirtual 
179b0 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  .    ** instruct
179c0 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74  ion ended up not
179d0 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74   being needed, t
179e0 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f  hen change the O
179f0 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 0a 20 20  P_OpenVirtual.  
17a00 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f    ** into an OP_
17a10 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Noop..    */.   
17a20 20 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64   if( addrSortInd
17a30 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42  ex>=0 && pOrderB
17a40 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 6e  y==0 ){.      un
17a50 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64  createSortingInd
17a60 65 78 28 70 50 61 72 73 65 2c 20 61 64 64 72 53  ex(pParse, addrS
17a70 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  ortIndex);.     
17a80 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74   p->addrOpenVirt
17a90 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  [2] = -1;.    }.
17aa0 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
17ab0 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c  standard inner l
17ac0 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oop.    */.    i
17ad0 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  f( selectInnerLo
17ae0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  op(pParse, p, pE
17af0 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64  List, 0, 0, pOrd
17b00 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20  erBy, distinct, 
17b10 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  eDest,.         
17b20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d             iParm
17b30 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69  , pWInfo->iConti
17b40 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  nue, pWInfo->iBr
17b50 65 61 6b 2c 20 61 66 66 29 20 29 7b 0a 20 20 20  eak, aff) ){.   
17b60 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
17b70 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  end;.    }..    
17b80 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
17b90 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
17ba0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
17bb0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
17bc0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
17bd0 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 70  /* This is the p
17be0 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67  rocessing for ag
17bf0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
17c00 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
17c10 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  xt sNC;    /* Na
17c20 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
17c30 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
17c40 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
17c50 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d  */.    int iAMem
17c60 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
17c70 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
17c80 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72  for storing curr
17c90 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ent GROUP BY */.
17ca0 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20      int iBMem;  
17cb0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
17cc0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
17cd0 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20   previous GROUP 
17ce0 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55  BY */.    int iU
17cf0 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  seFlag;       /*
17d00 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c   Mem address hol
17d10 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61  ding flag indica
17d20 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61  ting that at lea
17d30 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
17d40 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
17d50 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70  e row of the inp
17d60 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ut to the aggreg
17d70 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20  ator has been.  
17d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d90 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
17da0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  ed */.    int iA
17db0 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a  bortFlag;     /*
17dc0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69   Mem address whi
17dd0 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20  ch causes query 
17de0 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76  abort if positiv
17df0 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f  e */.    int gro
17e00 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20  upBySort;    /* 
17e10 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73  Rows come from s
17e20 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42  ource in GROUP B
17e30 59 20 6f 72 64 65 72 20 2a 2f 0a 0a 0a 20 20 20  Y order */...   
17e40 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
17e50 67 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64  g variables hold
17e60 20 61 64 64 72 65 73 73 65 73 20 6f 72 20 6c 61   addresses or la
17e70 62 65 6c 73 20 66 6f 72 20 70 61 72 74 73 20 6f  bels for parts o
17e80 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 69 72  f the.    ** vir
17e90 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 70 72 6f  tual machine pro
17ea0 67 72 61 6d 20 77 65 20 61 72 65 20 70 75 74 74  gram we are putt
17eb0 69 6e 67 20 74 6f 67 65 74 68 65 72 20 2a 2f 0a  ing together */.
17ec0 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70      int addrOutp
17ed0 75 74 52 6f 77 3b 20 20 20 20 20 20 2f 2a 20 53  utRow;      /* S
17ee0 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69  tart of subrouti
17ef0 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
17f00 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a  a result row */.
17f10 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41      int addrSetA
17f20 62 6f 72 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  bort;       /* S
17f30 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61  et the abort fla
17f40 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  g and return */.
17f50 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74      int addrInit
17f60 69 61 6c 69 7a 65 4c 6f 6f 70 3b 20 2f 2a 20 53  ializeLoop; /* S
17f70 74 61 72 74 20 6f 66 20 63 6f 64 65 20 74 68 61  tart of code tha
17f80 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  t initializes th
17f90 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
17fa0 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f      int addrTopO
17fb0 66 4c 6f 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54  fLoop;      /* T
17fc0 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  op of the input 
17fd0 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20  loop */.    int 
17fe0 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67  addrGroupByChang
17ff0 65 3b 20 20 2f 2a 20 43 6f 64 65 20 74 68 61 74  e;  /* Code that
18000 20 72 75 6e 73 20 77 68 65 6e 20 61 6e 79 20 47   runs when any G
18010 52 4f 55 50 20 42 59 20 74 65 72 6d 20 63 68 61  ROUP BY term cha
18020 6e 67 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nges */.    int 
18030 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77 3b 20  addrProcessRow; 
18040 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70      /* Code to p
18050 72 6f 63 65 73 73 20 61 20 73 69 6e 67 6c 65 20  rocess a single 
18060 69 6e 70 75 74 20 72 6f 77 20 2a 2f 0a 20 20 20  input row */.   
18070 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20   int addrEnd;   
18080 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
18090 6f 66 20 61 6c 6c 20 70 72 6f 63 65 73 73 69 6e  of all processin
180a0 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  g */.    int add
180b0 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 20 20 20  rSortingIdx;    
180c0 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 56   /* The OP_OpenV
180d0 69 72 74 75 61 6c 20 66 6f 72 20 74 68 65 20 73  irtual for the s
180e0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  orting index */.
180f0 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65      int addrRese
18100 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  t;          /* S
18110 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65  ubroutine for re
18120 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75  setting the accu
18130 6d 75 6c 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20  mulator */..    
18140 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65  addrEnd = sqlite
18150 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
18160 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  );..    /* Conve
18170 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  rt TK_COLUMN nod
18180 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  es into TK_AGG_C
18190 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65  OLUMN and make e
181a0 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a  ntries in.    **
181b0 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c   sAggInfo for al
181c0 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  l TK_AGG_FUNCTIO
181d0 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65  N nodes in expre
181e0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20  ssions of the.  
181f0 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
18200 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ement..    */.  
18210 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
18220 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
18230 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
18240 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
18250 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
18260 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41  List;.    sNC.pA
18270 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e  ggInfo = &sAggIn
18280 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f  fo;.    sAggInfo
18290 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20  .nSortingColumn 
182a0 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72  = pGroupBy ? pGr
182b0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a  oupBy->nExpr+1 :
182c0 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
182d0 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
182e0 75 70 42 79 3b 0a 20 20 20 20 69 66 28 20 73 71  upBy;.    if( sq
182f0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
18300 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45  AggList(&sNC, pE
18310 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 67  List) ){.      g
18320 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
18330 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
18340 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
18350 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f  AggList(&sNC, pO
18360 72 64 65 72 42 79 29 20 29 7b 0a 20 20 20 20 20  rderBy) ){.     
18370 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
18380 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18390 70 48 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74  pHaving && sqlit
183a0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
183b0 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48  regates(&sNC, pH
183c0 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20  aving) ){.      
183d0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
183e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
183f0 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  nfo.nAccumulator
18400 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   = sAggInfo.nCol
18410 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  umn;.    for(i=0
18420 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75  ; i<sAggInfo.nFu
18430 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nc; i++){.      
18440 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41  if( sqlite3ExprA
18450 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
18460 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  NC, sAggInfo.aFu
18470 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 4c 69  nc[i].pExpr->pLi
18480 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67  st) ){.        g
18490 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
184a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
184b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c    if( sqlite3Mal
184c0 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20 67 6f  locFailed() ) go
184d0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
184e0 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e      /* Processin
184f0 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73  g for aggregates
18500 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69   with GROUP BY i
18510 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74  s very different
18520 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68   and.    ** much
18530 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68   more complex th
18540 61 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  a aggregates wit
18550 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e  hout a GROUP BY.
18560 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
18570 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
18580 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
18590 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20  nfo;  /* Keying 
185a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
185b0 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61  the group by cla
185c0 75 73 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  use */..      /*
185d0 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 74   Create labels t
185e0 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 6e  hat we will be n
185f0 65 65 64 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  eeding.      */.
18600 20 20 20 20 20 0a 20 20 20 20 20 20 61 64 64 72       .      addr
18610 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 20 3d  InitializeLoop =
18620 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
18630 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
18640 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67  addrGroupByChang
18650 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
18660 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
18670 20 20 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f     addrProcessRo
18680 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  w = sqlite3VdbeM
18690 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
186a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
186b0 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  is a GROUP BY cl
186c0 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65  ause we might ne
186d0 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  ed a sorting ind
186e0 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69  ex to.      ** i
186f0 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c  mplement it.  Al
18700 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74  locate that sort
18710 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20  ing index now.  
18720 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a  If it turns out.
18730 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
18740 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20   do not need it 
18750 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f  after all, the O
18760 70 65 6e 56 69 72 74 75 61 6c 20 69 6e 73 74 72  penVirtual instr
18770 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  uction.      ** 
18780 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
18790 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20  d into a Noop.  
187a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
187b0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
187c0 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
187d0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79  ab++;.      pKey
187e0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
187f0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
18800 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  e, pGroupBy);.  
18810 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49      addrSortingI
18820 64 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73  dx =.          s
18830 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
18840 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c   OP_OpenVirtual,
18850 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
18860 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20  gIdx,.          
18870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
18880 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
18890 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20  Column,.        
188a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188b0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
188c0 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
188d0 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  DOFF);..      /*
188e0 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
188f0 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65  ry locations use
18900 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67  d by GROUP BY ag
18910 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69  gregate processi
18920 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ng.      */.    
18930 20 20 69 55 73 65 46 6c 61 67 20 3d 20 70 50 61    iUseFlag = pPa
18940 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
18950 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20     iAbortFlag = 
18960 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
18970 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50        iAMem = pP
18980 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
18990 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
189a0 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
189b0 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d  r;.      iBMem =
189c0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
189d0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
189e0 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
189f0 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
18a00 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
18a10 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69 41  OP_MemInt, 0, iA
18a20 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
18a30 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
18a40 20 22 23 20 63 6c 65 61 72 20 61 62 6f 72 74 20   "# clear abort 
18a50 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
18a60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
18a70 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c  v, OP_MemInt, 0,
18a80 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
18a90 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
18aa0 2c 20 22 23 20 69 6e 64 69 63 61 74 65 20 61 63  , "# indicate ac
18ab0 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22  cumulator empty"
18ac0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
18ad0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
18ae0 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 49 6e  _Goto, 0, addrIn
18af0 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 0a  itializeLoop);..
18b00 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
18b10 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
18b20 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69  hat outputs a si
18b30 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
18b40 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
18b50 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f  set.  This subro
18b60 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b  utine first look
18b70 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61  s at the iUseFla
18b80 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a  g.  If iUseFlag.
18b90 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73        ** is less
18ba0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
18bb0 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72  o zero, the subr
18bc0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
18bd0 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20  p.  If.      ** 
18be0 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  the processing c
18bf0 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65  alls for the que
18c00 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69  ry to abort, thi
18c10 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  s subroutine.   
18c20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73     ** increments
18c30 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20   the iAbortFlag 
18c40 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
18c50 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
18c60 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64   in.      ** ord
18c70 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65  er to signal the
18c80 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74   caller to abort
18c90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18ca0 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20   addrSetAbort = 
18cb0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
18cc0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
18cd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18ce0 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20  p(v, OP_MemInt, 
18cf0 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  1, iAbortFlag);.
18d00 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
18d10 74 28 28 76 2c 20 22 23 20 73 65 74 20 61 62 6f  t((v, "# set abo
18d20 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
18d30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18d40 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  Op(v, OP_Return,
18d50 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64   0, 0);.      ad
18d60 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71  drOutputRow = sq
18d70 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
18d80 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
18d90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
18da0 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20  v, OP_IfMemPos, 
18db0 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75  iUseFlag, addrOu
18dc0 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20  tputRow+2);.    
18dd0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
18de0 2c 20 22 23 20 47 72 6f 75 70 62 79 20 72 65 73  , "# Groupby res
18df0 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e  ult generator en
18e00 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20  try point"));.  
18e10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18e20 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72  ddOp(v, OP_Retur
18e30 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
18e40 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
18e50 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
18e60 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69  ggInfo);.      i
18e70 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
18e80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18e90 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
18ea0 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75   pHaving, addrOu
18eb0 74 70 75 74 52 6f 77 2b 31 2c 20 31 29 3b 0a 20  tputRow+1, 1);. 
18ec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
18ed0 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  = selectInnerLoo
18ee0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
18ef0 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
18f00 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
18f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f20 20 20 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65     distinct, eDe
18f30 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20  st, iParm, .    
18f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f50 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75         addrOutpu
18f60 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41  tRow+1, addrSetA
18f70 62 6f 72 74 2c 20 61 66 66 29 3b 0a 20 20 20 20  bort, aff);.    
18f80 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
18f90 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
18fa0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
18fb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18fc0 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  dOp(v, OP_Return
18fd0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 56  , 0, 0);.      V
18fe0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
18ff0 23 20 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65  # end groupby re
19000 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29  sult generator")
19010 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
19020 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
19030 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73  ne that will res
19040 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20  et the group-by 
19050 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20  accumulator.    
19060 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 52    */.      addrR
19070 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64  eset = sqlite3Vd
19080 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
19090 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  ;.      resetAcc
190a0 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
190b0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
190c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
190d0 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  dOp(v, OP_Return
190e0 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20  , 0, 0);..      
190f0 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20  /* Begin a loop 
19100 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
19110 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77  t all source row
19120 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  s in GROUP BY or
19130 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  der..      ** Th
19140 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65  is might involve
19150 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f   two separate lo
19160 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53  ops with an OP_S
19170 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20  ort in between, 
19180 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d  or.      ** it m
19190 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65  ight be a single
191a0 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20   loop that uses 
191b0 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72  an index to extr
191c0 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  act information.
191d0 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
191e0 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62  right order to b
191f0 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20  egin with..     
19200 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
19210 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
19220 6c 28 76 2c 20 61 64 64 72 49 6e 69 74 69 61 6c  l(v, addrInitial
19230 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  izeLoop);.      
19240 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19250 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c  (v, OP_Gosub, 0,
19260 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
19270 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
19280 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
19290 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
192a0 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70 42  pWhere, &pGroupB
192b0 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  y);.      if( pW
192c0 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
192d0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
192e0 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30   if( pGroupBy==0
192f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
19300 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20  he optimizer is 
19310 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20  able to deliver 
19320 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79  rows in group by
19330 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20   order so.      
19340 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68    ** we do not h
19350 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68  ave to sort.  Th
19360 65 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c  e OP_OpenVirtual
19370 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20   table will be. 
19380 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c         ** cancel
19390 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73  led later becaus
193a0 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  e we still need 
193b0 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49  to use the pKeyI
193c0 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nfo.        */. 
193d0 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20         pGroupBy 
193e0 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
193f0 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
19400 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rt = 0;.      }e
19410 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
19420 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20  Rows are coming 
19430 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69  out in undetermi
19440 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68  ned order.  We h
19450 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20  ave to push.    
19460 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20      ** each row 
19470 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
19480 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20  ndex, terminate 
19490 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a  the first loop,.
194a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
194b0 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f  loop over the so
194c0 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f  rting index in o
194d0 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
194e0 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a  output.        *
194f0 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  * in sorted orde
19500 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  r.        */.   
19510 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
19520 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71   = 1;.        sq
19530 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
19540 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
19550 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20  roupBy);.       
19560 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19570 70 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  p(v, OP_Sequence
19580 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
19590 6e 67 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20  ngIdx, 0);.     
195a0 20 20 20 6a 20 3d 20 70 47 72 6f 75 70 42 79 2d     j = pGroupBy-
195b0 3e 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 20 20  >nExpr+1;.      
195c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
195d0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
195e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
195f0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
19600 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49  l *pCol = &sAggI
19610 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20  nfo.aCol[i];.   
19620 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
19630 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 6a  >iSorterColumn<j
19640 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
19650 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
19660 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
19670 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19680 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
19690 5f 52 6f 77 69 64 2c 20 70 43 6f 6c 2d 3e 69 54  _Rowid, pCol->iT
196a0 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
196b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
196c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
196d0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
196e0 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62  lumn, pCol->iTab
196f0 6c 65 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d  le, pCol->iColum
19700 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  n);.          }.
19710 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
19720 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19730 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19740 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
19750 72 64 2c 20 6a 2c 20 30 29 3b 0a 20 20 20 20 20  rd, j, 0);.     
19760 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19770 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  dOp(v, OP_IdxIns
19780 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ert, sAggInfo.so
19790 72 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a 20 20  rtingIdx, 0);.  
197a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
197b0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
197c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
197d0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
197e0 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
197f0 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64  tingIdx, addrEnd
19800 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
19810 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 47 52  omment((v, "# GR
19820 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a  OUP BY sort"));.
19830 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
19840 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d  .useSortingIdx =
19850 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   1;.      }..   
19860 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
19870 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
19880 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74   BY terms and st
19890 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62  ore in b0, b1, b
198a0 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62  2....      ** (b
198b0 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  0 is memory loca
198c0 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31  tion iBMem+0, b1
198d0 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64   is iBMem+1, and
198e0 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20   so forth).     
198f0 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65   ** Then compare
19900 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
19910 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69  UP BY terms agai
19920 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  nst the GROUP BY
19930 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20   terms.      ** 
19940 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
19950 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20  s row currently 
19960 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31  stored in a0, a1
19970 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  , a2....      */
19980 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66  .      addrTopOf
19990 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
199a0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
199b0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
199c0 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
199d0 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
199e0 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
199f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
19a00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
19a10 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 41  v, OP_Column, sA
19a20 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
19a30 78 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  x, j);.        }
19a40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
19a50 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d  sAggInfo.directM
19a60 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ode = 1;.       
19a70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
19a80 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  de(pParse, pGrou
19a90 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29  pBy->a[j].pExpr)
19aa0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19ab0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19ac0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
19ad0 6f 72 65 2c 20 69 42 4d 65 6d 2b 6a 2c 20 6a 3c  ore, iBMem+j, j<
19ae0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d  pGroupBy->nExpr-
19af0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
19b00 20 20 66 6f 72 28 6a 3d 70 47 72 6f 75 70 42 79    for(j=pGroupBy
19b10 2d 3e 6e 45 78 70 72 2d 31 3b 20 6a 3e 3d 30 3b  ->nExpr-1; j>=0;
19b20 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69   j--){.        i
19b30 66 28 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  f( j<pGroupBy->n
19b40 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20  Expr-1 ){.      
19b50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19b60 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
19b70 61 64 2c 20 69 42 4d 65 6d 2b 6a 2c 20 30 29 3b  ad, iBMem+j, 0);
19b80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19b90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19ba0 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
19bb0 64 2c 20 69 41 4d 65 6d 2b 6a 2c 20 30 29 3b 0a  d, iAMem+j, 0);.
19bc0 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30          if( j==0
19bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
19be0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
19bf0 2c 20 4f 50 5f 45 71 2c 20 30 78 32 30 30 2c 20  , OP_Eq, 0x200, 
19c00 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77 29 3b  addrProcessRow);
19c10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
19c20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19c30 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
19c40 5f 4e 65 2c 20 30 78 32 30 30 2c 20 61 64 64 72  _Ne, 0x200, addr
19c50 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29 3b 0a  GroupByChange);.
19c60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19c70 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
19c80 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 76 6f  ngeP3(v, -1, (vo
19c90 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  id*)pKeyInfo->aC
19ca0 6f 6c 6c 5b 6a 5d 2c 20 50 33 5f 43 4f 4c 4c 53  oll[j], P3_COLLS
19cb0 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  EQ);.      }..  
19cc0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
19cd0 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77  code that runs w
19ce0 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55  henever the GROU
19cf0 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20  P BY changes..  
19d00 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 20 69 6e      ** Change in
19d10 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72   the GROUP BY ar
19d20 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68  e detected by th
19d30 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a  e previous code.
19d40 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20        ** block. 
19d50 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e   If there were n
19d60 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20  o changes, this 
19d70 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64  block is skipped
19d80 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
19d90 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f   ** This code co
19da0 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f  pies current gro
19db0 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62  up by terms in b
19dc0 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20  0,b1,b2,....    
19dd0 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c    ** over to a0,
19de0 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20  a1,a2.  It then 
19df0 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74  calls the output
19e00 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
19e10 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20    ** and resets 
19e20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
19e30 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
19e40 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69  ers in preparati
19e50 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  on.      ** for 
19e60 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42  the next GROUP B
19e70 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a  Y batch..      *
19e80 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
19e90 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
19ea0 76 2c 20 61 64 64 72 47 72 6f 75 70 42 79 43 68  v, addrGroupByCh
19eb0 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  ange);.      for
19ec0 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79  (j=0; j<pGroupBy
19ed0 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
19ee0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19ef0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
19f00 6d 4d 6f 76 65 2c 20 69 41 4d 65 6d 2b 6a 2c 20  mMove, iAMem+j, 
19f10 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
19f20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
19f30 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
19f40 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 4f 75 74  osub, 0, addrOut
19f50 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
19f60 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
19f70 23 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  # output one row
19f80 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
19f90 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
19fa0 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 41 62 6f  P_IfMemPos, iAbo
19fb0 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29  rtFlag, addrEnd)
19fc0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
19fd0 65 6e 74 28 28 76 2c 20 22 23 20 63 68 65 63 6b  ent((v, "# check
19fe0 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
19ff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a000 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73  eAddOp(v, OP_Gos
1a010 75 62 2c 20 30 2c 20 61 64 64 72 52 65 73 65 74  ub, 0, addrReset
1a020 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1a030 6d 65 6e 74 28 28 76 2c 20 22 23 20 72 65 73 65  ment((v, "# rese
1a040 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  t accumulator"))
1a050 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
1a060 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65  te the aggregate
1a070 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61   accumulators ba
1a080 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
1a090 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  nt of.      ** t
1a0a0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20  he current row. 
1a0b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
1a0c0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1a0d0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 50 72 6f  Label(v, addrPro
1a0e0 63 65 73 73 52 6f 77 29 3b 0a 20 20 20 20 20 20  cessRow);.      
1a0f0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
1a100 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
1a110 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
1a120 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1a130 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 69 55  OP_MemInt, 1, iU
1a140 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
1a150 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1a160 23 20 69 6e 64 69 63 61 74 65 20 64 61 74 61 20  # indicate data 
1a170 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  in accumulator")
1a180 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64  );..      /* End
1a190 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20   of the loop.   
1a1a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1a1b0 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
1a1c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1a1d0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
1a1e0 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  xt, sAggInfo.sor
1a1f0 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70  tingIdx, addrTop
1a200 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d  OfLoop);.      }
1a210 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1a220 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
1a230 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 75  Info);.        u
1a240 6e 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e  ncreateSortingIn
1a250 64 65 78 28 70 50 61 72 73 65 2c 20 61 64 64 72  dex(pParse, addr
1a260 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20  SortingIdx);.   
1a270 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f     }..      /* O
1a280 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20  utput the final 
1a290 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20  row of result.  
1a2a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
1a2b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1a2c0 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64   OP_Gosub, 0, ad
1a2d0 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
1a2e0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1a2f0 28 76 2c 20 22 23 20 6f 75 74 70 75 74 20 66 69  (v, "# output fi
1a300 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 20 20 20 20  nal row"));.    
1a310 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69    .    } /* endi
1a320 66 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20 20  f pGroupBy */.  
1a330 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f    else {.      /
1a340 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73  * This case runs
1a350 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74   if the aggregat
1a360 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  e has no GROUP B
1a370 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20  Y clause.  The. 
1a380 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
1a390 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c  ng is much simpl
1a3a0 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  er since there i
1a3b0 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
1a3c0 72 6f 77 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  row.      ** of 
1a3d0 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f  output..      */
1a3e0 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75  .      resetAccu
1a3f0 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
1a400 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
1a410 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
1a420 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
1a430 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
1a440 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20  Where, 0);.     
1a450 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
1a460 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1a470 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63  ;.      updateAc
1a480 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
1a490 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
1a4a0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1a4b0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
1a4c0 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
1a4d0 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
1a4e0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
1a4f0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
1a500 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e        if( pHavin
1a510 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
1a520 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1a530 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
1a540 20 61 64 64 72 45 6e 64 2c 20 31 29 3b 0a 20 20   addrEnd, 1);.  
1a550 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65      }.      sele
1a560 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
1a570 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
1a580 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a  , 0, 0, 0, -1, .
1a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5a0 20 20 20 20 20 20 65 44 65 73 74 2c 20 69 50 61        eDest, iPa
1a5b0 72 6d 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64  rm, addrEnd, add
1a5c0 72 45 6e 64 2c 20 61 66 66 29 3b 0a 20 20 20 20  rEnd, aff);.    
1a5d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1a5e0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1a5f0 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a   addrEnd);.    .
1a600 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67    } /* endif agg
1a610 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
1a620 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
1a630 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
1a640 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
1a650 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
1a660 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
1a670 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
1a680 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
1a690 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
1a6a0 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
1a6b0 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
1a6c0 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20  l(pParse, p, v, 
1a6d0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65  pEList->nExpr, e
1a6e0 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20  Dest, iParm);.  
1a6f0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1a700 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1a710 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
1a720 20 61 20 73 75 62 71 75 65 72 79 2c 20 77 65 20   a subquery, we 
1a730 68 61 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74  have now convert
1a740 65 64 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ed the subquery 
1a750 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70  into a.  ** temp
1a760 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 53 6f  orary table.  So
1a770 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 71   delete the subq
1a780 75 65 72 79 20 73 74 72 75 63 74 75 72 65 20 66  uery structure f
1a790 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 0a 20  rom the parent. 
1a7a0 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74   ** to prevent t
1a7b0 68 69 73 20 73 75 62 71 75 65 72 79 20 66 72 6f  his subquery fro
1a7c0 6d 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  m being evaluate
1a7d0 64 20 61 67 61 69 6e 20 61 6e 64 20 74 6f 20 66  d again and to f
1a7e0 6f 72 63 65 20 74 68 65 0a 20 20 2a 2a 20 74 68  orce the.  ** th
1a7f0 65 20 75 73 65 20 6f 66 20 74 68 65 20 74 65 6d  e use of the tem
1a800 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 20 20  porary table..  
1a810 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  */.  if( pParent
1a820 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a830 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e  pParent->pSrc->n
1a840 53 72 63 3e 70 61 72 65 6e 74 54 61 62 20 29 3b  Src>parentTab );
1a850 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1a860 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61  rent->pSrc->a[pa
1a870 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74  rentTab].pSelect
1a880 3d 3d 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==p );.    sqlit
1a890 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
1a8a0 29 3b 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  );.    pParent->
1a8b0 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61  pSrc->a[parentTa
1a8c0 62 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  b].pSelect = 0;.
1a8d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1a8e0 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
1a8f0 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  ip this query.  
1a900 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1a910 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1a920 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  iEnd);..  /* The
1a930 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63   SELECT was succ
1a940 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20  essfully coded. 
1a950 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e    Set the return
1a960 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20   code to 0.  ** 
1a970 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65  to indicate no e
1a980 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rrors..  */.  rc
1a990 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74   = 0;..  /* Cont
1a9a0 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72  rol jumps to her
1a9b0 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
1a9c0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f   encountered abo
1a9d0 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a  ve, or upon.  **
1a9e0 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69   successful codi
1a9f0 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ng of the SELECT
1aa00 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e  ..  */.select_en
1aa10 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  d:.  sqliteFree(
1aa20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a  sAggInfo.aCol);.
1aa30 20 20 73 71 6c 69 74 65 46 72 65 65 28 73 41 67    sqliteFree(sAg
1aa40 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20  gInfo.aFunc);.  
1aa50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a           return rc;.}.