/ Hex Artifact Content
Login

Artifact 11ad28afb33bb83b655074c87557d4686c67f92f:


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 32 39 39  select.c,v 1.299
0200: 20 32 30 30 36 2f 30 31 2f 32 32 20 32 31 3a 35   2006/01/22 21:5
0210: 32 3a 35 37 20 64 72 68 20 45 78 70 20 24 0a 2a  2:57 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 28 43 6f 6c 6c 53 65 71 2a 2a 29 26 70 4b  = (CollSeq**)&pK
ef10: 65 79 49 6e 66 6f 5b 31 5d 3b 0a 20 20 20 20 20  eyInfo[1];.     
ef20: 20 70 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b   pSortOrder = pK
ef30: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
ef40: 65 72 20 3d 20 28 75 38 2a 29 26 61 43 6f 70 79  er = (u8*)&aCopy
ef50: 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 6d 65  [nCol];.      me
ef60: 6d 63 70 79 28 61 43 6f 70 79 2c 20 70 4b 65 79  mcpy(aCopy, pKey
ef70: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e 43 6f  Info->aColl, nCo
ef80: 6c 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  l*sizeof(CollSeq
ef90: 2a 29 29 3b 0a 20 20 20 20 20 20 61 70 43 6f 6c  *));.      apCol
efa0: 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
efb0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  oll;.      for(i
efc0: 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 45 78  =0; i<nOrderByEx
efd0: 70 72 3b 20 69 2b 2b 2c 20 70 4f 54 65 72 6d 2b  pr; i++, pOTerm+
efe0: 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 2c 20 70 53 6f  +, apColl++, pSo
eff0: 72 74 4f 72 64 65 72 2b 2b 29 7b 0a 20 20 20 20  rtOrder++){.    
f000: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
f010: 3d 20 70 4f 54 65 72 6d 2d 3e 70 45 78 70 72 3b  = pOTerm->pExpr;
f020: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
f030: 4e 61 6d 65 20 3d 20 70 4f 54 65 72 6d 2d 3e 7a  Name = pOTerm->z
f040: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73  Name;.        as
f050: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
f060: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
f070: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 6e 43 6f  xpr->iColumn<nCo
f080: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  l );.        if(
f090: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   zName ){.      
f0a0: 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 73 71      *apColl = sq
f0b0: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
f0c0: 65 71 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  eq(pParse, zName
f0d0: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
f0e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f0f0: 2a 61 70 43 6f 6c 6c 20 3d 20 61 43 6f 70 79 5b  *apColl = aCopy[
f100: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b  pExpr->iColumn];
f110: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f120: 20 20 20 2a 70 53 6f 72 74 4f 72 64 65 72 20 3d     *pSortOrder =
f130: 20 70 4f 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64   pOTerm->sortOrd
f140: 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  er;.      }.    
f150: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
f160: 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20  ghtmost==p );.  
f170: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
f180: 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 3e 3d  ddrOpenVirt[2]>=
f190: 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  0 );.      addr 
f1a0: 3d 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72  = p->addrOpenVir
f1b0: 74 5b 32 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  t[2];.      sqli
f1c0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
f1d0: 76 2c 20 61 64 64 72 2c 20 70 2d 3e 70 45 4c 69  v, addr, p->pELi
f1e0: 73 74 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20  st->nExpr+2);.  
f1f0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46      pKeyInfo->nF
f200: 69 65 6c 64 20 3d 20 6e 4f 72 64 65 72 42 79 45  ield = nOrderByE
f210: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
f220: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
f230: 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70  , addr, (char*)p
f240: 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49  KeyInfo, P3_KEYI
f250: 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
f260: 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 30      pKeyInfo = 0
f270: 3b 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74 65  ;.      generate
f280: 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c  SortTail(pParse,
f290: 20 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74   p, v, p->pEList
f2a0: 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20  ->nExpr, eDest, 
f2b0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20  iParm);.    }.. 
f2c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b     sqliteFree(pK
f2d0: 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75  eyInfo);.  }..mu
f2e0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a  lti_select_end:.
f2f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
f300: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
f310: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
f320: 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  LECT */..#ifndef
f330: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
f340: 57 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72  W./*.** Scan thr
f350: 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73  ough the express
f360: 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c  ion pExpr.  Repl
f370: 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65  ace every refere
f380: 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75  nce to.** a colu
f390: 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62  mn in table numb
f3a0: 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61  er iTable with a
f3b0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f   copy of the iCo
f3c0: 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79  lumn-th.** entry
f3d0: 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75   in pEList.  (Bu
f3e0: 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63  t leave referenc
f3f0: 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20  es to the ROWID 
f400: 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61  column .** uncha
f410: 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69  nged.).**.** Thi
f420: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
f430: 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e  t of the flatten
f440: 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20  ing procedure.  
f450: 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68  A subquery.** wh
f460: 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  ose result set i
f470: 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c  s defined by pEL
f480: 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65  ist appears as e
f490: 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46  ntry in the.** F
f4a0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
f4b0: 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74  SELECT such that
f4c0: 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   the VDBE cursor
f4d0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61   assigned to tha
f4e0: 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65  t.** FORM clause
f4f0: 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65   entry is iTable
f500: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
f510: 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61  make the necessa
f520: 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ry .** changes t
f530: 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  o pExpr so that 
f540: 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  it refers direct
f550: 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  ly to the source
f560: 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65   table.** of the
f570: 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72   subquery rather
f580: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
f590: 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
f5a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f5b0: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78  substExprList(Ex
f5c0: 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72  prList*,int,Expr
f5d0: 4c 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77  List*);  /* Forw
f5e0: 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74  ard Decl */.stat
f5f0: 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
f600: 65 63 74 28 53 65 6c 65 63 74 20 2a 2c 20 69 6e  ect(Select *, in
f610: 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 20  t, ExprList *); 
f620: 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c   /* Forward Decl
f630: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
f640: 73 75 62 73 74 45 78 70 72 28 45 78 70 72 20 2a  substExpr(Expr *
f650: 70 45 78 70 72 2c 20 69 6e 74 20 69 54 61 62 6c  pExpr, int iTabl
f660: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  e, ExprList *pEL
f670: 69 73 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70  ist){.  if( pExp
f680: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
f690: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
f6a0: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
f6b0: 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  pr->iTable==iTab
f6c0: 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  le ){.    if( pE
f6d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
f6e0: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  {.      pExpr->o
f6f0: 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
f700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
f710: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  pr *pNew;.      
f720: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
f730: 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  0 && pExpr->iCol
f740: 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  umn<pEList->nExp
f750: 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
f760: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
f770: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
f780: 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  ght==0 && pExpr-
f790: 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20  >pList==0 );.   
f7a0: 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74     pNew = pEList
f7b0: 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ->a[pExpr->iColu
f7c0: 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  mn].pExpr;.     
f7d0: 20 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30   assert( pNew!=0
f7e0: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
f7f0: 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a  >op = pNew->op;.
f800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
f810: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b  xpr->pLeft==0 );
f820: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  .      pExpr->pL
f830: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
f840: 72 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74  rDup(pNew->pLeft
f850: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
f860: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
f870: 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
f880: 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74  ->pRight = sqlit
f890: 65 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e  e3ExprDup(pNew->
f8a0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61  pRight);.      a
f8b0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
f8c0: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
f8d0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73  pExpr->pList = s
f8e0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
f8f0: 70 28 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a  p(pNew->pList);.
f900: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
f910: 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62  ble = pNew->iTab
f920: 6c 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  le;.      pExpr-
f930: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d  >iColumn = pNew-
f940: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
f950: 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e  pExpr->iAgg = pN
f960: 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20  ew->iAgg;.      
f970: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
f980: 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20  (&pExpr->token, 
f990: 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  &pNew->token);. 
f9a0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65       sqlite3Toke
f9b0: 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 73 70  nCopy(&pExpr->sp
f9c0: 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29  an, &pNew->span)
f9d0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
f9e0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
f9f0: 53 65 6c 65 63 74 44 75 70 28 70 4e 65 77 2d 3e  SelectDup(pNew->
fa00: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
fa10: 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70  pExpr->flags = p
fa20: 4e 65 77 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  New->flags;.    
fa30: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
fa40: 75 62 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e  ubstExpr(pExpr->
fa50: 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
fa60: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
fa70: 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 52 69  tExpr(pExpr->pRi
fa80: 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ght, iTable, pEL
fa90: 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 53  ist);.    substS
faa0: 65 6c 65 63 74 28 70 45 78 70 72 2d 3e 70 53 65  elect(pExpr->pSe
fab0: 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  lect, iTable, pE
fac0: 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
fad0: 45 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e  ExprList(pExpr->
fae0: 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  pList, iTable, p
faf0: 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
fb00: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
fb10: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
fb20: 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69 54 61   *pList, int iTa
fb30: 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  ble, ExprList *p
fb40: 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  EList){.  int i;
fb50: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
fb60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
fb70: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
fb80: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
fb90: 75 62 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e  ubstExpr(pList->
fba0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
fbb0: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
fbc0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
fbd0: 75 62 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63  ubstSelect(Selec
fbe0: 74 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  t *p, int iTable
fbf0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
fc00: 73 74 29 7b 0a 20 20 69 66 28 20 21 70 20 29 20  st){.  if( !p ) 
fc10: 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45  return;.  substE
fc20: 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73  xprList(p->pELis
fc30: 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
fc40: 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
fc50: 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  ist(p->pGroupBy,
fc60: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
fc70: 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
fc80: 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  t(p->pOrderBy, i
fc90: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
fca0: 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
fcb0: 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20  Having, iTable, 
fcc0: 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
fcd0: 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
fce0: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
fcf0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
fd00: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
fd10: 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 6e  T_VIEW) */..#ifn
fd20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fd30: 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  VIEW./*.** This 
fd40: 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
fd50: 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71   to flatten subq
fd60: 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20  ueries in order 
fd70: 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63  to speed.** exec
fd80: 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72  ution.  It retur
fd90: 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
fda0: 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
fdb0: 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a  f no flattening.
fdc0: 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ** occurs..**.**
fdd0: 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74   To understand t
fde0: 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c  he concept of fl
fdf0: 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64  attening, consid
fe00: 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
fe10: 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  .** query:.**.**
fe20: 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
fe30: 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41  OM (SELECT x+y A
fe40: 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
fe50: 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61  E z<100) WHERE a
fe60: 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  >5.**.** The def
fe70: 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c  ault way of impl
fe80: 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75  ementing this qu
fe90: 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74  ery is to execut
fea0: 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72  e the.** subquer
feb0: 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72  y first and stor
fec0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
fed0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
fee0: 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20  le, then.** run 
fef0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
ff00: 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72  on that temporar
ff10: 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  y table.  This r
ff20: 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70  equires two.** p
ff30: 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64  asses over the d
ff40: 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72  ata.  Furthermor
ff50: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74  e, because the t
ff60: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a  emporary table.*
ff70: 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73  * has no indices
ff80: 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  , the WHERE clau
ff90: 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20  se on the outer 
ffa0: 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a  query cannot be.
ffb0: 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a  ** optimized..**
ffc0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ffd0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77   attempts to rew
ffe0: 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63  rite queries suc
fff0: 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69  h as the above i
10000 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
10010 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b  flat select, lik
10020 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
10030 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20    SELECT x+y AS 
10040 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
10050 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a  z<100 AND a>5.**
10060 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
10070 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20  erated for this 
10080 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69  simpification gi
10090 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73  ves the same res
100a0 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20  ult.** but only 
100b0 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20  has to scan the 
100c0 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20  data once.  And 
100d0 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20  because indices 
100e0 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20  might .** exist 
100f0 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c  on the table t1,
10100 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e   a complete scan
10110 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67   of the data mig
10120 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64  ht be.** avoided
10130 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69  ..**.** Flatteni
10140 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d  ng is only attem
10150 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74  pted if all of t
10160 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
10170 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28   true:.**.**   (
10180 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
10190 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
101a0 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
101b0 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e   use aggregates.
101c0 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68  .**.**   (2)  Th
101d0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
101e0 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
101f0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
10200 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
10210 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68  .**.**   (3)  Th
10220 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
10230 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  t the right oper
10240 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
10250 74 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20  ter join, or.** 
10260 20 20 20 20 20 20 20 74 68 65 20 73 75 62 71 75         the subqu
10270 65 72 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c  ery is not itsel
10280 66 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b  f a join.  (Tick
10290 65 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20  et #306).**.**  
102a0 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
102b0 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
102c0 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
102d0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
102e0 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29  oin..**.**   (5)
102f0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
10300 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f  s not DISTINCT o
10310 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
10320 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
10330 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
10340 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29  tes..**.**   (6)
10350 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
10360 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
10370 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
10380 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
10390 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
103a0 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
103b0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68    The subquery h
103c0 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  as a FROM clause
103d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54  ..**.**   (8)  T
103e0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
103f0 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
10400 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
10410 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
10420 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68  .**.**   (9)  Th
10430 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
10440 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
10450 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
10460 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
10470 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
10480 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20  es..**.**  (10) 
10490 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
104a0 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
104b0 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
104c0 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
104d0 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20  t.**        use 
104e0 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  LIMIT..**.**  (1
104f0 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
10500 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
10510 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
10520 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63   have ORDER BY c
10530 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  lauses..**.**  (
10540 31 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  12)  The subquer
10550 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  y is not the rig
10560 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
10570 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20  T OUTER JOIN or 
10580 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  the.**        su
10590 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
105a0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 28 61 64  ERE clause.  (ad
105b0 64 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  ded by ticket #3
105c0 35 30 29 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20  50).**.**  (13) 
105d0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
105e0 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  d outer query do
105f0 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49   not both use LI
10600 4d 49 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20  MIT.**.**  (14) 
10610 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
10620 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45  es not use OFFSE
10630 54 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  T.**.** In this 
10640 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
10650 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
10660 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
10670 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
10680 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
10690 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
106a0 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
106b0 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
106c0 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
106d0 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75  egates and subqu
106e0 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65  eryIsAgg is true
106f0 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
10700 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
10710 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
10720 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
10730 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
10740 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
10750 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
10760 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
10770 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
10780 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
10790 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
107a0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
107b0 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
107c0 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
107d0 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
107e0 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
107f0 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
10800 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
10810 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
10820 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73  Subquery(.  Pars
10830 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
10840 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
10850 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
10860 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
10870 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
10880 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
10890 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
108a0 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
108b0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
108c0 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
108d0 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
108e0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
108f0 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
10900 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
10910 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
10920 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
10930 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
10940 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
10950 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
10960 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
10970 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
10980 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20   Select *pSub;  
10990 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65       /* The inne
109a0 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71  r query or "subq
109b0 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69  uery" */.  SrcLi
109c0 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  st *pSrc;      /
109d0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
109e0 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
109f0 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
10a00 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a  t *pSubSrc;   /*
10a10 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
10a20 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
10a30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
10a40 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65  pList;    /* The
10a50 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
10a60 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
10a70 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
10a80 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
10a90 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
10aa0 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
10ab0 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
10ac0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
10ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
10ae0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
10af0 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
10b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10b10 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
10b20 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
10b30 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75  rcList_item *pSu
10b40 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20  bitem;   /* The 
10b50 73 75 62 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f  subquery */..  /
10b60 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
10b70 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
10b80 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
10b90 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
10ba0 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  /.  if( p==0 ) r
10bb0 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
10bc0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
10bd0 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72  ert( pSrc && iFr
10be0 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70  om>=0 && iFrom<p
10bf0 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70  Src->nSrc );.  p
10c00 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d  Subitem = &pSrc-
10c10 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 70 53 75  >a[iFrom];.  pSu
10c20 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  b = pSubitem->pS
10c30 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
10c40 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
10c50 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75  ( isAgg && subqu
10c60 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72  eryIsAgg ) retur
10c70 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
10c80 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
10c90 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66  ion (1)  */.  if
10ca0 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
10cb0 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  && pSrc->nSrc>1 
10cc0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
10cd0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
10ce0 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53  ion (2)  */.  pS
10cf0 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
10d00 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
10d10 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72  ubSrc );.  /* Pr
10d20 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33  ior to version 3
10d30 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54  .1.2, when LIMIT
10d40 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20   and OFFSET had 
10d50 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e  to be simple con
10d60 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74  stants,.  ** not
10d70 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
10d80 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f  sssions, we allo
10d90 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69  wed some combini
10da0 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20  ng of LIMIT and 
10db0 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
10dc0 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62  use they could b
10dd0 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f  e computed at co
10de0 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74  mpile-time.  But
10df0 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
10e00 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
10e10 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70  me arbitrary exp
10e20 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72  ressions, we wer
10e30 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20  e forced to add 
10e40 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33  restrictions (13
10e50 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e  ).  ** and (14).
10e60 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
10e70 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69  pLimit && p->pLi
10e80 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10ea0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29  Restriction (13)
10eb0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
10ec0 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e  pOffset ) return
10ed0 20 30 3b 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 20 2f 2a 20               /* 
10ef0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29  Restriction (14)
10f00 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 53 72   */.  if( pSubSr
10f10 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74  c->nSrc==0 ) ret
10f20 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
10f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10f40 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20  Restriction (7) 
10f50 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 2d   */.  if( (pSub-
10f60 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70  >isDistinct || p
10f70 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20 0a 20 20  Sub->pLimit) .  
10f80 20 20 20 20 20 20 20 26 26 20 28 70 53 72 63 2d         && (pSrc-
10f90 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67  >nSrc>1 || isAgg
10fa0 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a  ) ){          /*
10fb0 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34   Restrictions (4
10fc0 29 28 35 29 28 38 29 28 39 29 20 2a 2f 0a 20 20  )(5)(8)(9) */.  
10fd0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
10fe0 20 20 20 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d     .  }.  if( p-
10ff0 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 73  >isDistinct && s
11000 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
11010 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
11020 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
11030 28 36 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  (6)  */.  if( (p
11040 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42  ->disallowOrderB
11050 79 20 7c 7c 20 70 2d 3e 70 4f 72 64 65 72 42 79  y || p->pOrderBy
11060 29 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  ) && pSub->pOrde
11070 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75  rBy ){.     retu
11080 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 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 20                  
110b0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
110c0 31 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  11) */.  }..  /*
110d0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20   Restriction 3: 
110e0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
110f0 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65   is a join, make
11100 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
11110 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20  ry is .  ** not 
11120 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68  used as the righ
11130 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20  t operand of an 
11140 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61  outer join.  Exa
11150 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
11160 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c  s.  ** is not al
11170 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
11180 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
11190 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20   OUTER JOIN (t2 
111a0 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20  JOIN t3).  **.  
111b0 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
111c0 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
111d0 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
111e0 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
111f0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
11200 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a  2) JOIN t3.  **.
11210 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f    ** which is no
11220 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d  t at all the sam
11230 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  e thing..  */.  
11240 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
11250 63 3e 31 20 26 26 20 69 46 72 6f 6d 3e 30 20 26  c>1 && iFrom>0 &
11260 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  & (pSrc->a[iFrom
11270 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  -1].jointype & J
11280 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20  T_OUTER)!=0 ){. 
11290 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
112a0 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
112b0 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73  on 12:  If the s
112c0 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
112d0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
112e0 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a  a left outer.  *
112f0 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72  * join, make sur
11300 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68  e the subquery h
11310 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
11320 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d  se..  ** An exam
11330 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
11340 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a   is not allowed:
11350 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
11360 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
11370 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20   JOIN (SELECT * 
11380 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32  FROM t2 WHERE t2
11390 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  .x>0).  **.  ** 
113a0 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
113b0 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
113c0 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
113d0 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
113e0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
113f0 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a  WHERE t2.x>0.  *
11400 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74  *.  ** But the t
11410 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20  2.x>0 test will 
11420 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61  always fail on a
11430 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c   NULL row of t2,
11440 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65   which.  ** effe
11450 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73  ctively converts
11460 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20   the OUTER JOIN 
11470 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f  into an INNER JO
11480 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  IN..  */.  if( i
11490 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d  From>0 && (pSrc-
114a0 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e  >a[iFrom-1].join
114b0 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
114c0 21 3d 30 20 0a 20 20 20 20 20 20 26 26 20 70 53  !=0 .      && pS
114d0 75 62 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b  ub->pWhere!=0 ){
114e0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
114f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
11500 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
11510 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65   it means flatte
11520 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
11530 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69  d for the.  ** i
11540 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66  From-th entry of
11550 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
11560 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
11570 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  ery..  */..  /* 
11580 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  Move all of the 
11590 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66  FROM elements of
115a0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
115b0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
115c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
115d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
115e0 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   Before doing th
115f0 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  is, remember.  *
11600 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * the cursor num
11610 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67  ber for the orig
11620 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79  inal outer query
11630 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e   FROM element in
11640 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20  .  ** iParent.  
11650 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73  The iParent curs
11660 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  or will never be
11670 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65   used.  Subseque
11680 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c  nt code.  ** wil
11690 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f  l scan expressio
116a0 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69  ns looking for i
116b0 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65  Parent reference
116c0 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20  s and replace.  
116d0 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e  ** those referen
116e0 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73  ces with express
116f0 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76  ions that resolv
11700 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  e to the subquer
11710 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d  y FROM.  ** elem
11720 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20  ents we are now 
11730 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f  copying in..  */
11740 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75  .  iParent = pSu
11750 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bitem->iCursor;.
11760 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62    {.    int nSub
11770 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e  Src = pSubSrc->n
11780 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69  Src;.    int joi
11790 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d  ntype = pSubitem
117a0 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20  ->jointype;..   
117b0 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
117c0 62 6c 65 28 30 2c 20 70 53 75 62 69 74 65 6d 2d  ble(0, pSubitem-
117d0 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69  >pTab);.    sqli
117e0 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d  teFree(pSubitem-
117f0 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
11800 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62   sqliteFree(pSub
11810 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  item->zName);.  
11820 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75    sqliteFree(pSu
11830 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  bitem->zAlias);.
11840 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
11850 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  1 ){.      int e
11860 78 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d  xtra = nSubSrc -
11870 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   1;.      for(i=
11880 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b  1; i<nSubSrc; i+
11890 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63  +){.        pSrc
118a0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
118b0 74 41 70 70 65 6e 64 28 70 53 72 63 2c 20 30 2c  tAppend(pSrc, 0,
118c0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
118d0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
118e0 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  c;.      for(i=p
118f0 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65  Src->nSrc-1; i-e
11900 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d  xtra>=iFrom; i--
11910 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d  ){.        pSrc-
11920 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b  >a[i] = pSrc->a[
11930 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20  i-extra];.      
11940 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
11950 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
11960 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63  i++){.      pSrc
11970 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
11980 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
11990 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
119a0 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
119b0 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
119c0 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
119d0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e 53  pSrc->a[iFrom+nS
119e0 75 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70  ubSrc-1].jointyp
119f0 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  e = jointype;.  
11a00 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69  }..  /* Now begi
11a10 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73  n substituting s
11a20 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73  ubquery result s
11a30 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66  et expressions f
11a40 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e  or .  ** referen
11a50 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65  ces to the iPare
11a60 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  nt in the outer 
11a70 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a  query..  ** .  *
11a80 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  * Example:.  **.
11a90 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
11aa0 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
11ab0 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
11ac0 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
11ad0 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a  ) WHERE a>b;.  *
11ae0 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
11af0 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
11b00 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
11b10 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
11b20 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20         /.  **   
11b30 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
11b40 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
11b50 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
11b60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
11b70 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  __/.  **.  ** We
11b80 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65   look at every e
11b90 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
11ba0 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
11bb0 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
11bc0 73 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65 20  see.  ** "a" we 
11bd0 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22  substitute "x*3"
11be0 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
11bf0 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73   we see "b" we s
11c00 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22  ubstitute "y+10"
11c10 2e 0a 20 20 2a 2f 0a 20 20 73 75 62 73 74 45 78  ..  */.  substEx
11c20 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
11c30 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
11c40 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4c 69 73  >pEList);.  pLis
11c50 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
11c60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
11c70 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
11c80 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
11c90 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
11ca0 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26  a[i].zName==0 &&
11cb0 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d   (pExpr = pList-
11cc0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70  >a[i].pExpr)->sp
11cd0 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20  an.z!=0 ){.     
11ce0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
11cf0 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  me = sqliteStrND
11d00 75 70 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d  up((char*)pExpr-
11d10 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  >span.z, pExpr->
11d20 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20  span.n);.    }. 
11d30 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 29   }.  if( isAgg )
11d40 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  {.    substExprL
11d50 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  ist(p->pGroupBy,
11d60 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
11d70 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
11d80 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  stExpr(p->pHavin
11d90 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
11da0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  ->pEList);.  }. 
11db0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
11dc0 72 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  rBy ){.    asser
11dd0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
11de0 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  0 );.    p->pOrd
11df0 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
11e00 64 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d  derBy;.    pSub-
11e10 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
11e20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f   }else if( p->pO
11e30 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 75  rderBy ){.    su
11e40 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
11e50 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74  OrderBy, iParent
11e60 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
11e70 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
11e80 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70  >pWhere ){.    p
11e90 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
11ea0 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70 57 68  xprDup(pSub->pWh
11eb0 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ere);.  }else{. 
11ec0 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
11ed0 20 7d 0a 20 20 69 66 28 20 73 75 62 71 75 65 72   }.  if( subquer
11ee0 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73  yIsAgg ){.    as
11ef0 73 65 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67  sert( p->pHaving
11f00 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48  ==0 );.    p->pH
11f10 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72  aving = p->pWher
11f20 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  e;.    p->pWhere
11f30 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73   = pWhere;.    s
11f40 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76  ubstExpr(p->pHav
11f50 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ing, iParent, pS
11f60 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
11f70 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71   p->pHaving = sq
11f80 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e  lite3ExprAnd(p->
11f90 70 48 61 76 69 6e 67 2c 20 73 71 6c 69 74 65 33  pHaving, sqlite3
11fa0 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70 48  ExprDup(pSub->pH
11fb0 61 76 69 6e 67 29 29 3b 0a 20 20 20 20 61 73 73  aving));.    ass
11fc0 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
11fd0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47  ==0 );.    p->pG
11fe0 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
11ff0 45 78 70 72 4c 69 73 74 44 75 70 28 70 53 75 62  ExprListDup(pSub
12000 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d  ->pGroupBy);.  }
12010 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45  else{.    substE
12020 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69  xpr(p->pWhere, i
12030 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
12040 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 57  List);.    p->pW
12050 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
12060 70 72 41 6e 64 28 70 2d 3e 70 57 68 65 72 65 2c  prAnd(p->pWhere,
12070 20 70 57 68 65 72 65 29 3b 0a 20 20 7d 0a 0a 20   pWhere);.  }.. 
12080 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65   /* The flattene
12090 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  d query is disti
120a0 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68  nct if either th
120b0 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20  e inner or the. 
120c0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
120d0 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20  is distinct. .  
120e0 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74 69 6e  */.  p->isDistin
120f0 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e  ct = p->isDistin
12100 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69  ct || pSub->isDi
12110 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 0a 20 20  stinct;..  /*.  
12120 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  ** SELECT ... FR
12130 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c  OM (SELECT ... L
12140 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29  IMIT a OFFSET b)
12150 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20   LIMIT x OFFSET 
12160 79 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 65  y;.  **.  ** One
12170 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74   is tempted to t
12180 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20  ry to add a and 
12190 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65  b to combine the
121a0 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68   limits.  But th
121b0 69 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  is.  ** does not
121c0 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20   work if either 
121d0 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
121e0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  e..  */.  if( pS
121f0 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ub->pLimit ){.  
12200 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53    p->pLimit = pS
12210 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20  ub->pLimit;.    
12220 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pSub->pLimit = 0
12230 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69  ;.  }..  /* Fini
12240 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61  ally, delete wha
12250 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65  t is left of the
12260 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65   subquery and re
12270 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  turn.  ** succes
12280 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
12290 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
122a0 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  ub);.  return 1;
122b0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
122c0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
122d0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
122e0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
122f0 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e 20 61  ment passed in a
12300 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
12310 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73   see if it.** is
12320 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20   a simple min() 
12330 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20  or max() query. 
12340 20 49 66 20 69 74 20 69 73 20 61 6e 64 20 74 68   If it is and th
12350 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 0a  is query can be.
12360 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75 73 69  ** satisfied usi
12370 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65 65 6b  ng a single seek
12380 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
12390 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20 69  g or end of an i
123a0 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65  ndex,.** then ge
123b0 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20  nerate the code 
123c0 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20  for this SELECT 
123d0 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20 49  and return 1.  I
123e0 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
123f0 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29  .** simple min()
12400 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2c   or max() query,
12410 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a   then return 0;.
12420 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d  **.** A simply m
12430 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
12440 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74  ery looks like t
12450 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  his:.**.**    SE
12460 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d  LECT min(a) FROM
12470 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45   table;.**    SE
12480 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f 4d  LECT max(a) FROM
12490 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68   table;.**.** Th
124a0 65 20 71 75 65 72 79 20 6d 61 79 20 68 61 76 65  e query may have
124b0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
124c0 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52 4f 4d  able in its FROM
124d0 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 72   argument.  Ther
124e0 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47  e.** can be no G
124f0 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e  ROUP BY or HAVIN
12500 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73  G or WHERE claus
12510 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  es.  The result 
12520 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74  set must.** be t
12530 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
12540 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f  ) of a single co
12550 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
12560 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a  e.  The column.*
12570 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f  * in the min() o
12580 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e  r max() function
12590 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78 65 64   must be indexed
125a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61  ..**.** The para
125b0 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73 20 72  meters to this r
125c0 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65 20 73  outine are the s
125d0 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c 69 74  ame as for sqlit
125e0 65 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53  e3Select()..** S
125f0 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  ee the header co
12600 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f  mment on that ro
12610 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
12620 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
12630 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12640 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72  simpleMinMaxQuer
12650 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
12660 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
12670 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d  eDest, int iParm
12680 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  ){.  Expr *pExpr
12690 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20  ;.  int iCol;.  
126a0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
126b0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
126c0 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20 2a  t base;.  Vdbe *
126d0 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b  v;.  int seekOp;
126e0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
126f0 69 73 74 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69  ist, *pList, eLi
12700 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  st;.  struct Exp
12710 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74  rList_item eList
12720 49 74 65 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20  Item;.  SrcList 
12730 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 62 72 6b  *pSrc;.  int brk
12740 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
12750 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
12760 69 66 20 74 68 69 73 20 71 75 65 72 79 20 69 73  if this query is
12770 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20   a simple min() 
12780 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20  or max() query. 
12790 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72   Return.  ** zer
127a0 6f 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e  o if it is  not.
127b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
127c0 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48  GroupBy || p->pH
127d0 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65  aving || p->pWhe
127e0 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  re ) return 0;. 
127f0 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
12800 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72  .  if( pSrc->nSr
12810 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
12820 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
12830 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c  EList;.  if( pEL
12840 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
12850 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70  return 0;.  pExp
12860 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  r = pEList->a[0]
12870 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45  .pExpr;.  if( pE
12880 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
12890 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
128a0 6e 20 30 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70  n 0;.  pList = p
128b0 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69  Expr->pList;.  i
128c0 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  f( pList==0 || p
128d0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
128e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
128f0 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21   pExpr->token.n!
12900 3d 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =3 ) return 0;. 
12910 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
12920 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78 70  ICmp((char*)pExp
12930 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22  r->token.z,"min"
12940 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65  ,3)==0 ){.    se
12950 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64  ekOp = OP_Rewind
12960 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
12970 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63  lite3StrNICmp((c
12980 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
12990 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20  n.z,"max",3)==0 
129a0 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  ){.    seekOp = 
129b0 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65  OP_Last;.  }else
129c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
129d0 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 70 4c    }.  pExpr = pL
129e0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
129f0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
12a00 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
12a10 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d  turn 0;.  iCol =
12a20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
12a30 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
12a40 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 0a 20 20 2f  a[0].pTab;...  /
12a50 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 68  * If we get to h
12a60 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ere, it means th
12a70 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 74 68  e query is of th
12a80 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a  e correct form..
12a90 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61    ** Check to ma
12aa0 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
12ab0 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b  an index and mak
12ac0 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20  e pIdx point to 
12ad0 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72  the.  ** appropr
12ae0 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20  iate index.  If 
12af0 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
12b00 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45  () is on an INTE
12b10 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a  GER PRIMARY.  **
12b20 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20   key column, no 
12b30 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73 61  index is necessa
12b40 72 79 20 73 6f 20 73 65 74 20 70 49 64 78 20 74  ry so set pIdx t
12b50 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20  o NULL.  If no. 
12b60 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78   ** usable index
12b70 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   is found, retur
12b80 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n 0..  */.  if( 
12b90 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49  iCol<0 ){.    pI
12ba0 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  dx = 0;.  }else{
12bb0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
12bc0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
12bd0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
12be0 20 70 45 78 70 72 29 3b 0a 20 20 20 20 66 6f 72   pExpr);.    for
12bf0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
12c00 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
12c10 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
12c20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
12c30 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20  >nColumn>=1 );. 
12c40 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
12c50 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c  iColumn[0]==iCol
12c60 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 30   && .          0
12c70 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
12c80 28 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d  (pIdx->azColl[0]
12c90 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 20  , pColl->zName) 
12ca0 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
12cb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12cc0 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20      if( pIdx==0 
12cd0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
12ce0 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
12cf0 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20 77  olumn types if w
12d00 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
12d10 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54  the callback.  T
12d20 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73  his.  ** step is
12d30 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
12d40 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20  output is going 
12d50 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61 20  to a table or a 
12d60 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a  memory cell..  *
12d70 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * The column nam
12d80 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
12d90 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20 69  been generated i
12da0 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  n the calling fu
12db0 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76  nction..  */.  v
12dc0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
12dd0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
12de0 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   v==0 ) return 0
12df0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  ;..  /* If the o
12e00 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
12e10 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
12e20 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
12e30 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
12e40 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
12e50 56 69 72 74 75 61 6c 54 61 62 20 29 7b 0a 20 20  VirtualTab ){.  
12e60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12e70 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72  Op(v, OP_OpenVir
12e80 74 75 61 6c 2c 20 69 50 61 72 6d 2c 20 31 29 3b  tual, iParm, 1);
12e90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
12ea0 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69  ating code to fi
12eb0 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68  nd the min or th
12ec0 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c  e max.  Basicall
12ed0 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20  y all we have.  
12ee0 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64  ** to do is find
12ef0 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 74 68   the first or th
12f00 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
12f10 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78  the chosen index
12f20 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d  .  If.  ** the m
12f30 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73  in() or max() is
12f40 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20   on the INTEGER 
12f50 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
12f60 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  n find the first
12f70 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e  .  ** or last en
12f80 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  try in the main 
12f90 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 44  table..  */.  iD
12fa0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
12fb0 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
12fc0 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
12fd0 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ma);.  assert( i
12fe0 44 62 3e 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 69  Db>=0 || pTab->i
12ff0 73 54 72 61 6e 73 69 65 6e 74 20 29 3b 0a 20 20  sTransient );.  
13000 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
13010 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
13020 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 54  iDb);.  sqlite3T
13030 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
13040 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
13050 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
13060 29 3b 0a 20 20 62 61 73 65 20 3d 20 70 53 72 63  );.  base = pSrc
13070 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a  ->a[0].iCursor;.
13080 20 20 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56    brk = sqlite3V
13090 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
130a0 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
130b0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
130c0 20 70 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28 20   p, brk);.  if( 
130d0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
130e0 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
130f0 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
13100 61 72 73 65 2c 20 62 61 73 65 2c 20 69 44 62 2c  arse, base, iDb,
13110 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
13120 61 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ad);.  }.  if( p
13130 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Idx==0 ){.    sq
13140 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13150 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20  , seekOp, base, 
13160 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
13170 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
13180 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  the cursor used 
13190 74 6f 20 6f 70 65 6e 20 74 68 65 20 69 6e 64 65  to open the inde
131a0 78 20 68 65 72 65 20 69 73 20 63 6c 6f 73 65 64  x here is closed
131b0 0a 20 20 20 20 2a 2a 20 61 73 20 73 6f 6f 6e 20  .    ** as soon 
131c0 61 73 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75  as a single valu
131d0 65 20 68 61 73 20 62 65 65 6e 20 72 65 61 64 20  e has been read 
131e0 66 72 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63 61 74  from it, allocat
131f0 65 20 69 74 0a 20 20 20 20 2a 2a 20 75 73 69 6e  e it.    ** usin
13200 67 20 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b  g (pParse->nTab+
13210 2b 29 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  +) to prevent th
13220 65 20 63 75 72 73 6f 72 20 69 64 20 66 72 6f 6d  e cursor id from
13230 20 62 65 69 6e 67 20 0a 20 20 20 20 2a 2a 20 72   being .    ** r
13240 65 75 73 65 64 2e 20 54 68 69 73 20 69 73 20 69  eused. This is i
13250 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20 73 74 61  mportant for sta
13260 74 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 66  tements of the f
13270 6f 72 6d 20 0a 20 20 20 20 2a 2a 20 22 49 4e 53  orm .    ** "INS
13280 45 52 54 20 49 4e 54 4f 20 78 20 53 45 4c 45 43  ERT INTO x SELEC
13290 54 20 6d 61 78 28 29 20 46 52 4f 4d 20 78 22 2e  T max() FROM x".
132a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
132b0 69 49 64 78 3b 0a 20 20 20 20 4b 65 79 49 6e 66  iIdx;.    KeyInf
132c0 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  o *pKey = sqlite
132d0 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
132e0 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20  arse, pIdx);.   
132f0 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
13300 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 61 73 73 65  nTab++;.    asse
13310 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d  rt( pIdx->pSchem
13320 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
13330 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
13340 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
13350 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b  nteger, iDb, 0);
13360 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13370 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op3(v, OP_OpenRe
13380 61 64 2c 20 69 49 64 78 2c 20 70 49 64 78 2d 3e  ad, iIdx, pIdx->
13390 74 6e 75 6d 2c 20 0a 20 20 20 20 20 20 20 20 28  tnum, .        (
133a0 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 33 5f 4b  char*)pKey, P3_K
133b0 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
133c0 0a 20 20 20 20 69 66 28 20 73 65 65 6b 4f 70 3d  .    if( seekOp=
133d0 3d 4f 50 5f 52 65 77 69 6e 64 20 29 7b 0a 20 20  =OP_Rewind ){.  
133e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
133f0 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  ddOp(v, OP_Null,
13400 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
13410 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13420 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
13430 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 65   1, 0);.      se
13440 65 6b 4f 70 20 3d 20 4f 50 5f 4d 6f 76 65 47 74  ekOp = OP_MoveGt
13450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
13460 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13470 73 65 65 6b 4f 70 2c 20 69 49 64 78 2c 20 30 29  seekOp, iIdx, 0)
13480 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13490 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
134a0 52 6f 77 69 64 2c 20 69 49 64 78 2c 20 30 29 3b  Rowid, iIdx, 0);
134b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
134c0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
134d0 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20  e, iIdx, 0);.   
134e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
134f0 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20  p(v, OP_MoveGe, 
13500 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  base, 0);.  }.  
13510 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b  eList.nExpr = 1;
13520 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74  .  memset(&eList
13530 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
13540 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65  eListItem));.  e
13550 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49  List.a = &eListI
13560 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30  tem;.  eList.a[0
13570 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
13580 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  .  selectInnerLo
13590 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26 65  op(pParse, p, &e
135a0 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d  List, 0, 0, 0, -
135b0 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  1, eDest, iParm,
135c0 20 62 72 6b 2c 20 62 72 6b 2c 20 30 29 3b 0a 20   brk, brk, 0);. 
135d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
135e0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29  lveLabel(v, brk)
135f0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13600 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
13610 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 0a 20  , base, 0);.  . 
13620 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
13630 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20  .** Analyze and 
13640 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
13650 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61  P BY clause in a
13660 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
13670 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  t.  Return.** th
13680 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
13690 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 41  rs seen..**.** A
136a0 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
136b0 4f 55 50 20 42 59 20 69 73 20 61 20 6c 69 73 74  OUP BY is a list
136c0 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2e   of expressions.
136d0 20 20 49 66 20 61 6e 79 20 65 78 70 72 65 73 73    If any express
136e0 69 6f 6e 0a 2a 2a 20 69 73 20 61 6e 20 69 6e 74  ion.** is an int
136f0 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2c 20 74  eger constant, t
13700 68 65 6e 20 74 68 61 74 20 65 78 70 72 65 73 73  hen that express
13710 69 6f 6e 20 69 73 20 72 65 70 6c 61 63 65 64 20  ion is replaced 
13720 62 79 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  by the.** corres
13730 70 6f 6e 64 69 6e 67 20 65 6e 74 72 79 20 69 6e  ponding entry in
13740 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
13750 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
13760 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70  rocessOrderGroup
13770 42 79 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  By(.  NameContex
13780 74 20 2a 70 4e 43 2c 20 20 20 20 20 2f 2a 20 4e  t *pNC,     /* N
13790 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  ame context of t
137a0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
137b0 65 6e 74 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ent. */.  ExprLi
137c0 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
137d0 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
137e0 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
137f0 73 65 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73  se to be process
13800 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
13810 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a  ar *zType     /*
13820 20 45 69 74 68 65 72 20 22 4f 52 44 45 52 22 20   Either "ORDER" 
13830 6f 72 20 22 47 52 4f 55 50 22 2c 20 61 73 20 61  or "GROUP", as a
13840 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b  ppropriate */.){
13850 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
13860 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
13870 4e 43 2d 3e 70 45 4c 69 73 74 3b 20 20 20 20 20  NC->pEList;     
13880 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
13890 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
138a0 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
138b0 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
138c0 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ;     /* The res
138d0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
138e0 45 4c 45 43 54 20 2a 2f 0a 20 20 61 73 73 65 72  ELECT */.  asser
138f0 74 28 20 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20  t( pEList );..  
13900 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
13910 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
13920 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
13930 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
13940 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
13950 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72    Expr *pE = pOr
13960 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
13970 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  r;.    if( sqlit
13980 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
13990 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20  pE, &iCol) ){.  
139a0 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 26      if( iCol>0 &
139b0 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e  & iCol<=pEList->
139c0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
139d0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
139e0 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20  te(pE);.        
139f0 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
13a00 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69  [i].pExpr = sqli
13a10 74 65 33 45 78 70 72 44 75 70 28 70 45 4c 69 73  te3ExprDup(pELis
13a20 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78  t->a[iCol-1].pEx
13a30 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
13a40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13a50 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13a60 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 25  , .           "%
13a70 73 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  s BY column numb
13a80 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e  er %d out of ran
13a90 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22  ge - should be "
13aa0 0a 20 20 20 20 20 20 20 20 20 20 20 22 62 65 74  .           "bet
13ab0 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20  ween 1 and %d", 
13ac0 7a 54 79 70 65 2c 20 69 43 6f 6c 2c 20 70 45 4c  zType, iCol, pEL
13ad0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
13ae0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
13af0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13b00 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
13b10 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 70 4e 43  ResolveNames(pNC
13b20 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 72  , pE) ){.      r
13b30 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
13b40 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
13b50 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29  prIsConstant(pE)
13b60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13b70 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13b80 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 73 20  ,.          "%s 
13b90 42 59 20 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f  BY terms must no
13ba0 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72  t be non-integer
13bb0 20 63 6f 6e 73 74 61 6e 74 73 22 2c 20 7a 54 79   constants", zTy
13bc0 70 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  pe);.      retur
13bd0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
13be0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
13bf0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13c00 20 72 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e 61   resolves any na
13c10 6d 65 73 20 75 73 65 64 20 69 6e 20 74 68 65 20  mes used in the 
13c20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
13c30 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 53 45  e.** supplied SE
13c40 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
13c50 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  If the SELECT st
13c60 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72 65  atement being re
13c70 73 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20 73  solved.** is a s
13c80 75 62 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  ub-select, then 
13c90 70 4f 75 74 65 72 4e 43 20 69 73 20 61 20 70 6f  pOuterNC is a po
13ca0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4e 61 6d  inter to the Nam
13cb0 65 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66 20  eContext .** of 
13cc0 74 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43  the parent SELEC
13cd0 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
13ce0 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 0a  3SelectResolve(.
13cf0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
13d00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13d10 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
13d20 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
13d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13d40 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
13d50 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
13d60 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
13d70 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 54   *pOuterNC  /* T
13d80 68 65 20 6f 75 74 65 72 20 6e 61 6d 65 20 63 6f  he outer name co
13d90 6e 74 65 78 74 2e 20 4d 61 79 20 62 65 20 4e 55  ntext. May be NU
13da0 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  LL. */.){.  Expr
13db0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
13dc0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
13dd0 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   set. */.  int i
13de0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13df0 20 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f        /* For-loo
13e00 70 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20  p variable used 
13e10 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63  in multiple plac
13e20 65 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  es */.  NameCont
13e30 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20  ext sNC;        
13e40 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65     /* Local name
13e50 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78  -context */.  Ex
13e60 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
13e70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
13e80 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20  group by clause 
13e90 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  */..  /* If this
13ea0 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e   routine has run
13eb0 20 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 20   before, return 
13ec0 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a  immediately. */.
13ed0 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c    if( p->isResol
13ee0 76 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ved ){.    asser
13ef0 74 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a  t( !pOuterNC );.
13f00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13f10 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  E_OK;.  }.  p->i
13f20 73 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a  sResolved = 1;..
13f30 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61    /* If there ha
13f40 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
13f50 65 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69  errors, do nothi
13f60 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ng. */.  if( pPa
13f70 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20  rse->nErr>0 ){. 
13f80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13f90 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
13fa0 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 73 65  * Prepare the se
13fb0 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e 20  lect statement. 
13fc0 54 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61  This call will a
13fd0 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72 73  llocate all curs
13fe0 6f 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  ors.  ** require
13ff0 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  d to handle the 
14000 74 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71 75  tables and subqu
14010 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
14020 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  M clause..  */. 
14030 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53   if( prepSelectS
14040 74 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20 29  tmt(pParse, p) )
14050 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
14060 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
14070 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65    /* Resolve the
14080 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
14090 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
140a0 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68  FSET clauses. Th
140b0 65 73 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74  ese.  ** are not
140c0 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65   allowed to refe
140d0 72 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20  r to any names, 
140e0 73 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79  so pass an empty
140f0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20   NameContext..  
14100 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  */.  memset(&sNC
14110 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
14120 29 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20  );.  sNC.pParse 
14130 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20  = pParse;.  if( 
14140 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
14150 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d  veNames(&sNC, p-
14160 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20  >pLimit) ||.    
14170 20 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73    sqlite3ExprRes
14180 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20  olveNames(&sNC, 
14190 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20  p->pOffset) ){. 
141a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
141b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
141c0 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 63  * Set up the loc
141d0 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20  al name-context 
141e0 74 6f 20 70 61 73 73 20 74 6f 20 45 78 70 72 52  to pass to ExprR
141f0 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 74 6f  esolveNames() to
14200 0a 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68  .  ** resolve th
14210 65 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73  e expression-lis
14220 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c  t..  */.  sNC.al
14230 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 73 4e  lowAgg = 1;.  sN
14240 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e  C.pSrcList = p->
14250 70 53 72 63 3b 0a 20 20 73 4e 43 2e 70 4e 65 78  pSrc;.  sNC.pNex
14260 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 0a 20  t = pOuterNC;.. 
14270 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65   /* Resolve name
14280 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
14290 73 65 74 2e 20 2a 2f 0a 20 20 70 45 4c 69 73 74  set. */.  pEList
142a0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
142b0 69 66 28 20 21 70 45 4c 69 73 74 20 29 20 72 65  if( !pEList ) re
142c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
142d0 52 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  R;.  for(i=0; i<
142e0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
142f0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
14300 58 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  X = pEList->a[i]
14310 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
14320 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
14330 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 58  veNames(&sNC, pX
14340 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
14350 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
14360 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14370 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
14380 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
14390 6f 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ons in the resul
143a0 74 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52  t-set, and no GR
143b0 4f 55 50 20 42 59 20 0a 20 20 2a 2a 20 65 78 70  OUP BY .  ** exp
143c0 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20  ression, do not 
143d0 61 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65 73  allow aggregates
143e0 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6f   in any of the o
143f0 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73  ther expressions
14400 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
14410 20 21 70 2d 3e 69 73 41 67 67 20 29 3b 0a 20 20   !p->isAgg );.  
14420 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
14430 72 6f 75 70 42 79 3b 0a 20 20 69 66 28 20 70 47  roupBy;.  if( pG
14440 72 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61  roupBy || sNC.ha
14450 73 41 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69  sAgg ){.    p->i
14460 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  sAgg = 1;.  }els
14470 65 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77  e{.    sNC.allow
14480 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Agg = 0;.  }..  
14490 2f 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20 63  /* If a HAVING c
144a0 6c 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74  lause is present
144b0 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
144c0 74 20 62 65 20 61 20 47 52 4f 55 50 20 42 59 20  t be a GROUP BY 
144d0 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  clause..  */.  i
144e0 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26 26  f( p->pHaving &&
144f0 20 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20   !pGroupBy ){.  
14500 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14510 67 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f  g(pParse, "a GRO
14520 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  UP BY clause is 
14530 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
14540 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 72 65  HAVING");.    re
14550 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
14560 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  R;.  }..  /* Add
14570 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
14580 6c 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65  list to the name
14590 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20  -context before 
145a0 70 61 72 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  parsing the.  **
145b0 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
145c0 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ns in the SELECT
145d0 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
145e0 20 69 73 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a   is so that.  **
145f0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
14600 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
14610 20 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66 65   (etc.) can refe
14620 72 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73  r to expressions
14630 20 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65 73   by.  ** aliases
14640 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
14650 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69  et..  **.  ** Mi
14660 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74 68  nor point: If th
14670 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
14680 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
14690 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  ion will be.  **
146a0 20 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66 6f   re-evaluated fo
146b0 72 20 65 61 63 68 20 72 65 66 65 72 65 6e 63 65  r each reference
146c0 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73   to it..  */.  s
146d0 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  NC.pEList = p->p
146e0 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71 6c  EList;.  if( sql
146f0 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
14700 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57  ames(&sNC, p->pW
14710 68 65 72 65 29 20 7c 7c 0a 20 20 20 20 20 20 73  here) ||.      s
14720 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
14730 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
14740 70 48 61 76 69 6e 67 29 20 7c 7c 0a 20 20 20 20  pHaving) ||.    
14750 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72    processOrderGr
14760 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 2d 3e 70  oupBy(&sNC, p->p
14770 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
14780 29 20 7c 7c 0a 20 20 20 20 20 20 70 72 6f 63 65  ) ||.      proce
14790 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26  ssOrderGroupBy(&
147a0 73 4e 43 2c 20 70 47 72 6f 75 70 42 79 2c 20 22  sNC, pGroupBy, "
147b0 47 52 4f 55 50 22 29 0a 20 20 29 7b 0a 20 20 20  GROUP").  ){.   
147c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
147d0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
147e0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 47 52  Make sure the GR
147f0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f  OUP BY clause do
14800 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
14810 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
14820 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ns..  */.  if( p
14830 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
14840 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
14850 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20  tem *pItem;.  . 
14860 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
14870 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69  m=pGroupBy->a; i
14880 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
14890 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
148a0 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
148b0 61 73 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d  asProperty(pItem
148c0 2d 3e 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29  ->pExpr, EP_Agg)
148d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
148e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
148f0 73 65 2c 20 22 61 67 67 72 65 67 61 74 65 20 66  se, "aggregate f
14900 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  unctions are not
14910 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20   allowed in ".  
14920 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20 47            "the G
14930 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 22 29  ROUP BY clause")
14940 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
14950 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
14960 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14970 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
14980 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
14990 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
149a0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
149b0 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
149c0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
149d0 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
149e0 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
149f0 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
14a00 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
14a10 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
14a20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
14a30 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d 70  .** routine simp
14a40 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20  ly stores NULLs 
14a50 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20  in all of those 
14a60 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f  memory cells..*/
14a70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
14a80 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
14a90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
14aa0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
14ab0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
14ac0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
14ad0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
14ae0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
14af0 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66  c;.  if( pAggInf
14b00 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66  o->nFunc+pAggInf
14b10 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  o->nColumn==0 ){
14b20 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
14b30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
14b40 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
14b50 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
14b60 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
14b70 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 41 67 67 49  P_MemNull, pAggI
14b80 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
14b90 6d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  m, 0);.  }.  for
14ba0 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
14bb0 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
14bc0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
14bd0 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
14be0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14bf0 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c  dOp(v, OP_MemNul
14c00 6c 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 2c 20  l, pFunc->iMem, 
14c10 30 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  0);.    if( pFun
14c20 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  c->iDistinct>=0 
14c30 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
14c40 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72  E = pFunc->pExpr
14c50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
14c60 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  pList==0 || pE->
14c70 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
14c80 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
14c90 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
14ca0 65 2c 20 22 44 49 53 54 49 4e 43 54 20 69 6e 20  e, "DISTINCT in 
14cb0 61 67 67 72 65 67 61 74 65 20 6d 75 73 74 20 62  aggregate must b
14cc0 65 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20 20 20  e followed ".   
14cd0 20 20 20 20 20 20 20 20 22 62 79 20 61 6e 20 65          "by an e
14ce0 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20  xpression");.   
14cf0 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
14d00 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
14d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14d20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
14d30 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
14d40 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
14d50 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20   pE->pList);.   
14d60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14d70 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69  Op3(v, OP_OpenVi
14d80 72 74 75 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44  rtual, pFunc->iD
14d90 69 73 74 69 6e 63 74 2c 20 30 2c 20 0a 20 20 20  istinct, 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 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
14dc0 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
14dd0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
14de0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
14df0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
14e00 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a  he OP_AggFinaliz
14e10 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65  e opcode for eve
14e20 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ry aggregate fun
14e30 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ction.** in the 
14e40 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
14e50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
14e60 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e  d finalizeAggFun
14e70 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50  ctions(Parse *pP
14e80 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
14e90 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
14ea0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
14eb0 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
14ec0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
14ed0 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69  unc *pF;.  for(i
14ee0 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
14ef0 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
14f00 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
14f10 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c  pF++){.    ExprL
14f20 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
14f30 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20  >pExpr->pList;. 
14f40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
14f50 33 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c  3(v, OP_AggFinal
14f60 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73  , pF->iMem, pLis
14f70 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
14f80 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20   : 0,.          
14f90 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
14fa0 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 33  d*)pF->pFunc, P3
14fb0 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d  _FUNCDEF);.  }.}
14fc0 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
14fd0 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d  he accumulator m
14fe0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
14ff0 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73  an aggregate bas
15000 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72  ed on.** the cur
15010 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
15020 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
15030 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d  void updateAccum
15040 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
15050 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
15060 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
15070 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
15080 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
15090 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
150a0 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63  unc *pF;.  struc
150b0 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
150c0 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e  C;..  pAggInfo->
150d0 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
150e0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
150f0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
15100 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
15110 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
15120 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
15130 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30  int addrNext = 0
15140 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
15150 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
15160 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 66  r->pList;.    if
15170 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
15180 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e   nArg = pList->n
15190 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
151a0 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
151b0 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
151c0 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
151d0 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20       nArg = 0;. 
151e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
151f0 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
15200 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20  .      addrNext 
15210 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
15220 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
15230 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
15240 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69   );.      codeDi
15250 73 74 69 6e 63 74 28 76 2c 20 70 46 2d 3e 69 44  stinct(v, pF->iD
15260 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78  istinct, addrNex
15270 74 2c 20 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a  t, 1, 2);.    }.
15280 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
15290 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  c->needCollSeq )
152a0 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
152b0 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
152c0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
152d0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
152e0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
152f0 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
15300 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c  =pList->a; !pCol
15310 6c 20 26 26 20 6a 3c 70 4c 69 73 74 2d 3e 6e 45  l && j<pList->nE
15320 78 70 72 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; j++, pItem+
15330 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
15340 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
15350 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
15360 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
15370 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
15380 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
15390 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
153a0 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
153b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
153c0 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
153d0 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
153e0 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
153f0 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P3_COLLSEQ);. 
15400 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
15410 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67  VdbeOp3(v, OP_Ag
15420 67 53 74 65 70 2c 20 70 46 2d 3e 69 4d 65 6d 2c  gStep, pF->iMem,
15430 20 6e 41 72 67 2c 20 28 76 6f 69 64 2a 29 70 46   nArg, (void*)pF
15440 2d 3e 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43  ->pFunc, P3_FUNC
15450 44 45 46 29 3b 0a 20 20 20 20 69 66 28 20 61 64  DEF);.    if( ad
15460 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  drNext ){.      
15470 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15480 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e  veLabel(v, addrN
15490 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ext);.    }.  }.
154a0 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41    for(i=0, pC=pA
154b0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c  ggInfo->aCol; i<
154c0 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
154d0 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b  ulator; i++, pC+
154e0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
154f0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
15500 70 43 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  pC->pExpr);.    
15510 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15520 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
15530 20 70 43 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20   pC->iMem, 1);. 
15540 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64   }.  pAggInfo->d
15550 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d  irectMode = 0;.}
15560 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
15570 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 67  e code for the g
15580 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74  iven SELECT stat
15590 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
155a0 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
155b0 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69  tributed in vari
155c0 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69  ous ways dependi
155d0 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c  ng on the.** val
155e0 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20  ue of eDest and 
155f0 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
15600 20 65 44 65 73 74 20 56 61 6c 75 65 20 20 20 20   eDest Value    
15610 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20     Result.**    
15620 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20   ------------   
15630 20 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 2d 0a 2a 2a 20  ------------.** 
15660 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b      SRT_Callback
15670 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63      Invoke the c
15680 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68  allback for each
15690 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
156a0 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  lt..**.**     SR
156b0 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74  T_Mem         St
156c0 6f 72 65 20 66 69 72 73 74 20 72 65 73 75 6c 74  ore first result
156d0 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
156e0 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iParm.**.**     
156f0 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20 20  SRT_Set         
15700 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73  Store results as
15710 20 6b 65 79 73 20 6f 66 20 74 61 62 6c 65 20 69   keys of table i
15720 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
15730 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20  SRT_Union       
15740 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73  Store results as
15750 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70   a key in a temp
15760 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
15770 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
15780 45 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f  Except      Remo
15790 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ve results from 
157a0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
157b0 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ble iParm..**.**
157c0 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20       SRT_Table  
157d0 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
157e0 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  ts in temporary 
157f0 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a  table iParm.**.*
15800 2a 20 54 68 65 20 74 61 62 6c 65 20 61 62 6f 76  * The table abov
15810 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65 74 65 2e  e is incomplete.
15820 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 44 69    Additional eDi
15830 73 74 20 76 61 6c 75 65 20 68 61 76 65 20 62 65  st value have be
15840 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e 63 65 20   added.** since 
15850 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 77 61 73  this comment was
15860 20 77 72 69 74 74 65 6e 2e 20 20 53 65 65 20 74   written.  See t
15870 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
15880 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  op() function fo
15890 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65 74 65 20  r.** a complete 
158a0 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 61  listing of the a
158b0 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
158c0 20 65 44 65 73 74 20 61 6e 64 20 74 68 65 69 72   eDest and their
158d0 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a   meanings..**.**
158e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
158f0 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
15900 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
15910 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
15920 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
15930 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
15940 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
15950 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
15960 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
15970 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
15980 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
15990 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
159a0 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
159b0 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
159c0 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
159d0 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a  to do that..**.*
159e0 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20 70  * The pParent, p
159f0 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70  arentTab, and *p
15a00 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64 73  ParentAgg fields
15a10 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 69   are filled in i
15a20 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54  f this.** SELECT
15a30 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2e 20   is a subquery. 
15a40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
15a50 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65  y try to combine
15a60 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20   this SELECT.** 
15a70 77 69 74 68 20 69 74 73 20 70 61 72 65 6e 74 20  with its parent 
15a80 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  to form a single
15a90 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49 6e   flat query.  In
15aa0 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69   so doing, it mi
15ab0 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68  ght.** change th
15ac0 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 66  e parent query f
15ad0 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67  rom a non-aggreg
15ae0 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65 67  ate to an aggreg
15af0 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f  ate query..** Fo
15b00 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 74  r that reason, t
15b10 68 65 20 70 50 61 72 65 6e 74 41 67 67 20 66 6c  he pParentAgg fl
15b20 61 67 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ag is passed as 
15b30 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74  a pointer, so it
15b40 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67  .** can be chang
15b50 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  ed..**.** Exampl
15b60 65 20 31 3a 20 20 20 54 68 65 20 6d 65 61 6e 69  e 1:   The meani
15b70 6e 67 20 6f 66 20 74 68 65 20 70 50 61 72 65 6e  ng of the pParen
15b80 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  t parameter..**.
15b90 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
15ba0 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c  ROM t1 JOIN (SEL
15bb0 45 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20  ECT x, count(*) 
15bc0 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33  FROM t2) JOIN t3
15bd0 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20 20 20  ;.**    \       
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
15bf0 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
15c00 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20   _______/       
15c10 20 2f 0a 2a 2a 20 20 20 20 20 5c 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 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f   /.**      \____
15c60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15c70 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
15c80 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15c90 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  /.**.** This rou
15ca0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
15cb0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
15cc0 72 79 20 66 69 72 73 74 2e 20 20 20 46 6f 72 20  ry first.   For 
15cd0 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50  that call,.** pP
15ce0 61 72 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55  arent will be NU
15cf0 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74 68 65 20  LL.  During the 
15d00 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
15d10 65 20 6f 75 74 65 72 20 71 75 65 72 79 2c 20 74  e outer query, t
15d20 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  his .** routine 
15d30 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  is called recurs
15d40 69 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20  ively to handle 
15d50 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 46  the subquery.  F
15d60 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65  or the recursive
15d70 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e  .** call, pParen
15d80 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  t will point to 
15d90 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
15da0 20 20 42 65 63 61 75 73 65 20 74 68 65 20 73 75    Because the su
15db0 62 71 75 65 72 79 20 69 73 0a 2a 2a 20 74 68 65  bquery is.** the
15dc0 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20   second element 
15dd0 69 6e 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a  in a three-way j
15de0 6f 69 6e 2c 20 74 68 65 20 70 61 72 65 6e 74 54  oin, the parentT
15df0 61 62 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c  ab parameter wil
15e00 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68 65 20 32  l.** be 1 (the 2
15e10 6e 64 20 76 61 6c 75 65 20 6f 66 20 61 20 30 2d  nd value of a 0-
15e20 69 6e 64 65 78 65 64 20 61 72 72 61 79 2e 29 0a  indexed array.).
15e30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
15e40 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
15e50 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
15e60 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
15e70 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
15e80 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
15e90 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
15ea0 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
15eb0 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65  oded. */.  int e
15ec0 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Dest,           
15ed0 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
15ee0 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ose of the resul
15ef0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ts */.  int iPar
15f00 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m,             /
15f10 2a 20 41 20 70 61 72 61 6d 65 74 65 72 20 75 73  * A parameter us
15f20 65 64 20 62 79 20 74 68 65 20 65 44 65 73 74 20  ed by the eDest 
15f30 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
15f40 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61  */.  Select *pPa
15f50 72 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 41  rent,       /* A
15f60 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 66 6f  nother SELECT fo
15f70 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20  r which this is 
15f80 61 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20  a sub-query */. 
15f90 20 69 6e 74 20 70 61 72 65 6e 74 54 61 62 2c 20   int parentTab, 
15fa0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
15fb0 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53 72   in pParent->pSr
15fc0 63 20 6f 66 20 74 68 69 73 20 71 75 65 72 79 20  c of this query 
15fd0 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72 65 6e  */.  int *pParen
15fe0 74 41 67 67 2c 20 20 20 20 20 20 20 2f 2a 20 54  tAgg,       /* T
15ff0 72 75 65 20 69 66 20 70 50 61 72 65 6e 74 20 75  rue if pParent u
16000 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
16010 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61  nctions */.  cha
16020 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20  r *aff          
16030 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20      /* If eDest 
16040 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68  is SRT_Union, th
16050 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
16060 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  g */.){.  int i,
16070 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
16080 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
16090 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  s */.  WhereInfo
160a0 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a   *pWInfo;     /*
160b0 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c   Return from sql
160c0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
160d0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
160f0 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  The virtual mach
16100 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ine under constr
16110 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
16120 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20  isAgg;          
16130 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73     /* True for s
16140 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65  elect lists like
16150 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20   "count(*)" */. 
16160 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
16170 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
16180 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78  of columns to ex
16190 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c  tract. */.  SrcL
161a0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
161b0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
161c0 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66  bles to select f
161d0 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  rom */.  Expr *p
161e0 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
161f0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
16200 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
16210 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
16220 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a  *pOrderBy;    /*
16230 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
16240 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
16250 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
16260 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f   *pGroupBy;    /
16270 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63  * The GROUP BY c
16280 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
16290 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
162a0 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20  Having;         
162b0 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c  /* The HAVING cl
162c0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
162d0 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69  LL */.  int isDi
162e0 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f  stinct;        /
162f0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49  * True if the DI
16300 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
16310 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
16320 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20  nt distinct;    
16330 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
16340 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
16350 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20  stinct set */.  
16360 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20  int rc = 1;     
16370 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
16380 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74  to return from t
16390 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
163a0 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e    int addrSortIn
163b0 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  dex;     /* Addr
163c0 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65  ess of an OP_Ope
163d0 6e 56 69 72 74 75 61 6c 20 69 6e 73 74 72 75 63  nVirtual instruc
163e0 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66  tion */.  AggInf
163f0 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20  o sAggInfo;     
16400 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
16410 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74  used by aggregat
16420 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  e queries */.  i
16430 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20  nt iEnd;        
16440 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
16450 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   of the end of t
16460 68 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69  he query */..  i
16470 66 28 20 70 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  f( p==0 || sqlit
16480 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
16490 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
164a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
164b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
164c0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
164d0 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
164e0 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
164f0 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
16500 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
16510 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
16520 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
16530 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
16540 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20  _SELECT.  /* If 
16550 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73  there is are a s
16560 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69  equence of queri
16570 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69  es, do the earli
16580 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20  er ones first.. 
16590 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
165a0 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ior ){.    if( p
165b0 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20  ->pRightmost==0 
165c0 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  ){.      Select 
165d0 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 66 6f  *pLoop;.      fo
165e0 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
165f0 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
16600 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 20 20  Prior){.        
16610 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73  pLoop->pRightmos
16620 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20  t = p;.      }. 
16630 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
16640 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72  multiSelect(pPar
16650 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50  se, p, eDest, iP
16660 61 72 6d 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 23  arm, aff);.  }.#
16670 65 6e 64 69 66 0a 0a 20 20 70 4f 72 64 65 72 42  endif..  pOrderB
16680 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
16690 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65  .  if( Ignorable
166a0 4f 72 64 65 72 62 79 28 65 44 65 73 74 29 20 29  Orderby(eDest) )
166b0 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  {.    p->pOrderB
166c0 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  y = 0;.  }.  if(
166d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
166e0 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2c  solve(pParse, p,
166f0 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   0) ){.    goto 
16700 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
16710 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
16720 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
16730 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65  Make local copie
16740 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  s of the paramet
16750 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75 65  ers for this que
16760 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c  ry..  */.  pTabL
16770 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
16780 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
16790 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20  ere;.  pGroupBy 
167a0 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
167b0 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
167c0 61 76 69 6e 67 3b 0a 20 20 69 73 41 67 67 20 3d  aving;.  isAgg =
167d0 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 69 73 44   p->isAgg;.  isD
167e0 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
167f0 69 73 74 69 6e 63 74 3b 0a 20 20 70 45 4c 69 73  istinct;.  pELis
16800 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
16810 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29   if( pEList==0 )
16820 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
16830 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f  ;..  /* .  ** Do
16840 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70   not even attemp
16850 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  t to generate an
16860 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61 76  y code if we hav
16870 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20  e already seen. 
16880 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72   ** errors befor
16890 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  e this routine s
168a0 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tarts..  */.  if
168b0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  ( pParse->nErr>0
168c0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
168d0 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69  nd;..  /* If wri
168e0 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ting to memory o
168f0 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73  r generating a s
16900 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73  et.  ** only a s
16910 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79  ingle column may
16920 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
16930 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16940 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
16950 69 66 28 20 28 65 44 65 73 74 3d 3d 53 52 54 5f  if( (eDest==SRT_
16960 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  Mem || eDest==SR
16970 54 5f 53 65 74 29 20 26 26 20 70 45 4c 69 73 74  T_Set) && pEList
16980 2d 3e 6e 45 78 70 72 3e 31 20 29 7b 0a 20 20 20  ->nExpr>1 ){.   
16990 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
169a0 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61  (pParse, "only a
169b0 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61   single result a
169c0 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20  llowed for ".   
169d0 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68      "a SELECT th
169e0 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
169f0 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20   expression");. 
16a00 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
16a10 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  nd;.  }.#endif..
16a20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73    /* ORDER BY is
16a30 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d   ignored for som
16a40 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a  e destinations..
16a50 20 20 2a 2f 0a 20 20 69 66 28 20 49 67 6e 6f 72    */.  if( Ignor
16a60 61 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65 73  ableOrderby(eDes
16a70 74 29 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72  t) ){.    pOrder
16a80 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  By = 0;.  }..  /
16a90 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
16aa0 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng code..  */.  
16ab0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
16ac0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
16ad0 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
16ae0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
16af0 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
16b00 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c  names if we will
16b10 20 62 65 20 75 73 69 6e 67 20 74 68 65 6d 20 69   be using them i
16b20 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54  n a callback.  T
16b30 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73  his.  ** step is
16b40 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
16b50 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20  output is going 
16b60 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 65  to some other de
16b70 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  stination..  */.
16b80 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
16b90 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
16ba0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
16bb0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
16bc0 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
16bd0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
16be0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
16bf0 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74  sub-queries in t
16c00 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
16c10 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
16c20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
16c30 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
16c40 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
16c50 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20  IEW).  for(i=0; 
16c60 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
16c70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
16c80 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
16c90 74 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20  thContext = 0;. 
16ca0 20 20 20 69 6e 74 20 6e 65 65 64 52 65 73 74 6f     int needResto
16cb0 72 65 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 73  reContext;.    s
16cc0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
16cd0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
16ce0 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 0a 20 20  bList->a[i];..  
16cf0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
16d00 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  lect==0 ) contin
16d10 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ue;.    if( pIte
16d20 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  m->zName!=0 ){. 
16d30 20 20 20 20 20 7a 53 61 76 65 64 41 75 74 68 43       zSavedAuthC
16d40 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
16d50 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
16d60 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75       pParse->zAu
16d70 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65  thContext = pIte
16d80 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  m->zName;.      
16d90 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
16da0 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  xt = 1;.    }els
16db0 65 7b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73  e{.      needRes
16dc0 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 30 3b  toreContext = 0;
16dd0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
16de0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
16df0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
16e00 20 53 52 54 5f 56 69 72 74 75 61 6c 54 61 62 2c   SRT_VirtualTab,
16e10 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
16e20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f     pItem->iCurso
16e30 72 2c 20 70 2c 20 69 2c 20 26 69 73 41 67 67 2c  r, p, i, &isAgg,
16e40 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65   0);.    if( nee
16e50 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20  dRestoreContext 
16e60 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
16e70 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
16e80 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
16e90 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  t;.    }.    pTa
16ea0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
16eb0 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d  .    pWhere = p-
16ec0 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28  >pWhere;.    if(
16ed0 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
16ee0 62 79 28 65 44 65 73 74 29 20 29 7b 0a 20 20 20  by(eDest) ){.   
16ef0 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d     pOrderBy = p-
16f00 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d  >pOrderBy;.    }
16f10 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
16f20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
16f30 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
16f40 61 76 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73  aving;.    isDis
16f50 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
16f60 74 69 6e 63 74 3b 0a 20 20 7d 0a 23 65 6e 64 69  tinct;.  }.#endi
16f70 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  f..  /* Check fo
16f80 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  r the special ca
16f90 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72  se of a min() or
16fa0 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20   max() function 
16fb0 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  by itself.  ** i
16fc0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
16fd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d  ..  */.  if( sim
16fe0 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70  pleMinMaxQuery(p
16ff0 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
17000 20 69 50 61 72 6d 29 20 29 7b 0a 20 20 20 20 72   iParm) ){.    r
17010 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 0;.    goto 
17020 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
17030 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
17040 65 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ee if this is a 
17050 73 75 62 71 75 65 72 79 20 74 68 61 74 20 63 61  subquery that ca
17060 6e 20 62 65 20 22 66 6c 61 74 74 65 6e 65 64 22  n be "flattened"
17070 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74   into its parent
17080 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74 74 65  ..  ** If flatte
17090 6e 69 6e 67 20 69 73 20 61 20 70 6f 73 73 69 62  ning is a possib
170a0 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20  lity, do so and 
170b0 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
170c0 6c 79 2e 20 20 0a 20 20 2a 2f 0a 23 69 66 6e 64  ly.  .  */.#ifnd
170d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
170e0 49 45 57 0a 20 20 69 66 28 20 70 50 61 72 65 6e  IEW.  if( pParen
170f0 74 20 26 26 20 70 50 61 72 65 6e 74 41 67 67 20  t && pParentAgg 
17100 26 26 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e  &&.      flatten
17110 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
17120 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74   pParent, parent
17130 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67  Tab, *pParentAgg
17140 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  , isAgg) ){.    
17150 69 66 28 20 69 73 41 67 67 20 29 20 2a 70 50 61  if( isAgg ) *pPa
17160 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20  rentAgg = 1;.   
17170 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
17180 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
17190 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
171a0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
171b0 65 2c 20 72 65 73 6f 6c 76 65 20 61 6e 79 20 63  e, resolve any c
171c0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
171d0 65 73 0a 20 20 2a 2a 20 6e 61 6d 65 73 20 74 68  es.  ** names th
171e0 61 74 20 68 61 76 65 20 62 65 65 6e 20 65 78 70  at have been exp
171f0 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65  licitly specifie
17200 64 20 61 6e 64 20 63 72 65 61 74 65 20 61 20 73  d and create a s
17210 6f 72 74 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20  orting index..  
17220 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 6f 72  **.  ** This sor
17230 74 69 6e 67 20 69 6e 64 65 78 20 6d 69 67 68 74  ting index might
17240 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e   end up being un
17250 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61  used if the data
17260 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78   can be .  ** ex
17270 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73  tracted in pre-s
17280 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66  orted order.  If
17290 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
172a0 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  e, then the.  **
172b0 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 20   OP_OpenVirtual 
172c0 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c  instruction will
172d0 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61   be changed to a
172e0 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20  n OP_Noop once. 
172f0 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75   ** we figure ou
17300 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69  t that the sorti
17310 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  ng index is not 
17320 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61 64 64  needed.  The add
17330 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20  rSortIndex.  ** 
17340 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
17350 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74   to facilitate t
17360 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f  hat change..  */
17370 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
17380 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
17390 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65  prList_item *pTe
173a0 72 6d 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20  rm;.    KeyInfo 
173b0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 66  *pKeyInfo;.    f
173c0 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 4f  or(i=0, pTerm=pO
173d0 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72  rderBy->a; i<pOr
173e0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
173f0 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
17400 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 7a 4e     if( pTerm->zN
17410 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ame ){.        p
17420 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f  Term->pExpr->pCo
17430 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ll = sqlite3Loca
17440 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
17450 2c 20 70 54 65 72 6d 2d 3e 7a 4e 61 6d 65 2c 20  , pTerm->zName, 
17460 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
17470 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 73   }.    if( pPars
17480 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20  e->nErr ){.     
17490 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
174a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79  ;.    }.    pKey
174b0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
174c0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
174d0 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  e, pOrderBy);.  
174e0 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
174f0 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
17500 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64  Tab++;.    p->ad
17510 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20 3d 20  drOpenVirt[2] = 
17520 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
17530 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17540 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
17550 56 69 72 74 75 61 6c 2c 20 70 4f 72 64 65 72 42  Virtual, pOrderB
17560 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72  y->iECursor, pOr
17570 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20  derBy->nExpr+2, 
17580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17590 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
175a0 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  pKeyInfo, P3_KEY
175b0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
175c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
175d0 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a  SortIndex = -1;.
175e0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
175f0 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a  e limiter..  */.
17600 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33    iEnd = sqlite3
17610 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
17620 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
17630 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
17640 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f  , p, iEnd);..  /
17650 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
17660 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
17670 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
17680 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
17690 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
176a0 44 65 73 74 3d 3d 53 52 54 5f 56 69 72 74 75 61  Dest==SRT_Virtua
176b0 6c 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  lTab ){.    sqli
176c0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
176d0 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20  OP_OpenVirtual, 
176e0 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  iParm, pEList->n
176f0 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
17700 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20   Open a virtual 
17710 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
17720 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
17730 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  t..  */.  if( is
17740 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
17750 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
17760 6f 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  o;.    distinct 
17770 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
17780 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
17790 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
177a0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  List(pParse, p->
177b0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
177c0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
177d0 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 64  P_OpenVirtual, d
177e0 69 73 74 69 6e 63 74 2c 20 30 2c 20 0a 20 20 20  istinct, 0, .   
177f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17800 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
17810 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
17820 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c  _HANDOFF);.  }el
17830 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74  se{.    distinct
17840 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
17850 20 41 67 67 72 65 67 61 74 65 20 61 6e 64 20 6e   Aggregate and n
17860 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
17870 72 69 65 73 20 61 72 65 20 68 61 6e 64 6c 65 64  ries are handled
17880 20 64 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a   differently */.
17890 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20    if( !isAgg && 
178a0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
178b0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
178c0 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67 72 65  is for non-aggre
178d0 67 61 74 65 20 71 75 65 72 69 65 73 0a 20 20 20  gate queries.   
178e0 20 2a 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   ** Begin the da
178f0 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 20 20  tabase scan.    
17900 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  */.    pWInfo = 
17910 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
17920 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
17930 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4f 72  st, pWhere, &pOr
17940 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
17950 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
17960 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
17970 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20    /* If sorting 
17980 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63  index that was c
17990 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  reated by a prio
179a0 72 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c  r OP_OpenVirtual
179b0 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63   .    ** instruc
179c0 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f  tion ended up no
179d0 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20  t being needed, 
179e0 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20  then change the 
179f0 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 0a 20  OP_OpenVirtual. 
17a00 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50     ** into an OP
17a10 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Noop..    */.  
17a20 20 20 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e    if( addrSortIn
17a30 64 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72  dex>=0 && pOrder
17a40 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  By==0 ){.      u
17a50 6e 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e  ncreateSortingIn
17a60 64 65 78 28 70 50 61 72 73 65 2c 20 61 64 64 72  dex(pParse, addr
17a70 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20  SortIndex);.    
17a80 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72    p->addrOpenVir
17a90 74 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  t[2] = -1;.    }
17aa0 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
17ab0 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
17ac0 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20  loop.    */.    
17ad0 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  if( selectInnerL
17ae0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
17af0 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
17b00 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c  derBy, distinct,
17b10 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   eDest,.        
17b20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 72              iPar
17b30 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74  m, pWInfo->iCont
17b40 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  inue, pWInfo->iB
17b50 72 65 61 6b 2c 20 61 66 66 29 20 29 7b 0a 20 20  reak, aff) ){.  
17b60 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
17b70 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _end;.    }..   
17b80 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
17b90 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a  base scan loop..
17ba0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
17bb0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
17bc0 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
17bd0 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
17be0 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  processing for a
17bf0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
17c00 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
17c10 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e  ext sNC;    /* N
17c20 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
17c30 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
17c40 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  gate information
17c50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65   */.    int iAMe
17c60 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
17c70 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
17c80 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72   for storing cur
17c90 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f  rent GROUP BY */
17ca0 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20  .    int iBMem; 
17cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
17cc0 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
17cd0 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50  r previous GROUP
17ce0 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
17cf0 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  UseFlag;       /
17d00 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f  * Mem address ho
17d10 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63  lding flag indic
17d20 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65  ating that at le
17d30 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ast.            
17d40 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
17d50 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e  ne row of the in
17d60 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  put to the aggre
17d70 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20  gator 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 20 2a 2a 20 70 72 6f 63 65 73         ** proces
17da0 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  sed */.    int i
17db0 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f  AbortFlag;     /
17dc0 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68  * Mem address wh
17dd0 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79  ich causes query
17de0 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69   abort if positi
17df0 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72  ve */.    int gr
17e00 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a  oupBySort;    /*
17e10 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20   Rows come from 
17e20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20  source in GROUP 
17e30 42 59 20 6f 72 64 65 72 20 2a 2f 0a 0a 0a 20 20  BY order */...  
17e40 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
17e50 6e 67 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  ng variables hol
17e60 64 20 61 64 64 72 65 73 73 65 73 20 6f 72 20 6c  d addresses or l
17e70 61 62 65 6c 73 20 66 6f 72 20 70 61 72 74 73 20  abels for parts 
17e80 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 69  of the.    ** vi
17e90 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 70 72  rtual machine pr
17ea0 6f 67 72 61 6d 20 77 65 20 61 72 65 20 70 75 74  ogram we are put
17eb0 74 69 6e 67 20 74 6f 67 65 74 68 65 72 20 2a 2f  ting together */
17ec0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74  .    int addrOut
17ed0 70 75 74 52 6f 77 3b 20 20 20 20 20 20 2f 2a 20  putRow;      /* 
17ee0 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74  Start of subrout
17ef0 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
17f00 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
17f10 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74  .    int addrSet
17f20 41 62 6f 72 74 3b 20 20 20 20 20 20 20 2f 2a 20  Abort;       /* 
17f30 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c  Set the abort fl
17f40 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  ag and return */
17f50 0a 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e 69  .    int addrIni
17f60 74 69 61 6c 69 7a 65 4c 6f 6f 70 3b 20 2f 2a 20  tializeLoop; /* 
17f70 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20 74 68  Start of code th
17f80 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74  at initializes t
17f90 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
17fa0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70  .    int addrTop
17fb0 4f 66 4c 6f 6f 70 3b 20 20 20 20 20 20 2f 2a 20  OfLoop;      /* 
17fc0 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
17fd0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74   loop */.    int
17fe0 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e   addrGroupByChan
17ff0 67 65 3b 20 20 2f 2a 20 43 6f 64 65 20 74 68 61  ge;  /* Code tha
18000 74 20 72 75 6e 73 20 77 68 65 6e 20 61 6e 79 20  t runs when any 
18010 47 52 4f 55 50 20 42 59 20 74 65 72 6d 20 63 68  GROUP BY term ch
18020 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  anges */.    int
18030 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77 3b   addrProcessRow;
18040 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20       /* Code to 
18050 70 72 6f 63 65 73 73 20 61 20 73 69 6e 67 6c 65  process a single
18060 20 69 6e 70 75 74 20 72 6f 77 20 2a 2f 0a 20 20   input row */.  
18070 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20    int addrEnd;  
18080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
18090 20 6f 66 20 61 6c 6c 20 70 72 6f 63 65 73 73 69   of all processi
180a0 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  ng */.    int ad
180b0 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 20 20  drSortingIdx;   
180c0 20 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e    /* The OP_Open
180d0 56 69 72 74 75 61 6c 20 66 6f 72 20 74 68 65 20  Virtual for the 
180e0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f  sorting index */
180f0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73  .    int addrRes
18100 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
18110 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72  Subroutine for r
18120 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63  esetting the acc
18130 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 0a 20 20 20  umulator */..   
18140 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74   addrEnd = sqlit
18150 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
18160 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76  v);..    /* Conv
18170 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  ert TK_COLUMN no
18180 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f  des into TK_AGG_
18190 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20  COLUMN and make 
181a0 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a  entries in.    *
181b0 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61  * sAggInfo for a
181c0 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  ll TK_AGG_FUNCTI
181d0 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72  ON nodes in expr
181e0 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20  essions of the. 
181f0 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61     ** SELECT sta
18200 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  tement..    */. 
18210 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
18220 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
18230 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20  .    sNC.pParse 
18240 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e  = pParse;.    sN
18250 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
18260 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70  bList;.    sNC.p
18270 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49  AggInfo = &sAggI
18280 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  nfo;.    sAggInf
18290 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
182a0 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47   = pGroupBy ? pG
182b0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20  roupBy->nExpr+1 
182c0 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  : 0;.    sAggInf
182d0 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  o.pGroupBy = pGr
182e0 6f 75 70 42 79 3b 0a 20 20 20 20 69 66 28 20 73  oupBy;.    if( s
182f0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
18300 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
18310 45 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  EList) ){.      
18320 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
18330 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
18340 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
18350 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
18360 4f 72 64 65 72 42 79 29 20 29 7b 0a 20 20 20 20  OrderBy) ){.    
18370 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
18380 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
18390 20 70 48 61 76 69 6e 67 20 26 26 20 73 71 6c 69   pHaving && sqli
183a0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
183b0 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70  gregates(&sNC, p
183c0 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20  Having) ){.     
183d0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
183e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67  ;.    }.    sAgg
183f0 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f  Info.nAccumulato
18400 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  r = sAggInfo.nCo
18410 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  lumn;.    for(i=
18420 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46  0; i<sAggInfo.nF
18430 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unc; i++){.     
18440 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
18450 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
18460 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  sNC, sAggInfo.aF
18470 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 4c  unc[i].pExpr->pL
18480 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
18490 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
184a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
184b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61     if( sqlite3Ma
184c0 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20 67  llocFailed() ) g
184d0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
184e0 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69  .    /* Processi
184f0 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
18500 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20  s with GROUP BY 
18510 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e  is very differen
18520 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63  t and.    ** muc
18530 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74  h more complex t
18540 68 61 20 61 67 67 72 65 67 61 74 65 73 20 77 69  ha aggregates wi
18550 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59  thout a GROUP BY
18560 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
18570 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
18580 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
18590 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67  Info;  /* Keying
185a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
185b0 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c   the group by cl
185c0 61 75 73 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  ause */..      /
185d0 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20  * Create labels 
185e0 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
185f0 6e 65 65 64 69 6e 67 0a 20 20 20 20 20 20 2a 2f  needing.      */
18600 0a 20 20 20 20 20 0a 20 20 20 20 20 20 61 64 64  .     .      add
18610 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 20  rInitializeLoop 
18620 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
18630 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
18640 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e   addrGroupByChan
18650 67 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ge = sqlite3Vdbe
18660 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
18670 20 20 20 20 61 64 64 72 50 72 6f 63 65 73 73 52      addrProcessR
18680 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
18690 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
186a0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
186b0 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63   is a GROUP BY c
186c0 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e  lause we might n
186d0 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  eed a sorting in
186e0 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  dex to.      ** 
186f0 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41  implement it.  A
18700 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72  llocate that sor
18710 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20  ting index now. 
18720 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74   If it turns out
18730 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
18740 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74  e do not need it
18750 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20   after all, the 
18760 4f 70 65 6e 56 69 72 74 75 61 6c 20 69 6e 73 74  OpenVirtual inst
18770 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ruction.      **
18780 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
18790 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20  ed into a Noop. 
187a0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
187b0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
187c0 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gIdx = pParse->n
187d0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65  Tab++;.      pKe
187e0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
187f0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
18800 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20  se, pGroupBy);. 
18810 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
18820 49 64 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20  Idx =.          
18830 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
18840 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c  , OP_OpenVirtual
18850 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
18860 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20  ngIdx,.         
18870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18880 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
18890 67 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  gColumn,.       
188a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188b0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
188c0 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P3_KEYINFO_HA
188d0 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f  NDOFF);..      /
188e0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d  * Initialize mem
188f0 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73  ory locations us
18900 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61  ed by GROUP BY a
18910 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73  ggregate process
18920 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ing.      */.   
18930 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 70 50     iUseFlag = pP
18940 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
18950 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d      iAbortFlag =
18960 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
18970 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70  .      iAMem = p
18980 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
18990 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
189a0 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
189b0 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20  pr;.      iBMem 
189c0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
189d0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
189e0 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
189f0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
18a00 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
18a10 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69   OP_MemInt, 0, i
18a20 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
18a30 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
18a40 2c 20 22 23 20 63 6c 65 61 72 20 61 62 6f 72 74  , "# clear abort
18a50 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
18a60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18a70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30  (v, OP_MemInt, 0
18a80 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
18a90 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
18aa0 76 2c 20 22 23 20 69 6e 64 69 63 61 74 65 20 61  v, "# indicate a
18ab0 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79  ccumulator empty
18ac0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
18ad0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
18ae0 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 49  P_Goto, 0, addrI
18af0 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a  nitializeLoop);.
18b00 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
18b10 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
18b20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73  that outputs a s
18b30 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
18b40 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
18b50 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72   set.  This subr
18b60 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f  outine first loo
18b70 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c  ks at the iUseFl
18b80 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67  ag.  If iUseFlag
18b90 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73  .      ** is les
18ba0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
18bb0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62  to zero, the sub
18bc0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
18bd0 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a  op.  If.      **
18be0 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
18bf0 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75  calls for the qu
18c00 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68  ery to abort, th
18c10 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  is subroutine.  
18c20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74      ** increment
18c30 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67  s the iAbortFlag
18c40 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
18c50 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
18c60 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  g in.      ** or
18c70 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  der to signal th
18c80 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72  e caller to abor
18c90 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
18ca0 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d    addrSetAbort =
18cb0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
18cc0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
18cd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18ce0 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c  Op(v, OP_MemInt,
18cf0 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   1, iAbortFlag);
18d00 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
18d10 6e 74 28 28 76 2c 20 22 23 20 73 65 74 20 61 62  nt((v, "# set ab
18d20 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
18d30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18d40 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  dOp(v, OP_Return
18d50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  , 0, 0);.      a
18d60 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
18d70 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
18d80 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
18d90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18da0 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c  (v, OP_IfMemPos,
18db0 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f   iUseFlag, addrO
18dc0 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20  utputRow+2);.   
18dd0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
18de0 76 2c 20 22 23 20 47 72 6f 75 70 62 79 20 72 65  v, "# Groupby re
18df0 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65  sult generator e
18e00 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20  ntry point"));. 
18e10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18e20 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75  AddOp(v, OP_Retu
18e30 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rn, 0, 0);.     
18e40 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
18e50 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
18e60 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
18e70 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
18e80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
18e90 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
18ea0 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f  , pHaving, addrO
18eb0 75 74 70 75 74 52 6f 77 2b 31 2c 20 31 29 3b 0a  utputRow+1, 1);.
18ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
18ed0 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f   = selectInnerLo
18ee0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
18ef0 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70  >pEList, 0, 0, p
18f00 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
18f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f20 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20 65 44      distinct, eD
18f30 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20  est, 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 20 61 64 64 72 4f 75 74 70          addrOutp
18f60 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74  utRow+1, addrSet
18f70 41 62 6f 72 74 2c 20 61 66 66 29 3b 0a 20 20 20  Abort, aff);.   
18f80 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
18f90 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
18fa0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
18fb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18fc0 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72  ddOp(v, OP_Retur
18fd0 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
18fe0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
18ff0 22 23 20 65 6e 64 20 67 72 6f 75 70 62 79 20 72  "# end groupby r
19000 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22  esult generator"
19010 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  ));..      /* Ge
19020 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
19030 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
19040 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79  set the group-by
19050 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20   accumulator.   
19060 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
19070 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56  Reset = sqlite3V
19080 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
19090 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  );.      resetAc
190a0 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
190b0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
190c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
190d0 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72  ddOp(v, OP_Retur
190e0 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20  n, 0, 0);..     
190f0 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70   /* Begin a loop
19100 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
19110 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f  ct all source ro
19120 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ws in GROUP BY o
19130 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rder..      ** T
19140 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76  his might involv
19150 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c  e two separate l
19160 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f  oops with an OP_
19170 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c  Sort in between,
19180 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   or.      ** it 
19190 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c  might be a singl
191a0 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73  e loop that uses
191b0 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74   an index to ext
191c0 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ract information
191d0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
191e0 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20   right order to 
191f0 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20  begin with..    
19200 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
19210 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
19220 65 6c 28 76 2c 20 61 64 64 72 49 6e 69 74 69 61  el(v, addrInitia
19230 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  lizeLoop);.     
19240 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19250 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
19260 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
19270 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
19280 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
19290 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
192a0 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70   pWhere, &pGroup
192b0 42 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  By);.      if( p
192c0 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
192d0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
192e0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d    if( pGroupBy==
192f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
19300 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
19310 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
19320 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
19330 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
19340 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
19350 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
19360 68 65 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  he OP_OpenVirtua
19370 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a  l table will be.
19380 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65          ** cance
19390 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75  lled later becau
193a0 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  se we still need
193b0 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79   to use the pKey
193c0 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a  Info.        */.
193d0 20 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79          pGroupBy
193e0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
193f0 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
19400 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ort = 0;.      }
19410 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
19420 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67   Rows are coming
19430 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d   out in undeterm
19440 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20  ined order.  We 
19450 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20  have to push.   
19460 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77       ** each row
19470 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20   into a sorting 
19480 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65  index, terminate
19490 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c   the first loop,
194a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
194b0 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73   loop over the s
194c0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20  orting index in 
194d0 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
194e0 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20   output.        
194f0 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ** in sorted ord
19500 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  er.        */.  
19510 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
19520 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  t = 1;.        s
19530 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
19540 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
19550 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
19560 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19570 4f 70 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  Op(v, OP_Sequenc
19580 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  e, sAggInfo.sort
19590 69 6e 67 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  ingIdx, 0);.    
195a0 20 20 20 20 6a 20 3d 20 70 47 72 6f 75 70 42 79      j = pGroupBy
195b0 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 20  ->nExpr+1;.     
195c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
195d0 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
195e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
195f0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
19600 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67  ol *pCol = &sAgg
19610 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20  Info.aCol[i];.  
19620 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
19630 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
19640 6a 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  j ) continue;.  
19650 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
19660 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
19670 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
19680 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
19690 50 5f 52 6f 77 69 64 2c 20 70 43 6f 6c 2d 3e 69  P_Rowid, pCol->i
196a0 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
196b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
196c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
196d0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
196e0 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61  olumn, pCol->iTa
196f0 62 6c 65 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75  ble, pCol->iColu
19700 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  mn);.          }
19710 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a  .          j++;.
19720 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19730 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19740 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
19750 6f 72 64 2c 20 6a 2c 20 30 29 3b 0a 20 20 20 20  ord, j, 0);.    
19760 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19770 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
19780 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  sert, sAggInfo.s
19790 6f 72 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a 20  ortingIdx, 0);. 
197a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
197b0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
197c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
197d0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
197e0 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
197f0 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
19800 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
19810 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 47  Comment((v, "# G
19820 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b  ROUP BY sort"));
19830 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
19840 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  o.useSortingIdx 
19850 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 1;.      }..  
19860 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
19870 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
19880 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73  P BY terms and s
19890 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20  tore in b0, b1, 
198a0 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28  b2....      ** (
198b0 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63  b0 is memory loc
198c0 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62  ation iBMem+0, b
198d0 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e  1 is iBMem+1, an
198e0 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20  d so forth).    
198f0 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72    ** Then compar
19900 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
19910 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61  OUP BY terms aga
19920 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42  inst the GROUP B
19930 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a  Y terms.      **
19940 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
19950 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  us row currently
19960 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61   stored in a0, a
19970 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, a2....      *
19980 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f  /.      addrTopO
19990 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
199a0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
199b0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
199c0 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; j<pGroupBy->nE
199d0 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
199e0 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
199f0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rt ){.          
19a00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19a10 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
19a20 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
19a30 64 78 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20  dx, j);.        
19a40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
19a50 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74   sAggInfo.direct
19a60 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Mode = 1;.      
19a70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
19a80 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ode(pParse, pGro
19a90 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  upBy->a[j].pExpr
19aa0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
19ab0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19ac0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
19ad0 74 6f 72 65 2c 20 69 42 4d 65 6d 2b 6a 2c 20 6a  tore, iBMem+j, j
19ae0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
19af0 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
19b00 20 20 20 66 6f 72 28 6a 3d 70 47 72 6f 75 70 42     for(j=pGroupB
19b10 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 6a 3e 3d 30  y->nExpr-1; j>=0
19b20 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  ; j--){.        
19b30 69 66 28 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  if( j<pGroupBy->
19b40 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20  nExpr-1 ){.     
19b50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19b60 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
19b70 6f 61 64 2c 20 69 42 4d 65 6d 2b 6a 2c 20 30 29  oad, iBMem+j, 0)
19b80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19ba0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
19bb0 61 64 2c 20 69 41 4d 65 6d 2b 6a 2c 20 30 29 3b  ad, iAMem+j, 0);
19bc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  .        if( j==
19bd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
19be0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
19bf0 76 2c 20 4f 50 5f 45 71 2c 20 30 78 32 30 30 2c  v, OP_Eq, 0x200,
19c00 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77 29   addrProcessRow)
19c10 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
19c20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
19c30 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
19c40 50 5f 4e 65 2c 20 30 78 32 30 30 2c 20 61 64 64  P_Ne, 0x200, add
19c50 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29 3b  rGroupByChange);
19c60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19c70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
19c80 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 76  angeP3(v, -1, (v
19c90 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2d 3e 61  oid*)pKeyInfo->a
19ca0 43 6f 6c 6c 5b 6a 5d 2c 20 50 33 5f 43 4f 4c 4c  Coll[j], P3_COLL
19cb0 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  SEQ);.      }.. 
19cc0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
19cd0 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
19ce0 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f  whenever the GRO
19cf0 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20  UP BY changes.. 
19d00 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 20 69       ** Change i
19d10 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  n the GROUP BY a
19d20 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74  re detected by t
19d30 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
19d40 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e  .      ** block.
19d50 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20    If there were 
19d60 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73  no changes, this
19d70 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65   block is skippe
19d80 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
19d90 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63    ** This code c
19da0 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72  opies current gr
19db0 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20  oup by terms in 
19dc0 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20  b0,b1,b2,....   
19dd0 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30     ** over to a0
19de0 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e  ,a1,a2.  It then
19df0 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75   calls the outpu
19e00 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  t subroutine.   
19e10 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73     ** and resets
19e20 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
19e30 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
19e40 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74  ters in preparat
19e50 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  ion.      ** for
19e60 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20   the next GROUP 
19e70 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20  BY batch..      
19e80 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
19e90 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
19ea0 28 76 2c 20 61 64 64 72 47 72 6f 75 70 42 79 43  (v, addrGroupByC
19eb0 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 66 6f  hange);.      fo
19ec0 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
19ed0 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
19ee0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
19ef0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
19f00 65 6d 4d 6f 76 65 2c 20 69 41 4d 65 6d 2b 6a 2c  emMove, iAMem+j,
19f10 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
19f20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
19f30 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
19f40 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 4f 75  Gosub, 0, addrOu
19f50 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
19f60 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
19f70 22 23 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  "# output one ro
19f80 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  w"));.      sqli
19f90 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
19fa0 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 41 62  OP_IfMemPos, iAb
19fb0 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64  ortFlag, addrEnd
19fc0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
19fd0 6d 65 6e 74 28 28 76 2c 20 22 23 20 63 68 65 63  ment((v, "# chec
19fe0 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  k abort flag"));
19ff0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a000 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
1a010 73 75 62 2c 20 30 2c 20 61 64 64 72 52 65 73 65  sub, 0, addrRese
1a020 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
1a030 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 72 65 73  mment((v, "# res
1a040 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  et accumulator")
1a050 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
1a060 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ate the aggregat
1a070 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62  e accumulators b
1a080 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
1a090 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ent of.      ** 
1a0a0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a  the current row.
1a0b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
1a0c0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1a0d0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 50 72  eLabel(v, addrPr
1a0e0 6f 63 65 73 73 52 6f 77 29 3b 0a 20 20 20 20 20  ocessRow);.     
1a0f0 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
1a100 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
1a110 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
1a120 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1a130 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 69   OP_MemInt, 1, i
1a140 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
1a150 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1a160 22 23 20 69 6e 64 69 63 61 74 65 20 64 61 74 61  "# indicate data
1a170 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22   in accumulator"
1a180 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  ));..      /* En
1a190 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  d of the loop.  
1a1a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1a1b0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
1a1c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1a1d0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
1a1e0 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ext, sAggInfo.so
1a1f0 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f  rtingIdx, addrTo
1a200 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  pOfLoop);.      
1a210 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1a220 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
1a230 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
1a240 75 6e 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49  uncreateSortingI
1a250 6e 64 65 78 28 70 50 61 72 73 65 2c 20 61 64 64  ndex(pParse, add
1a260 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20  rSortingIdx);.  
1a270 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1a280 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c  Output the final
1a290 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20   row of result. 
1a2a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
1a2b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1a2c0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61  , OP_Gosub, 0, a
1a2d0 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
1a2e0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1a2f0 28 28 76 2c 20 22 23 20 6f 75 74 70 75 74 20 66  ((v, "# output f
1a300 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 20 20 20  inal row"));.   
1a310 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64     .    } /* end
1a320 69 66 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20  if pGroupBy */. 
1a330 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20     else {.      
1a340 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e  /* This case run
1a350 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61  s if the aggrega
1a360 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20  te has no GROUP 
1a370 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a  BY clause.  The.
1a380 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
1a390 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70  ing is much simp
1a3a0 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20  ler since there 
1a3b0 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  is only a single
1a3c0 20 72 6f 77 0a 20 20 20 20 20 20 2a 2a 20 6f 66   row.      ** of
1a3d0 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a   output..      *
1a3e0 2f 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  /.      resetAcc
1a3f0 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
1a400 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
1a410 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
1a420 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
1a430 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
1a440 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
1a450 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
1a460 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1a470 64 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41  d;.      updateA
1a480 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
1a490 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
1a4a0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
1a4b0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
1a4c0 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
1a4d0 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
1a4e0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
1a4f0 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
1a500 0a 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69  .      if( pHavi
1a510 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ng ){.        sq
1a520 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1a530 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
1a540 2c 20 61 64 64 72 45 6e 64 2c 20 31 29 3b 0a 20  , addrEnd, 1);. 
1a550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c       }.      sel
1a560 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
1a570 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
1a580 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20  t, 0, 0, 0, -1, 
1a590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a5a0 20 20 20 20 20 20 20 65 44 65 73 74 2c 20 69 50         eDest, iP
1a5b0 61 72 6d 2c 20 61 64 64 72 45 6e 64 2c 20 61 64  arm, addrEnd, ad
1a5c0 64 72 45 6e 64 2c 20 61 66 66 29 3b 0a 20 20 20  drEnd, aff);.   
1a5d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1a5e0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a5f0 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
1a600 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67  .  } /* endif ag
1a610 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
1a620 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
1a630 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
1a640 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e  lause, then we n
1a650 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20  eed to sort the 
1a660 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64  results.  ** and
1a670 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68   send them to th
1a680 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62  e callback one b
1a690 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  y one..  */.  if
1a6a0 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
1a6b0 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
1a6c0 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c  il(pParse, p, v,
1a6d0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
1a6e0 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20  eDest, iParm);. 
1a6f0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1a700 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1a710 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61  .  /* If this wa
1a720 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 77 65  s a subquery, we
1a730 20 68 61 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72   have now conver
1a740 74 65 64 20 74 68 65 20 73 75 62 71 75 65 72 79  ted the subquery
1a750 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d   into a.  ** tem
1a760 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 53  porary table.  S
1a770 6f 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62  o delete the sub
1a780 71 75 65 72 79 20 73 74 72 75 63 74 75 72 65 20  query structure 
1a790 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 0a  from the parent.
1a7a0 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20    ** to prevent 
1a7b0 74 68 69 73 20 73 75 62 71 75 65 72 79 20 66 72  this subquery fr
1a7c0 6f 6d 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74  om being evaluat
1a7d0 65 64 20 61 67 61 69 6e 20 61 6e 64 20 74 6f 20  ed again and to 
1a7e0 66 6f 72 63 65 20 74 68 65 0a 20 20 2a 2a 20 74  force the.  ** t
1a7f0 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 74 65  he use of the te
1a800 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 20  mporary table.. 
1a810 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e   */.  if( pParen
1a820 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
1a830 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e   pParent->pSrc->
1a840 6e 53 72 63 3e 70 61 72 65 6e 74 54 61 62 20 29  nSrc>parentTab )
1a850 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1a860 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70  arent->pSrc->a[p
1a870 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63  arentTab].pSelec
1a880 74 3d 3d 70 20 29 3b 0a 20 20 20 20 73 71 6c 69  t==p );.    sqli
1a890 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1a8a0 70 29 3b 0a 20 20 20 20 70 50 61 72 65 6e 74 2d  p);.    pParent-
1a8b0 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54  >pSrc->a[parentT
1a8c0 61 62 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b  ab].pSelect = 0;
1a8d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1a8e0 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
1a8f0 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20  kip this query. 
1a900 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1a910 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1a920 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68   iEnd);..  /* Th
1a930 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63  e SELECT was suc
1a940 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e  cessfully coded.
1a950 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72     Set the retur
1a960 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a  n code to 0.  **
1a970 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20   to indicate no 
1a980 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72  errors..  */.  r
1a990 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  c = 0;..  /* Con
1a9a0 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65  trol jumps to he
1a9b0 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  re if an error i
1a9c0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62  s encountered ab
1a9d0 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a  ove, or upon.  *
1a9e0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64  * successful cod
1a9f0 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ing of the SELEC
1aa00 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65  T..  */.select_e
1aa10 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  nd:.  sqliteFree
1aa20 28 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b  (sAggInfo.aCol);
1aa30 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 73 41  .  sqliteFree(sA
1aa40 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20  ggInfo.aFunc);. 
1aa50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a         return rc;.}.