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

Artifact 61d4a739956aaeb124cdf12c34c66e99ae34212c:


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 36 35 20  select.c,v 1.65 
0200: 32 30 30 32 2f 30 32 2f 32 33 20 30 32 3a 33 32  2002/02/23 02:32
0210: 3a 31 30 20 64 72 68 20 45 78 70 20 24 0a 2a 2f  :10 drh Exp $.*/
0220: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0230: 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 41  eInt.h"../*.** A
0240: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65  llocate a new Se
0250: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61  lect structure a
0260: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
0270: 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73  ter to that.** s
0280: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c  tructure..*/.Sel
0290: 65 63 74 20 2a 73 71 6c 69 74 65 53 65 6c 65 63  ect *sqliteSelec
02a0: 74 4e 65 77 28 0a 20 20 45 78 70 72 4c 69 73 74  tNew(.  ExprList
02b0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f 2a   *pEList,     /*
02c0: 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 74   which columns t
02d0: 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 65  o include in the
02e0: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 49 64 4c   result */.  IdL
02f0: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
0300: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
0310: 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20 74  lause -- which t
0320: 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f  ables to scan */
0330: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
0340: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
0350: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
0360: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
0370: 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 47  upBy,   /* the G
0380: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
0390: 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
03a0: 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  g,        /* the
03b0: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 2a   HAVING clause *
03c0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
03d0: 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68 65  rderBy,   /* the
03e0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
03f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74   */.  int isDist
0400: 69 6e 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 74  inct,       /* t
0410: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
0420: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
0430: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
0440: 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20  nLimit,         
0450: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
0460: 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 74 20  .  -1 means not 
0470: 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  used */.  int nO
0480: 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20  ffset           
0490: 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75 65 2e  /* OFFSET value.
04a0: 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 74 20 75    -1 means not u
04b0: 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  sed */.){.  Sele
04c0: 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  ct *pNew;.  pNew
04d0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
04e0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
04f0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
0500: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  ){.    sqliteExp
0510: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69  rListDelete(pELi
0520: 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 49  st);.    sqliteI
0530: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 53 72 63  dListDelete(pSrc
0540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  );.    sqliteExp
0550: 72 44 65 6c 65 74 65 28 70 57 68 65 72 65 29 3b  rDelete(pWhere);
0560: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 4c  .    sqliteExprL
0570: 69 73 74 44 65 6c 65 74 65 28 70 47 72 6f 75 70  istDelete(pGroup
0580: 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45  By);.    sqliteE
0590: 78 70 72 44 65 6c 65 74 65 28 70 48 61 76 69 6e  xprDelete(pHavin
05a0: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78  g);.    sqliteEx
05b0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4f 72  prListDelete(pOr
05c0: 64 65 72 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  derBy);.  }else{
05d0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  .    pNew->pELis
05e0: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20  t = pEList;.    
05f0: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72  pNew->pSrc = pSr
0600: 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 68  c;.    pNew->pWh
0610: 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
0620: 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
0630: 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20   = pGroupBy;.   
0640: 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
0650: 20 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 70 4e   pHaving;.    pN
0660: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  ew->pOrderBy = p
0670: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 4e 65  OrderBy;.    pNe
0680: 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  w->isDistinct = 
0690: 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20  isDistinct;.    
06a0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  pNew->op = TK_SE
06b0: 4c 45 43 54 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  LECT;.    pNew->
06c0: 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d 69 74 3b  nLimit = nLimit;
06d0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 66 66 73  .    pNew->nOffs
06e0: 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b 0a 20 20  et = nOffset;.  
06f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
0700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
0710: 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63   the given Selec
0720: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0730: 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74  all of its subst
0740: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
0750: 64 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65  d sqliteSelectDe
0760: 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70 29 7b  lete(Select *p){
0770: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
0780: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 45 78  turn;.  sqliteEx
0790: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
07a0: 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  pEList);.  sqlit
07b0: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  eIdListDelete(p-
07c0: 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  >pSrc);.  sqlite
07d0: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 57  ExprDelete(p->pW
07e0: 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 45  here);.  sqliteE
07f0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  xprListDelete(p-
0800: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 73 71  >pGroupBy);.  sq
0810: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
0820: 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 73 71  ->pHaving);.  sq
0830: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
0840: 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  te(p->pOrderBy);
0850: 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44  .  sqliteSelectD
0860: 65 6c 65 74 65 28 70 2d 3e 70 50 72 69 6f 72 29  elete(p->pPrior)
0870: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
0880: 2d 3e 7a 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  ->zSelect);.  sq
0890: 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a  liteFree(p);.}..
08a0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
08b0: 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72   aggregate infor
08c0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
08d0: 70 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  parse structure.
08e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
08f0: 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49  sqliteAggregateI
0900: 6e 66 6f 52 65 73 65 74 28 50 61 72 73 65 20 2a  nfoReset(Parse *
0910: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
0920: 65 46 72 65 65 28 70 50 61 72 73 65 2d 3e 61 41  eFree(pParse->aA
0930: 67 67 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61  gg);.  pParse->a
0940: 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Agg = 0;.  pPars
0950: 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20 20 70  e->nAgg = 0;.  p
0960: 50 61 72 73 65 2d 3e 69 41 67 67 43 6f 75 6e 74  Parse->iAggCount
0970: 20 3d 20 2d 31 3b 0a 20 20 70 50 61 72 73 65 2d   = -1;.  pParse-
0980: 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 7d 0a 0a  >useAgg = 0;.}..
0990: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
09a0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
09b0: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
09c0: 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  side of the inne
09d0: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53  r loop.** of a S
09e0: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ELECT..**.** The
09f0: 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20   pEList is used 
0a00: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
0a10: 20 76 61 6c 75 65 73 20 66 6f 72 20 65 61 63 68   values for each
0a20: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a 2a   column in the.*
0a30: 2a 20 72 65 73 75 6c 74 20 72 6f 77 2e 20 20 45  * result row.  E
0a40: 78 63 65 70 74 20 20 69 66 20 70 45 4c 69 73 74  xcept  if pEList
0a50: 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 77 65 20  ==NULL, then we 
0a60: 6a 75 73 74 20 72 65 61 64 20 6e 43 6f 6c 75 6d  just read nColum
0a70: 6e 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 66 72  n.** elements fr
0a80: 6f 6d 20 74 68 65 20 73 72 63 54 61 62 20 74 61  om the srcTab ta
0a90: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
0aa0: 6e 74 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  nt selectInnerLo
0ab0: 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  op(.  Parse *pPa
0ac0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
0ad0: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
0ae0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
0af0: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
0b00: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75   /* List of valu
0b10: 65 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74  es being extract
0b20: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54  ed */.  int srcT
0b30: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
0b40: 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f  /* Pull data fro
0b50: 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  m this table */.
0b60: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
0b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0b80: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
0b90: 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  n the source tab
0ba0: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
0bb0: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
0bc0: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
0bd0: 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73 69  sort results usi
0be0: 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20  ng this key */. 
0bf0: 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20   int distinct,  
0c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e           /* If >
0c10: 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65  =0, make sure re
0c20: 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e  sults are distin
0c30: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ct */.  int eDes
0c40: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
0c50: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
0c60: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
0c70: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c   */.  int iParm,
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0c90: 20 41 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   An argument to 
0ca0: 74 68 65 20 64 69 73 70 6f 73 61 6c 20 6d 65 74  the disposal met
0cb0: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  hod */.  int iCo
0cc0: 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20  ntinue,         
0cd0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
0ce0: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
0cf0: 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ext row */.  int
0d00: 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20   iBreak         
0d10: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
0d20: 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
0d30: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
0d40: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
0d50: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
0d60: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
0d70: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   v==0 ) return 0
0d80: 3b 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65  ;..  /* Pull the
0d90: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d   requested colum
0da0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ns..  */.  if( p
0db0: 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  EList ){.    for
0dc0: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
0dd0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
0de0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
0df0: 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  e(pParse, pEList
0e00: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
0e10: 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e     }.    nColumn
0e20: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
0e30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
0e40: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
0e50: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  n; i++){.      s
0e60: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
0e70: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
0e80: 54 61 62 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  Tab, i);.    }. 
0e90: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
0ea0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
0eb0: 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20   was present on 
0ec0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
0ed0: 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ment.  ** and th
0ee0: 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20  is row has been 
0ef0: 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65  seen before, the
0f00: 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68  n do not make th
0f10: 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74  is row.  ** part
0f20: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   of the result..
0f30: 20 20 2a 2f 0a 20 20 69 66 28 20 64 69 73 74 69    */.  if( disti
0f40: 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  nct>=0 ){.    in
0f50: 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 56 64  t lbl = sqliteVd
0f60: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
0f70: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
0f80: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65  dOp(v, OP_MakeKe
0f90: 79 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  y, pEList->nExpr
0fa0: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
0fb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
0fc0: 44 69 73 74 69 6e 63 74 2c 20 64 69 73 74 69 6e  Distinct, distin
0fd0: 63 74 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 73 71  ct, lbl);.    sq
0fe0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
0ff0: 20 4f 50 5f 50 6f 70 2c 20 70 45 4c 69 73 74 2d   OP_Pop, pEList-
1000: 3e 6e 45 78 70 72 2b 31 2c 20 30 29 3b 0a 20 20  >nExpr+1, 0);.  
1010: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
1020: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
1030: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20   iContinue);.   
1040: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
1050: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
1060: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
1070: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
1080: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  g, 0, 0);.    sq
1090: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
10a0: 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 64   OP_PutStrKey, d
10b0: 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d  istinct, 0);.  }
10c0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
10d0: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
10e0: 6c 61 75 73 65 2c 20 74 68 65 6e 20 73 74 6f 72  lause, then stor
10f0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  e the results.  
1100: 2a 2a 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 0a  ** in a sorter..
1110: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
1120: 72 42 79 20 29 7b 0a 20 20 20 20 63 68 61 72 20  rBy ){.    char 
1130: 2a 7a 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  *zSortOrder;.   
1140: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1150: 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 52  (v, OP_SortMakeR
1160: 65 63 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  ec, nColumn, 0);
1170: 0a 20 20 20 20 7a 53 6f 72 74 4f 72 64 65 72 20  .    zSortOrder 
1180: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
1190: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
11a0: 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  + 1 );.    if( z
11b0: 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 29 20 72  SortOrder==0 ) r
11c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 66 6f 72  eturn 1;.    for
11d0: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
11e0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
11f0: 20 20 20 20 20 7a 53 6f 72 74 4f 72 64 65 72 5b       zSortOrder[
1200: 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  i] = pOrderBy->a
1210: 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3f 20  [i].sortOrder ? 
1220: 27 2d 27 20 3a 20 27 2b 27 3b 0a 20 20 20 20 20  '-' : '+';.     
1230: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
1240: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
1250: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1260: 20 20 20 7d 0a 20 20 20 20 7a 53 6f 72 74 4f 72     }.    zSortOr
1270: 64 65 72 5b 70 4f 72 64 65 72 42 79 2d 3e 6e 45  der[pOrderBy->nE
1280: 78 70 72 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  xpr] = 0;.    sq
1290: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
12a0: 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 4b 65 79 2c   OP_SortMakeKey,
12b0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
12c0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12d0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
12e0: 2d 31 2c 20 7a 53 6f 72 74 4f 72 64 65 72 2c 20  -1, zSortOrder, 
12f0: 73 74 72 6c 65 6e 28 7a 53 6f 72 74 4f 72 64 65  strlen(zSortOrde
1300: 72 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  r));.    sqliteF
1310: 72 65 65 28 7a 53 6f 72 74 4f 72 64 65 72 29 3b  ree(zSortOrder);
1320: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
1330: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 50  ddOp(v, OP_SortP
1340: 75 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c  ut, 0, 0);.  }el
1350: 73 65 20 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 69  se ..  /* In thi
1360: 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61  s mode, write ea
1370: 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20  ch query result 
1380: 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  to the key of th
1390: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 2a 2a  e temporary.  **
13a0: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
13b0: 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
13c0: 53 52 54 5f 55 6e 69 6f 6e 20 29 7b 0a 20 20 20  SRT_Union ){.   
13d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
13e0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
13f0: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  d, nColumn, 0);.
1400: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
1410: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
1420: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
1430: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1440: 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79  (v, OP_PutStrKey
1450: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 7d  , iParm, 0);.  }
1460: 65 6c 73 65 20 0a 0a 20 20 2f 2a 20 53 74 6f 72  else ..  /* Stor
1470: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
1480: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
1490: 71 75 65 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20 20  que key..  */.  
14a0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  if( eDest==SRT_T
14b0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  able ){.    sqli
14c0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
14d0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
14e0: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 73  olumn, 0);.    s
14f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
1500: 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69  , OP_NewRecno, i
1510: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71  Parm, 0);.    sq
1520: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
1530: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
1540: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
1550: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e  ddOp(v, OP_PutIn
1560: 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b  tKey, iParm, 0);
1570: 0a 20 20 7d 65 6c 73 65 20 0a 0a 20 20 2f 2a 20  .  }else ..  /* 
1580: 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f  Construct a reco
1590: 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72  rd from the quer
15a0: 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e  y result, but in
15b0: 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a 20 73 61  stead of.  ** sa
15c0: 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64  ving that record
15d0: 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65  , use it as a ke
15e0: 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d  y to delete elem
15f0: 65 6e 74 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  ents from.  ** t
1600: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
1610: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 2a 2f 0a 20  le iParm..  */. 
1620: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
1630: 45 78 63 65 70 74 20 29 7b 0a 20 20 20 20 69 6e  Except ){.    in
1640: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56  t addr = sqliteV
1650: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
1660: 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75  akeRecord, nColu
1670: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mn, 0);.    sqli
1680: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1690: 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72  P_NotFound, iPar
16a0: 6d 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20  m, addr+3);.    
16b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
16c0: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50  v, OP_Delete, iP
16d0: 61 72 6d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  arm, 0);.  }else
16e0: 20 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72   ..  /* If we ar
16f0: 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
1700: 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
1710: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63   (SELECT ...)" c
1720: 6f 6e 73 74 72 75 63 74 2c 0a 20 20 2a 2a 20 74  onstruct,.  ** t
1730: 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64  hen there should
1740: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65   be a single ite
1750: 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
1760: 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 2a 2a   Write this.  **
1770: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
1780: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
1790: 67 75 73 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20  gus data..  */. 
17a0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
17b0: 53 65 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Set ){.    asser
17c0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
17d0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
17e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
17f0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  g, 0, 0);.    sq
1800: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
1810: 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 69   OP_PutStrKey, i
1820: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  Parm, 0);.  }els
1830: 65 20 0a 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  e ...  /* If thi
1840: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
1850: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
1860: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
1870: 6f 6e 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 74  on, then.  ** st
1880: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
1890: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
18a0: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
18b0: 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 2a  nd break out.  *
18c0: 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
18d0: 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  op..  */.  if( e
18e0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b  Dest==SRT_Mem ){
18f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f  .    assert( nCo
1900: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 73  lumn==1 );.    s
1910: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
1920: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
1930: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 73 71  Parm, 1);.    sq
1940: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
1950: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72   OP_Goto, 0, iBr
1960: 65 61 6b 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  eak);.  }else.. 
1970: 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74   /* If none of t
1980: 68 65 20 61 62 6f 76 65 2c 20 73 65 6e 64 20 74  he above, send t
1990: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63  he data to the c
19a0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
19b0: 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 73  ..  */.  {.    s
19c0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
19d0: 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e  , OP_Callback, n
19e0: 43 6f 6c 75 6d 6e 2c 20 69 42 72 65 61 6b 29 3b  Column, iBreak);
19f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1a00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
1a10: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20   inner loop was 
1a20: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
1a30: 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65  a non-null pOrde
1a40: 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  rBy argument,.**
1a50: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
1a60: 73 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e  s were placed in
1a70: 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65   a sorter.  Afte
1a80: 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65  r the loop is te
1a90: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e  rminated.** we n
1aa0: 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73  eed to run the s
1ab0: 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74  orter and output
1ac0: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
1ad0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1ae0: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
1af0: 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65  s the code neede
1b00: 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  d to do that..*/
1b10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
1b20: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 56 64  erateSortTail(Vd
1b30: 62 65 20 2a 76 2c 20 69 6e 74 20 6e 43 6f 6c 75  be *v, int nColu
1b40: 6d 6e 29 7b 0a 20 20 69 6e 74 20 65 6e 64 20 3d  mn){.  int end =
1b50: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
1b60: 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61  abel(v);.  int a
1b70: 64 64 72 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  ddr;.  sqliteVdb
1b80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
1b90: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 61 64 64 72  t, 0, 0);.  addr
1ba0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
1bb0: 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65 78  Op(v, OP_SortNex
1bc0: 74 2c 20 30 2c 20 65 6e 64 29 3b 0a 20 20 73 71  t, 0, end);.  sq
1bd0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
1be0: 20 4f 50 5f 53 6f 72 74 43 61 6c 6c 62 61 63 6b   OP_SortCallback
1bf0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 65 6e 64 29 3b  , nColumn, end);
1c00: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  .  sqliteVdbeAdd
1c10: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
1c20: 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74  , addr);.  sqlit
1c30: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
1c40: 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20 73 71 6c  l(v, end);.  sql
1c50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
1c60: 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c 20 30 2c  OP_SortReset, 0,
1c70: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   0);.}../*.** Ge
1c80: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1c90: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
1ca0: 44 42 45 20 68 6f 77 20 6d 61 6e 79 20 63 6f 6c  DBE how many col
1cb0: 75 6d 6e 73 20 74 68 65 72 65 0a 2a 2a 20 61 72  umns there.** ar
1cc0: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
1cd0: 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 66 6f 72  and the name for
1ce0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 20 20 54   each column.  T
1cf0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  his information.
1d00: 2a 2a 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ** is used to pr
1d10: 6f 76 69 64 65 20 22 61 72 67 63 22 20 61 6e 64  ovide "argc" and
1d20: 20 22 61 7a 43 6f 6c 5b 5d 22 20 76 61 6c 75 65   "azCol[]" value
1d30: 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63  s in the callbac
1d40: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 0a 76 6f  k..*/.static .vo
1d50: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
1d60: 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
1d70: 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 54  arse, IdList *pT
1d80: 61 62 4c 69 73 74 2c 20 45 78 70 72 4c 69 73 74  abList, ExprList
1d90: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 56 64 62   *pEList){.  Vdb
1da0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1db0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
1dc0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
1dd0: 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30  NamesSet || v==0
1de0: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
1df0: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
1e00: 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  n;.  pParse->col
1e10: 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20  NamesSet = 1;.  
1e20: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
1e30: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e  v, OP_ColumnCoun
1e40: 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
1e50: 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  , 0);.  for(i=0;
1e60: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
1e70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
1e80: 20 2a 70 3b 0a 20 20 20 20 69 6e 74 20 73 68 6f   *p;.    int sho
1e90: 77 46 75 6c 6c 4e 61 6d 65 73 3b 0a 20 20 20 20  wFullNames;.    
1ea0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
1eb0: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
1ec0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
1ed0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1ee0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
1ef0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
1f00: 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b  lumnName, i, 0);
1f10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
1f20: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
1f30: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
1f40: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f  Name));.      co
1f50: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1f60: 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b    p = pEList->a[
1f70: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
1f80: 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ( p==0 ) continu
1f90: 65 3b 0a 20 20 20 20 73 68 6f 77 46 75 6c 6c 4e  e;.    showFullN
1fa0: 61 6d 65 73 20 3d 20 28 70 50 61 72 73 65 2d 3e  ames = (pParse->
1fb0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1fc0: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
1fd0: 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  !=0;.    if( p->
1fe0: 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61  span.z && p->spa
1ff0: 6e 2e 7a 5b 30 5d 20 26 26 20 21 73 68 6f 77 46  n.z[0] && !showF
2000: 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ullNames ){.    
2010: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
2020: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 4f  iteVdbeAddOp(v,O
2030: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c  P_ColumnName, i,
2040: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
2050: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
2060: 20 2d 31 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20   -1, p->span.z, 
2070: 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  p->span.n);.    
2080: 20 20 73 71 6c 69 74 65 56 64 62 65 43 6f 6d 70    sqliteVdbeComp
2090: 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64  ressSpace(v, add
20a0: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  r);.    }else if
20b0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
20c0: 4d 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20 29  MN && pTabList )
20d0: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
20e0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
20f0: 61 5b 70 2d 3e 69 54 61 62 6c 65 20 2d 20 70 50  a[p->iTable - pP
2100: 61 72 73 65 2d 3e 6e 54 61 62 5d 2e 70 54 61 62  arse->nTab].pTab
2110: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  ;.      char *zC
2120: 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ol;.      int iC
2130: 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
2140: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
2150: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
2160: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
2170: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
2180: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
2190: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
21a0: 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 69  ;.      zCol = i
21b0: 43 6f 6c 3c 30 20 3f 20 22 5f 52 4f 57 49 44 5f  Col<0 ? "_ROWID_
21c0: 22 20 3a 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  " : pTab->aCol[i
21d0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
21e0: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
21f0: 6e 49 64 3e 31 20 7c 7c 20 73 68 6f 77 46 75 6c  nId>1 || showFul
2200: 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  lNames ){.      
2210: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
2220: 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  0;.        char 
2230: 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20  *zTab;. .       
2240: 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   zTab = pTabList
2250: 2d 3e 61 5b 70 2d 3e 69 54 61 62 6c 65 20 2d 20  ->a[p->iTable - 
2260: 70 50 61 72 73 65 2d 3e 6e 54 61 62 5d 2e 7a 41  pParse->nTab].zA
2270: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66  lias;.        if
2280: 28 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20  ( showFullNames 
2290: 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61  || zTab==0 ) zTa
22a0: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
22b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
22c0: 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c  etString(&zName,
22d0: 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c   zTab, ".", zCol
22e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
22f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
2300: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
2310: 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  i, 0);.        s
2320: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
2330: 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20  3(v, -1, zName, 
2340: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a  strlen(zName));.
2350: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
2360: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ee(zName);.     
2370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2380: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
2390: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  v, OP_ColumnName
23a0: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , i, 0);.       
23b0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
23c0: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 43 6f 6c 2c  eP3(v, -1, zCol,
23d0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
23e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70   }else if( p->sp
23f0: 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e  an.z && p->span.
2400: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e  z[0] ){.      in
2410: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56  t addr = sqliteV
2420: 64 62 65 41 64 64 4f 70 28 76 2c 4f 50 5f 43 6f  dbeAddOp(v,OP_Co
2430: 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b  lumnName, i, 0);
2440: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
2450: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
2460: 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73   p->span.z, p->s
2470: 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73 71  pan.n);.      sq
2480: 6c 69 74 65 56 64 62 65 43 6f 6d 70 72 65 73 73  liteVdbeCompress
2490: 53 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b 0a  Space(v, addr);.
24a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24b0: 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b   char zName[30];
24c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24d0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
24e0: 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29  || pTabList==0 )
24f0: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
2500: 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64  zName, "column%d
2510: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73  ", i+1);.      s
2520: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
2530: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  , OP_ColumnName,
2540: 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   i, 0);.      sq
2550: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
2560: 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73  (v, -1, zName, s
2570: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20  trlen(zName));. 
2580: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2590: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
25a0: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
25b0: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
25c0: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
25d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
25e0: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
25f0: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
2600: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
2610: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
2620: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
2630: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
2640: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
2650: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
2660: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
2670: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
2680: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
2690: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
26a0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
26b0: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
26c0: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
26d0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
26e0: 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn z;.}../*.** 
26f0: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
2700: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
2710: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
2720: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2730: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
2740: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
2750: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
2760: 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f  sqliteResultSetO
2770: 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  fSelect(Parse *p
2780: 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61  Parse, char *zTa
2790: 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70  bName, Select *p
27a0: 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
27b0: 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b   *pTab;.  int i;
27c0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
27d0: 69 73 74 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  ist;.  static in
27e0: 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69  t fillInColumnLi
27f0: 73 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63  st(Parse*, Selec
2800: 74 2a 29 3b 0a 0a 20 20 69 66 28 20 66 69 6c 6c  t*);..  if( fill
2810: 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61  InColumnList(pPa
2820: 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b  rse, pSelect) ){
2830: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2840: 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69   }.  pTab = sqli
2850: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
2860: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
2870: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
2880: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2890: 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54  pTab->zName = zT
28a0: 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 53  abName ? sqliteS
28b0: 74 72 44 75 70 28 7a 54 61 62 4e 61 6d 65 29 20  trDup(zTabName) 
28c0: 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  : 0;.  pEList = 
28d0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
28e0: 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  .  pTab->nCol = 
28f0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
2900: 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 73 71   pTab->aCol = sq
2910: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
2920: 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d  of(pTab->aCol[0]
2930: 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  )*pTab->nCol );.
2940: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
2950: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
2960: 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
2970: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
2980: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
2990: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
29a0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
29b0: 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  up(pEList->a[i].
29c0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
29d0: 65 20 69 66 28 20 28 70 3d 70 45 4c 69 73 74 2d  e if( (p=pEList-
29e0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70  >a[i].pExpr)->sp
29f0: 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e  an.z && p->span.
2a00: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71  z[0] ){.      sq
2a10: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
2a20: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
2a30: 61 6d 65 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20  ame, p->span.z, 
2a40: 70 2d 3e 73 70 61 6e 2e 6e 2c 20 30 29 3b 0a 20  p->span.n, 0);. 
2a50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
2a60: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 2d  op==TK_DOT && p-
2a70: 3e 70 52 69 67 68 74 20 26 26 20 70 2d 3e 70 52  >pRight && p->pR
2a80: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26  ight->token.z &&
2a90: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  .           p->p
2aa0: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  Right->token.z[0
2ab0: 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ] ){.      sqlit
2ac0: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 54 61  eSetNString(&pTa
2ad0: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
2ae0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  , .           p-
2af0: 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a  >pRight->token.z
2b00: 2c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b  , p->pRight->tok
2b10: 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 7d 65  en.n, 0);.    }e
2b20: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
2b30: 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20  zBuf[30];.      
2b40: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 63  sprintf(zBuf, "c
2b50: 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a  olumn%d", i+1);.
2b60: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
2b70: 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
2b80: 74 65 53 74 72 44 75 70 28 7a 42 75 66 29 3b 0a  teStrDup(zBuf);.
2b90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
2ba0: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
2bb0: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
2bc0: 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 67 69  /*.** For the gi
2bd0: 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65  ven SELECT state
2be0: 6d 65 6e 74 2c 20 64 6f 20 74 77 6f 20 74 68 69  ment, do two thi
2bf0: 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ngs..**.**    (1
2c00: 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  )  Fill in the p
2c10: 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61  TabList->a[].pTa
2c20: 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  b fields in the 
2c30: 49 64 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20  IdList that .** 
2c40: 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20          defines 
2c50: 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65  the set of table
2c60: 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
2c70: 20 73 63 61 6e 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a   scanned. .**.**
2c80: 20 20 20 20 28 32 29 20 20 49 66 20 74 68 65 20      (2)  If the 
2c90: 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 65 78  columns to be ex
2ca0: 74 72 61 63 74 65 64 20 76 61 72 69 61 62 6c 65  tracted variable
2cb0: 20 28 70 45 4c 69 73 74 29 20 69 73 20 4e 55 4c   (pEList) is NUL
2cc0: 4c 0a 2a 2a 20 20 20 20 20 20 20 20 20 28 6d 65  L.**         (me
2cd0: 61 6e 69 6e 67 20 74 68 61 74 20 61 20 22 2a 22  aning that a "*"
2ce0: 20 77 61 73 20 75 73 65 64 20 69 6e 20 74 68 65   was used in the
2cf0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 29 20   SQL statement) 
2d00: 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  then.**         
2d10: 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 70 45  create a fake pE
2d20: 4c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  List containing 
2d30: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
2d40: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 20 20 20 20   columns.**     
2d50: 20 20 20 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65      of all table
2d60: 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
2d70: 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  0 on success.  I
2d80: 66 20 74 68 65 72 65 20 61 72 65 20 70 72 6f 62  f there are prob
2d90: 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  lems, leave an e
2da0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
2db0: 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
2dc0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
2dd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
2de0: 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50 61  lInColumnList(Pa
2df0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
2e00: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
2e10: 2c 20 6a 2c 20 6b 3b 0a 20 20 49 64 4c 69 73 74  , j, k;.  IdList
2e20: 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
2e30: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
2e40: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a    Table *pTab;..
2e50: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d    if( p==0 || p-
2e60: 3e 70 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  >pSrc==0 ) retur
2e70: 6e 20 31 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  n 1;.  pTabList 
2e80: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
2e90: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
2ea0: 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
2eb0: 76 65 72 79 20 74 61 62 6c 65 20 69 6e 20 74 68  very table in th
2ec0: 65 20 74 61 62 6c 65 20 6c 69 73 74 2e 0a 20 20  e table list..  
2ed0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
2ee0: 70 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69  pTabList->nId; i
2ef0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61  ++){.    if( pTa
2f00: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  bList->a[i].pTab
2f10: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
2f20: 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75  s routine has ru
2f30: 6e 20 62 65 66 6f 72 65 21 20 20 4e 6f 20 6e 65  n before!  No ne
2f40: 65 64 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 2a  ed to continue *
2f50: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
2f60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2f70: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
2f80: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
2f90: 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
2fa0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2fb0: 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
2fc0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2fd0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
2fe0: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20  Select!=0 );.   
2ff0: 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
3000: 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ].pTab = pTab = 
3010: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 52  .        sqliteR
3020: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
3030: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
3040: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 0a  t->a[i].zAlias,.
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3070: 20 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74          pTabList
3080: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
3090: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
30a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
30b0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
30c0: 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 54 72        pTab->isTr
30d0: 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 20 20 20  ansient = 1;.   
30e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
30f0: 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   An ordinary tab
3100: 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
3110: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
3120: 73 65 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62  se */.      pTab
3130: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20  List->a[i].pTab 
3140: 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20  = pTab = .      
3150: 20 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c    sqliteFindTabl
3160: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  e(pParse->db, pT
3170: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  abList->a[i].zNa
3180: 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
3190: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
31a0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
31b0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
31c0: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  sg, "no such tab
31d0: 6c 65 3a 20 22 2c 20 0a 20 20 20 20 20 20 20 20  le: ", .        
31e0: 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
31f0: 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ].zName, 0);.   
3200: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
3210: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  r++;.        ret
3220: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
3230: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
3240: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
3250: 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
3260: 2e 70 53 65 6c 65 63 74 20 3d 20 70 54 61 62 2d  .pSelect = pTab-
3270: 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
3280: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
3290: 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
32a0: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
32b0: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
32c0: 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
32d0: 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
32e0: 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
32f0: 65 73 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  es.  The parser 
3300: 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
3310: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
3320: 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
3330: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  LL operator for 
3340: 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74  each "*" that it
3350: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
3360: 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20  lumn list..  ** 
3370: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
3380: 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c  de just has to l
3390: 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c  ocate the TK_ALL
33a0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
33b0: 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63   expand.  ** eac
33c0: 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
33d0: 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
33e0: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   in all tables..
33f0: 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
3400: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
3410: 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   k++){.    if( p
3420: 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70  EList->a[k].pExp
3430: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20  r->op==TK_ALL ) 
3440: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
3450: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
3460: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
3470: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20  xprList_item *a 
3480: 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
3490: 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20   ExprList *pNew 
34a0: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30  = 0;.    for(k=0
34b0: 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
34c0: 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; k++){.      i
34d0: 66 28 20 61 5b 6b 5d 2e 70 45 78 70 72 2d 3e 6f  f( a[k].pExpr->o
34e0: 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
34f0: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
3500: 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  teExprListAppend
3510: 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70  (pNew, a[k].pExp
3520: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  r, 0);.        p
3530: 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
3540: 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b  pr-1].zName = a[
3550: 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  k].zName;.      
3560: 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30    a[k].pExpr = 0
3570: 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a  ;.        a[k].z
3580: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
3590: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
35a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
35b0: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
35c0: 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
35d0: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
35e0: 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[i].pTab;.    
35f0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
3600: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
3610: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  ){.            E
3620: 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65  xpr *pExpr, *pLe
3630: 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20  ft, *pRight;.   
3640: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
3650: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
3660: 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ID, 0, 0, 0);.  
3670: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
3680: 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ight==0 ) break;
3690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
36a0: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 70  ght->token.z = p
36b0: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
36c0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
36d0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 20  pRight->token.n 
36e0: 3d 20 73 74 72 6c 65 6e 28 70 54 61 62 2d 3e 61  = strlen(pTab->a
36f0: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col[j].zName);. 
3700: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
3710: 54 61 62 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  Tab->zName ){.  
3720: 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
3730: 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  t = sqliteExpr(T
3740: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
3760: 28 20 70 4c 65 66 74 3d 3d 30 20 29 20 62 72 65  ( pLeft==0 ) bre
3770: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
3780: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
3790: 61 5b 69 5d 2e 7a 41 6c 69 61 73 20 26 26 20 70  a[i].zAlias && p
37a0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  TabList->a[i].zA
37b0: 6c 69 61 73 5b 30 5d 20 29 7b 0a 20 20 20 20 20  lias[0] ){.     
37c0: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
37d0: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 70 54 61 62  ->token.z = pTab
37e0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
37f0: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s;.             
3800: 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e     pLeft->token.
3810: 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 61 62 4c  n = strlen(pTabL
3820: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73  ist->a[i].zAlias
3830: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3840: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3850: 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74          pLeft->t
3860: 6f 6b 65 6e 2e 7a 20 3d 20 70 54 61 62 2d 3e 7a  oken.z = pTab->z
3870: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
3880: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b        pLeft->tok
3890: 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54  en.n = strlen(pT
38a0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
38b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
38c0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
38d0: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
38e0: 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  DOT, pLeft, pRig
38f0: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
3900: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 3d        if( pExpr=
3910: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
3920: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
3930: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
3940: 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
3950: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
3960: 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e  ->span = pExpr->
3970: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20  token;.         
3980: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
3990: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 45 78   pNew = sqliteEx
39a0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65  prListAppend(pNe
39b0: 77 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  w, pExpr, 0);.  
39c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
39d0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
39e0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72  }.    sqliteExpr
39f0: 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73  ListDelete(pELis
3a00: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73  t);.    p->pELis
3a10: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  t = pNew;.  }.  
3a20: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
3a30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3a40: 61 73 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69  associates entri
3a50: 65 73 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  es in an ORDER B
3a60: 59 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  Y expression lis
3a70: 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e  t with.** column
3a80: 73 20 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20  s in a result.  
3a90: 46 6f 72 20 65 61 63 68 20 4f 52 44 45 52 20 42  For each ORDER B
3aa0: 59 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  Y expression, th
3ab0: 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74  e opcode of.** t
3ac0: 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64  he top-level nod
3ad0: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
3ae0: 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68  TK_COLUMN and th
3af0: 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  e iColumn value 
3b00: 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65  of.** the top-le
3b10: 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c  vel node is fill
3b20: 65 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d  ed in with colum
3b30: 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  n number and the
3b40: 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65   iTable.** value
3b50: 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65   of the top-leve
3b60: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
3b70: 20 77 69 74 68 20 69 54 61 62 6c 65 20 70 61 72   with iTable par
3b80: 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ameter..**.** If
3b90: 20 74 68 65 72 65 20 61 72 65 20 70 72 69 6f 72   there are prior
3ba0: 20 53 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c   SELECT clauses,
3bb0: 20 74 68 65 79 20 61 72 65 20 70 72 6f 63 65 73   they are proces
3bc0: 73 65 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61  sed first.  A ma
3bd0: 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72  tch.** in an ear
3be0: 6c 69 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65  lier SELECT take
3bf0: 73 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  s precedence ove
3c00: 72 20 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54  r a later SELECT
3c10: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72  ..**.** Any entr
3c20: 79 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  y that does not 
3c30: 6d 61 74 63 68 20 69 73 20 66 6c 61 67 67 65 64  match is flagged
3c40: 20 61 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54   as an error.  T
3c50: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
3c60: 65 72 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e  errors is return
3c70: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
3c80: 74 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  t matchOrderbyTo
3c90: 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
3ca0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
3cb0: 20 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20    /* A place to 
3cc0: 6c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  leave error mess
3cd0: 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ages */.  Select
3ce0: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
3cf0: 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65    /* Match to re
3d00: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  sult columns of 
3d10: 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  this SELECT */. 
3d20: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
3d30: 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rBy,     /* The 
3d40: 4f 52 44 45 52 20 42 59 20 76 61 6c 75 65 73 20  ORDER BY values 
3d50: 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  to match against
3d60: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
3d70: 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
3d80: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
3d90: 74 68 69 73 20 74 68 69 73 20 76 61 6c 75 65 20  this this value 
3da0: 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69  in iTable */.  i
3db0: 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  nt mustComplete 
3dc0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55         /* If TRU
3dd0: 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20  E all ORDER BYs 
3de0: 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b  must match */.){
3df0: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
3e00: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45  .  int i, j;.  E
3e10: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
3e20: 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d  ..  if( pSelect=
3e30: 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d  =0 || pOrderBy==
3e40: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
3e50: 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65  if( mustComplete
3e60: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
3e70: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
3e80: 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72  pr; i++){ pOrder
3e90: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20  By->a[i].done = 
3ea0: 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66  0; }.  }.  if( f
3eb0: 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28  illInColumnList(
3ec0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
3ed0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
3ee0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c  ;.  }.  if( pSel
3ef0: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ect->pPrior ){. 
3f00: 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65     if( matchOrde
3f10: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
3f20: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  se, pSelect->pPr
3f30: 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69  ior, pOrderBy, i
3f40: 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20  Table, 0) ){.   
3f50: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3f60: 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
3f70: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
3f80: 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
3f90: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
3fa0: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
3fb0: 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  *pE = pOrderBy->
3fc0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
3fd0: 69 6e 74 20 6d 61 74 63 68 20 3d 20 30 3b 0a 20  int match = 0;. 
3fe0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d     if( pOrderBy-
3ff0: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e  >a[i].done ) con
4000: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a  tinue;.    for(j
4010: 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; j<pEList->nE
4020: 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
4030: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a   if( pEList->a[j
4040: 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e  ].zName && (pE->
4050: 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d  op==TK_ID || pE-
4060: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20  >op==TK_STRING) 
4070: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
4080: 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b  *zName, *zLabel;
4090: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
40a0: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e   pEList->a[j].zN
40b0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ame;.        ass
40c0: 65 72 74 28 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a  ert( pE->token.z
40d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61 62   );.        zLab
40e0: 65 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  el = sqliteStrND
40f0: 75 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  up(pE->token.z, 
4100: 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pE->token.n);.  
4110: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75        sqliteDequ
4120: 6f 74 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20  ote(zLabel);.   
4130: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53       if( sqliteS
4140: 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c  trICmp(zName, zL
4150: 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20  abel)==0 ){ .   
4160: 20 20 20 20 20 20 20 6d 61 74 63 68 20 3d 20 31         match = 1
4170: 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
4180: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
4190: 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d  zLabel);.      }
41a0: 0a 20 20 20 20 20 20 69 66 28 20 6d 61 74 63 68  .      if( match
41b0: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 45 78 70  ==0 && sqliteExp
41c0: 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c  rCompare(pE, pEL
41d0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29  ist->a[j].pExpr)
41e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63   ){.        matc
41f0: 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  h = 1;.      }. 
4200: 20 20 20 20 20 69 66 28 20 6d 61 74 63 68 20 29       if( match )
4210: 7b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 6f 70  {.        pE->op
4220: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
4230: 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
4240: 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 70  n = j;.        p
4250: 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  E->iTable = iTab
4260: 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  le;.        pOrd
4270: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
4280: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
4290: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
42a0: 7d 0a 20 20 20 20 69 66 28 20 21 6d 61 74 63 68  }.    if( !match
42b0: 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65   && mustComplete
42c0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a   ){.      char z
42d0: 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73  Buf[30];.      s
42e0: 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 22  printf(zBuf,"%d"
42f0: 2c 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ,i+1);.      sql
4300: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
4310: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
4320: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75  ORDER BY term nu
4330: 6d 62 65 72 20 22 2c 20 7a 42 75 66 2c 20 0a 20  mber ", zBuf, . 
4340: 20 20 20 20 20 20 20 22 20 64 6f 65 73 20 6e 6f         " does no
4350: 74 20 6d 61 74 63 68 20 61 6e 79 20 72 65 73 75  t match any resu
4360: 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  lt column", 0);.
4370: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
4380: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 6e 45 72 72  rr++;.      nErr
4390: 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ++;.      break;
43a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
43b0: 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f  urn nErr;  .}../
43c0: 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20  *.** Get a VDBE 
43d0: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
43e0: 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43  rser context.  C
43f0: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
4400: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
4410: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
4420: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
4430: 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73   and leave a mes
4440: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
4450: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 47  */.Vdbe *sqliteG
4460: 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
4470: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
4480: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
4490: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
44a0: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
44b0: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 56 64  pVdbe = sqliteVd
44c0: 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d  beCreate(pParse-
44d0: 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >db);.  }.  retu
44e0: 72 6e 20 76 3b 0a 7d 0a 20 20 20 20 0a 0a 2f 2a  rn v;.}.    ../*
44f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4500: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
4510: 6f 63 65 73 73 20 61 20 71 75 65 72 79 20 74 68  ocess a query th
4520: 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65  at is really the
4530: 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74   union.** or int
4540: 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f  ersection of two
4550: 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
4560: 65 20 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74  e queries..*/.st
4570: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
4580: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
4590: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
45a0: 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50  nt eDest, int iP
45b0: 61 72 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  arm){.  int rc; 
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
45d0: 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
45e0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
45f0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
4600: 72 3b 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65  r;     /* Anothe
4610: 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
4620: 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
4630: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
4640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
4650: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
4660: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
4670: 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20   base;          
4680: 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20 76 61 6c   /* Baseline val
4690: 75 65 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 6e  ue for pParse->n
46a0: 54 61 62 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b  Tab */..  /* Mak
46b0: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
46c0: 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
46d0: 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
46e0: 43 54 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 0a  CTs.  Only the .
46f0: 20 20 2a 2a 20 6c 61 73 74 20 53 45 4c 45 43 54    ** last SELECT
4700: 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
4710: 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
4720: 20 42 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   BY..  */.  if( 
4730: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f  p==0 || p->pPrio
4740: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  r==0 ) return 1;
4750: 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
4760: 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 50 72  Prior;.  if( pPr
4770: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ior->pOrderBy ){
4780: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
4790: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
47a0: 72 72 4d 73 67 2c 22 4f 52 44 45 52 20 42 59 20  rrMsg,"ORDER BY 
47b0: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
47c0: 6d 65 20 61 66 74 65 72 20 22 2c 0a 20 20 20 20  me after ",.    
47d0: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
47e0: 2d 3e 6f 70 29 2c 20 22 20 6e 6f 74 20 62 65 66  ->op), " not bef
47f0: 6f 72 65 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  ore", 0);.    pP
4800: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
4810: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
4820: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
4830: 77 65 20 68 61 76 65 20 61 20 76 61 6c 69 64 20  we have a valid 
4840: 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49  query engine.  I
4850: 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20  f not, create a 
4860: 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  new one..  */.  
4870: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
4880: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
4890: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31   v==0 ) return 1
48a0: 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  ;..  /* Process 
48b0: 74 68 65 20 55 4e 49 4f 4e 20 6f 72 20 49 4e 54  the UNION or INT
48c0: 45 52 53 45 43 54 49 4f 4e 0a 20 20 2a 2f 0a 20  ERSECTION.  */. 
48d0: 20 62 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e   base = pParse->
48e0: 6e 54 61 62 3b 0a 20 20 73 77 69 74 63 68 28 20  nTab;.  switch( 
48f0: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
4900: 65 20 54 4b 5f 41 4c 4c 3a 0a 20 20 20 20 63 61  e TK_ALL:.    ca
4910: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20  se TK_EXCEPT:.  
4920: 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
4930: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69   {.      int uni
4940: 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72  onTab;    /* Cur
4950: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
4960: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
4970: 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  e holding result
4980: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   */.      int op
4990: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ;          /* On
49a0: 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70  e of the SRT_ op
49b0: 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c  erations to appl
49c0: 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20  y to self */.   
49d0: 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20     int priorOp; 
49e0: 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20      /* The SRT_ 
49f0: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70  operation to app
4a00: 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65  ly to prior sele
4a10: 63 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20 70 72  cts */..      pr
4a20: 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54  iorOp = p->op==T
4a30: 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c  K_ALL ? SRT_Tabl
4a40: 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  e : SRT_Union;. 
4a50: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
4a60: 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
4a70: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
4a80: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
4a90: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
4aa0: 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
4ab0: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
4ac0: 68 74 2e 20 20 54 68 69 73 20 61 6c 73 6f 20 6d  ht.  This also m
4ad0: 65 61 6e 73 20 77 65 20 61 72 65 20 6e 6f 74 20  eans we are not 
4ae0: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73  the right-most s
4af0: 65 6c 65 63 74 20 61 6e 64 20 73 6f 0a 20 20 20  elect and so.   
4b00: 20 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f       ** we canno
4b10: 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  t have an ORDER 
4b20: 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  BY clause.      
4b30: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
4b40: 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20  onTab = iParm;. 
4b50: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
4b60: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
4b70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4b80: 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
4b90: 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
4ba0: 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
4bb0: 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
4bc0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
4bd0: 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
4be0: 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
4bf0: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
4c00: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
4c10: 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  +;.        if( p
4c20: 2d 3e 70 4f 72 64 65 72 42 79 20 0a 20 20 20 20  ->pOrderBy .    
4c30: 20 20 20 20 26 26 20 6d 61 74 63 68 4f 72 64 65      && matchOrde
4c40: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
4c50: 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72  se, p, p->pOrder
4c60: 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29  By, unionTab, 1)
4c70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
4c80: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
4c90: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
4ca0: 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20  >op!=TK_ALL ){. 
4cb0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
4cc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
4cd0: 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61  penTemp, unionTa
4ce0: 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  b, 1);.         
4cf0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4d00: 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61  (v, OP_KeyAsData
4d10: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a  , unionTab, 1);.
4d20: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
4d30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
4d40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
4d50: 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61  penTemp, unionTa
4d60: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, 0);.        }
4d70: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
4d80: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
4d90: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
4da0: 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20   our left.      
4db0: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
4dc0: 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73  liteSelect(pPars
4dd0: 65 2c 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72  e, pPrior, prior
4de0: 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20  Op, unionTab);. 
4df0: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
4e00: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
4e10: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
4e20: 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
4e30: 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
4e40: 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f      switch( p->o
4e50: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61  p ){.         ca
4e60: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f  se TK_EXCEPT:  o
4e70: 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20  p = SRT_Except; 
4e80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4e90: 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
4ea0: 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f     op = SRT_Unio
4eb0: 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  n;    break;.   
4ec0: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c        case TK_AL
4ed0: 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f  L:     op = SRT_
4ee0: 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b  Table;    break;
4ef0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
4f00: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
4f10: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53      rc = sqliteS
4f20: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
4f30: 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a   op, unionTab);.
4f40: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
4f50: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
4f60: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
4f70: 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  rc;..      /* Co
4f80: 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69  nvert the data i
4f90: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
4fa0: 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65  table into whate
4fb0: 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a  ver form.      *
4fc0: 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20  * it is that we 
4fd0: 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a  currently need..
4fe0: 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20        */      . 
4ff0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 21 3d       if( eDest!=
5000: 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
5010: 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
5020: 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
5030: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
5040: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
5050: 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
5060: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
5070: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
5080: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
5090: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
50a0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
50b0: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62  Cont = sqliteVdb
50c0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
50d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
50e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
50f0: 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
5100: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
5110: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 56  iStart = sqliteV
5120: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
5130: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
5140: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
5150: 70 50 61 72 73 65 2c 20 30 2c 20 75 6e 69 6f 6e  pParse, 0, union
5160: 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Tab, p->pEList->
5170: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c      p->pOrderBy,
51a0: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
51b0: 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
51e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
51f0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
5200: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
5210: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
5220: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
5230: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5240: 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54   OP_Next, unionT
5250: 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  ab, iStart);.   
5260: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
5270: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
5280: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
5290: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
52a0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
52b0: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
52c0: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
52d0: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
52e0: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
52f0: 28 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  (v, p->pEList->n
5300: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
5310: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5320: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5330: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
5340: 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  T: {.      int t
5350: 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20  ab1, tab2;.     
5360: 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
5370: 61 6b 2c 20 69 53 74 61 72 74 3b 0a 0a 20 20 20  ak, iStart;..   
5380: 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20     /* INTERSECT 
5390: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
53a0: 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e  m the others sin
53b0: 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20  ce it requires. 
53c0: 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70       ** two temp
53d0: 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48  orary tables.  H
53e0: 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20  ence it has its 
53f0: 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e  own case.  Begin
5400: 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c  .      ** by all
5410: 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c  ocating the tabl
5420: 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e  es we will need.
5430: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5440: 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
5450: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62  Tab++;.      tab
5460: 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  2 = pParse->nTab
5470: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
5480: 3e 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74  >pOrderBy && mat
5490: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
54a0: 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e 70 4f  n(pParse,p,p->pO
54b0: 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29 20 29  rderBy,tab1,1) )
54c0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
54d0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
54e0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
54f0: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
5500: 2c 20 74 61 62 31 2c 20 31 29 3b 0a 20 20 20 20  , tab1, 1);.    
5510: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5520: 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74  p(v, OP_KeyAsDat
5530: 61 2c 20 74 61 62 31 2c 20 31 29 3b 0a 0a 20 20  a, tab1, 1);..  
5540: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
5550: 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c  SELECTs to our l
5560: 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  eft into tempora
5570: 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e  ry table "tab1".
5580: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5590: 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63  rc = sqliteSelec
55a0: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
55b0: 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
55c0: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
55d0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
55e0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
55f0: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
5600: 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
5610: 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
5620: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
5630: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5640: 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 32 2c  _OpenTemp, tab2,
5650: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
5660: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5670: 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62 32  _KeyAsData, tab2
5680: 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  , 1);.      p->p
5690: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
56a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
56b0: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53 52  ct(pParse, p, SR
56c0: 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 29 3b 0a  T_Union, tab2);.
56d0: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
56e0: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
56f0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
5700: 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  rc;..      /* Ge
5710: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
5720: 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
5730: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
5740: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
5750: 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
5760: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
5770: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
5780: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
5790: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
57a0: 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a   0, p->pEList);.
57b0: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
57c0: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
57d0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
57e0: 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nt = sqliteVdbeM
57f0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
5800: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5810: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
5820: 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a   tab1, iBreak);.
5830: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
5840: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5850: 2c 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61  , OP_FullKey, ta
5860: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b1, 0);.      sq
5870: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5880: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
5890: 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  b2, iCont);.    
58a0: 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e    rc = selectInn
58b0: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 30  erLoop(pParse, 0
58c0: 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73  , tab1, p->pELis
58d0: 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  t->nExpr,.      
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58f0: 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72         p->pOrder
5900: 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69  By, -1, eDest, i
5910: 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20  Parm, .         
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5930: 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61      iCont, iBrea
5940: 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
5950: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
5960: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
5970: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
5980: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
5990: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
59a0: 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
59b0: 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
59c0: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
59d0: 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
59e0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
59f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
5a00: 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
5a10: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5a20: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  p(v, OP_Close, t
5a30: 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ab1, 0);.      i
5a40: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
5a50: 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61  {.        genera
5a60: 74 65 53 6f 72 74 54 61 69 6c 28 76 2c 20 70 2d  teSortTail(v, p-
5a70: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
5a80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5a90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
5aa0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
5ab0: 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
5ac0: 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70  EList );.  if( p
5ad0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
5ae0: 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d  =pPrior->pEList-
5af0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
5b00: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
5b10: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
5b20: 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
5b30: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
5b40: 66 20 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  f ",.      selec
5b50: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 2c 20  tOpName(p->op), 
5b60: 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68  " do not have th
5b70: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
5b80: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22   result columns"
5b90: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
5ba0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
5bb0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 50  turn 1;.  }.  pP
5bc0: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 62 61 73  arse->nTab = bas
5bd0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  e;.  return 0;.}
5be0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
5bf0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
5c00: 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e 20 61  ment passed in a
5c10: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
5c20: 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73   see if it.** is
5c30: 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20   a simple min() 
5c40: 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20  or max() query. 
5c50: 20 49 66 20 69 74 20 69 73 20 61 6e 64 20 74 68   If it is and th
5c60: 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 0a  is query can be.
5c70: 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75 73 69  ** satisfied usi
5c80: 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65 65 6b  ng a single seek
5c90: 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
5ca0: 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20 69  g or end of an i
5cb0: 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65  ndex,.** then ge
5cc0: 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20  nerate the code 
5cd0: 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20  for this SELECT 
5ce0: 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74 68  return 1.  If th
5cf0: 69 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20  is is not a .** 
5d00: 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
5d10: 6d 61 78 28 29 20 71 75 65 72 79 2c 20 74 68 65  max() query, the
5d20: 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a  n return 0;.**.*
5d30: 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29  * A simply min()
5d40: 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 20   or max() query 
5d50: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
5d60: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
5d70: 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61 62   min(a) FROM tab
5d80: 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  le;.**    SELECT
5d90: 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61 62   max(a) FROM tab
5da0: 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75  le;.**.** The qu
5db0: 65 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c  ery may have onl
5dc0: 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
5dd0: 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72 67   in its FROM arg
5de0: 75 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a  ument.  There.**
5df0: 20 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50   can be no GROUP
5e00: 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f 72   BY or HAVING or
5e10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20   WHERE clauses. 
5e20: 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
5e30: 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d  must.** be the m
5e40: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f 66  in() or max() of
5e50: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
5e60: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20   of the table.  
5e70: 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e  The column.** in
5e80: 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
5e90: 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  x() function mus
5ea0: 74 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a  t be indexed..**
5eb0: 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65  .** The paramete
5ec0: 72 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  rs to this routi
5ed0: 6e 65 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ne are the same 
5ee0: 61 73 20 66 6f 72 20 73 71 6c 69 74 65 53 65 6c  as for sqliteSel
5ef0: 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68  ect()..** See th
5f00: 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
5f10: 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65   on that routine
5f20: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
5f30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
5f40: 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d 70 6c  static int simpl
5f50: 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72  eMinMaxQuery(Par
5f60: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
5f70: 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65 73 74  ct *p, int eDest
5f80: 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
5f90: 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 69  Expr *pExpr;.  i
5fa0: 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65  nt iCol;.  Table
5fb0: 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
5fc0: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62 61 73  *pIdx;.  int bas
5fd0: 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  e;.  Vdbe *v;.  
5fe0: 69 6e 74 20 6f 70 65 6e 4f 70 3b 0a 20 20 69 6e  int openOp;.  in
5ff0: 74 20 73 65 65 6b 4f 70 3b 0a 20 20 69 6e 74 20  t seekOp;.  int 
6000: 63 6f 6e 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  cont;.  ExprList
6010: 20 65 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74   eList;.  struct
6020: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 65   ExprList_item e
6030: 4c 69 73 74 49 74 65 6d 3b 0a 0a 20 20 2f 2a 20  ListItem;..  /* 
6040: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
6050: 74 68 69 73 20 71 75 65 72 79 20 69 73 20 61 20  this query is a 
6060: 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
6070: 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 52 65  max() query.  Re
6080: 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69  turn.  ** zero i
6090: 66 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20  f it is  not..  
60a0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f  */.  if( p->pGro
60b0: 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69  upBy || p->pHavi
60c0: 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20  ng || p->pWhere 
60d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
60e0: 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 49 64 21 3d  ( p->pSrc->nId!=
60f0: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
6100: 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
6110: 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
6120: 20 30 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d   0;.  pExpr = p-
6130: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
6140: 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  xpr;.  if( pExpr
6150: 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
6160: 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30  CTION ) return 0
6170: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ;.  if( pExpr->p
6180: 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 78 70 72  List==0 || pExpr
6190: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ->pList->nExpr!=
61a0: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
61b0: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
61c0: 6d 6e 21 3d 46 4e 5f 4d 69 6e 20 26 26 20 70 45  mn!=FN_Min && pE
61d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 46 4e  xpr->iColumn!=FN
61e0: 5f 4d 61 78 20 29 20 72 65 74 75 72 6e 20 30 3b  _Max ) return 0;
61f0: 0a 20 20 73 65 65 6b 4f 70 20 3d 20 70 45 78 70  .  seekOp = pExp
6200: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 46 4e 5f 4d  r->iColumn==FN_M
6210: 69 6e 20 3f 20 4f 50 5f 52 65 77 69 6e 64 20 3a  in ? OP_Rewind :
6220: 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 70 45 78 70   OP_Last;.  pExp
6230: 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  r = pExpr->pList
6240: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
6250: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
6260: 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
6270: 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45  n 0;.  iCol = pE
6280: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
6290: 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
62a0: 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a  a[0].pTab;..  /*
62b0: 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 68 65   If we get to he
62c0: 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  re, it means the
62d0: 20 71 75 65 72 79 20 69 73 20 6f 66 20 74 68 65   query is of the
62e0: 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20   correct form.. 
62f0: 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   ** Check to mak
6300: 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
6310: 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65  n index and make
6320: 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20 74   pIdx point to t
6330: 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72 69  he.  ** appropri
6340: 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20 74  ate index.  If t
6350: 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
6360: 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47  ) is on an INTEG
6370: 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20  ER PRIMARY.  ** 
6380: 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69  key column, no i
6390: 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73 61 72  ndex is necessar
63a0: 79 20 73 6f 20 73 65 74 20 70 49 64 78 20 74 6f  y so set pIdx to
63b0: 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20   NULL.  If no.  
63c0: 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78 20  ** usable index 
63d0: 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  is found, return
63e0: 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69   0..  */.  if( i
63f0: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49 64  Col<0 ){.    pId
6400: 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  x = 0;.  }else{.
6410: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
6420: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
6430: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
6440: 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
6450: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
6460: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
6470: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
6480: 5d 3d 3d 69 43 6f 6c 20 29 20 62 72 65 61 6b 3b  ]==iCol ) break;
6490: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
64a0: 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Idx==0 ) return 
64b0: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65  0;.  }..  /* Ide
64c0: 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ntify column nam
64d0: 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65  es if we will be
64e0: 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c 6c 62   using the callb
64f0: 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ack.  This.  ** 
6500: 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20  step is skipped 
6510: 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  if the output is
6520: 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c   going to a tabl
6530: 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65  e or a memory ce
6540: 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  ll..  */.  v = s
6550: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
6560: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
6570: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
6580: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
6590: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65  llback ){.    ge
65a0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
65b0: 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72  s(pParse, p->pSr
65c0: 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  c, p->pEList);. 
65d0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
65e0: 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64  ing code to find
65f0: 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20   the min or the 
6600: 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20  max.  Basically 
6610: 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  all we have.  **
6620: 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74   to do is find t
6630: 68 65 20 66 69 72 73 74 20 6f 72 20 74 68 65 20  he first or the 
6640: 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
6650: 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20  e chosen index. 
6660: 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e   If.  ** the min
6670: 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
6680: 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  n the INTEGER PR
6690: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
66a0: 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20  find the first. 
66b0: 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72   ** or last entr
66c0: 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  y in the main ta
66d0: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
66e0: 21 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56  !pParse->schemaV
66f0: 65 72 69 66 69 65 64 20 26 26 20 28 70 50 61 72  erified && (pPar
6700: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
6710: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d  SQLITE_InTrans)=
6720: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
6730: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6740: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 70 50  VerifyCookie, pP
6750: 61 72 73 65 2d 3e 64 62 2d 3e 73 63 68 65 6d 61  arse->db->schema
6760: 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20  _cookie, 0);.   
6770: 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56   pParse->schemaV
6780: 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d  erified = 1;.  }
6790: 0a 20 20 6f 70 65 6e 4f 70 20 3d 20 70 54 61 62  .  openOp = pTab
67a0: 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70  ->isTemp ? OP_Op
67b0: 65 6e 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 3b  enAux : OP_Open;
67c0: 0a 20 20 62 61 73 65 20 3d 20 70 50 61 72 73 65  .  base = pParse
67d0: 2d 3e 6e 54 61 62 3b 0a 20 20 73 71 6c 69 74 65  ->nTab;.  sqlite
67e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 65  VdbeAddOp(v, ope
67f0: 6e 4f 70 2c 20 62 61 73 65 2c 20 70 54 61 62 2d  nOp, base, pTab-
6800: 3e 74 6e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65  >tnum);.  sqlite
6810: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
6820: 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  -1, pTab->zName,
6830: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 69   P3_STATIC);.  i
6840: 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20  f( pIdx==0 ){.  
6850: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6860: 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73  p(v, seekOp, bas
6870: 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e, 0);.  }else{.
6880: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6890: 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 62  dOp(v, openOp, b
68a0: 61 73 65 2b 31 2c 20 70 49 64 78 2d 3e 74 6e 75  ase+1, pIdx->tnu
68b0: 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  m);.    sqliteVd
68c0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
68d0: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50  , pIdx->zName, P
68e0: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  3_STATIC);.    s
68f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6900: 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2b 31  , seekOp, base+1
6910: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6920: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6930: 49 64 78 52 65 63 6e 6f 2c 20 62 61 73 65 2b 31  IdxRecno, base+1
6940: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6950: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6960: 43 6c 6f 73 65 2c 20 62 61 73 65 2b 31 2c 20 30  Close, base+1, 0
6970: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
6980: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
6990: 65 54 6f 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  eTo, base, 0);. 
69a0: 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72   }.  eList.nExpr
69b0: 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 1;.  memset(&
69c0: 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69  eListItem, 0, si
69d0: 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29  zeof(eListItem))
69e0: 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65  ;.  eList.a = &e
69f0: 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73  ListItem;.  eLis
6a00: 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70  t.a[0].pExpr = p
6a10: 45 78 70 72 3b 0a 20 20 63 6f 6e 74 20 3d 20 73  Expr;.  cont = s
6a20: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
6a30: 65 6c 28 76 29 3b 0a 20 20 73 65 6c 65 63 74 49  el(v);.  selectI
6a40: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
6a50: 20 26 65 4c 69 73 74 2c 20 62 61 73 65 2c 20 31   &eList, base, 1
6a60: 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  , 0, -1, eDest, 
6a70: 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e  iParm, cont, con
6a80: 74 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65  t);.  sqliteVdbe
6a90: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
6aa0: 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 56  cont);.  sqliteV
6ab0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
6ac0: 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a  lose, base, 0);.
6ad0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
6ae0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
6af0: 64 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  de for the given
6b00: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6b10: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  t..**.** The res
6b20: 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62  ults are distrib
6b30: 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20  uted in various 
6b40: 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  ways depending o
6b50: 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  n the.** value o
6b60: 66 20 65 44 65 73 74 20 61 6e 64 20 69 50 61 72  f eDest and iPar
6b70: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65  m..**.**     eDe
6b80: 73 74 20 56 61 6c 75 65 20 20 20 20 20 20 20 52  st Value       R
6b90: 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d  esult.**     ---
6ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
6bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bd0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
6be0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20  SRT_Callback    
6bf0: 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62  Invoke the callb
6c00: 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77  ack for each row
6c10: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   of the result..
6c20: 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65  **.**     SRT_Me
6c30: 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20  m         Store 
6c40: 66 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20  first result in 
6c50: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72  memory cell iPar
6c60: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
6c70: 53 65 74 20 20 20 20 20 20 20 20 20 53 74 6f 72  Set         Stor
6c80: 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79  e results as key
6c90: 73 20 6f 66 20 61 20 74 61 62 6c 65 20 77 69 74  s of a table wit
6ca0: 68 20 63 75 72 73 6f 72 20 69 50 61 72 6d 0a 2a  h cursor iParm.*
6cb0: 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69  *.**     SRT_Uni
6cc0: 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  on       Store r
6cd0: 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20  esults as a key 
6ce0: 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
6cf0: 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  able iParm.**.**
6d00: 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20       SRT_Except 
6d10: 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75       Remove resu
6d20: 6c 74 73 20 66 6f 72 6d 20 74 68 65 20 74 65 6d  lts form the tem
6d30: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
6d40: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
6d50: 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74  T_Table       St
6d60: 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ore results in t
6d70: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
6d80: 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Parm.**.** This 
6d90: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
6da0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
6db0: 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
6dc0: 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
6dd0: 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
6de0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
6df0: 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
6e00: 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
6e10: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
6e20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
6e30: 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
6e40: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
6e50: 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
6e60: 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
6e70: 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
6e80: 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  that..*/.int sql
6e90: 69 74 65 53 65 6c 65 63 74 28 0a 20 20 50 61 72  iteSelect(.  Par
6ea0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
6eb0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
6ec0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
6ed0: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
6ee0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
6ef0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
6f00: 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
6f10: 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
6f20: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
6f30: 3a 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 4d  : SRT_Callback M
6f40: 65 6d 20 53 65 74 20 55 6e 69 6f 6e 20 45 78 63  em Set Union Exc
6f50: 65 70 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ept */.  int iPa
6f60: 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
6f70: 2f 2a 20 53 61 76 65 20 72 65 73 75 6c 74 20 69  /* Save result i
6f80: 6e 20 74 68 69 73 20 6d 65 6d 6f 72 79 20 6c 6f  n this memory lo
6f90: 63 61 74 69 6f 6e 2c 20 69 66 20 3e 3d 30 20 2a  cation, if >=0 *
6fa0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
6fb0: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
6fc0: 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  o;.  Vdbe *v;.  
6fd0: 69 6e 74 20 69 73 41 67 67 20 3d 20 30 3b 20 20  int isAgg = 0;  
6fe0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
6ff0: 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
7000: 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
7010: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
7020: 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  EList;      /* L
7030: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
7040: 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
7050: 49 64 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  IdList *pTabList
7060: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
7070: 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
7080: 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
7090: 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
70a0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
70b0: 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
70c0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
70d0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
70e0: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
70f0: 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
7100: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
7110: 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
7120: 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
7130: 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
7140: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
7150: 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
7160: 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
7170: 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
7180: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
7190: 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  isDistinct;     
71a0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
71b0: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
71c0: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
71d0: 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b  .  int distinct;
71e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
71f0: 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  le to use for th
7200: 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a  e distinct set *
7210: 2f 0a 20 20 69 6e 74 20 62 61 73 65 3b 20 20 20  /.  int base;   
7220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
7230: 72 73 74 20 63 75 72 73 6f 72 20 61 76 61 69 6c  rst cursor avail
7240: 61 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a  able for use */.
7250: 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20    int rc = 1;   
7260: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
7270: 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d  e to return from
7280: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
7290: 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f  /..  if( sqlite_
72a0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c  malloc_failed ||
72b0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
72c0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31   p==0 ) return 1
72d0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
72e0: 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e   is are a sequen
72f0: 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64  ce of queries, d
7300: 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e  o the earlier on
7310: 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20  es first..  */. 
7320: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
7330: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  {.    return mul
7340: 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
7350: 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d   p, eDest, iParm
7360: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  );.  }..  /* Mak
7370: 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f  e local copies o
7380: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
7390: 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e   for this query.
73a0: 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74  .  */.  pTabList
73b0: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57   = p->pSrc;.  pW
73c0: 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
73d0: 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
73e0: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 47  ->pOrderBy;.  pG
73f0: 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
7400: 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20  upBy;.  pHaving 
7410: 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
7420: 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
7430: 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f  isDistinct;..  /
7440: 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
7450: 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72  nt value of pPar
7460: 73 65 2d 3e 6e 54 61 62 2e 20 20 52 65 73 74 6f  se->nTab.  Resto
7470: 72 65 20 74 68 69 73 20 76 61 6c 75 65 20 62 65  re this value be
7480: 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20 65 78 69  fore.  ** we exi
7490: 74 2e 0a 20 20 2a 2f 0a 20 20 62 61 73 65 20 3d  t..  */.  base =
74a0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 0a   pParse->nTab;..
74b0: 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f    /* .  ** Do no
74c0: 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74  t even attempt t
74d0: 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63  o generate any c
74e0: 6f 64 65 20 69 66 20 77 65 20 68 61 76 65 20 61  ode if we have a
74f0: 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a  lready seen.  **
7500: 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74   errors before t
7510: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
7520: 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ts..  */.  if( p
7530: 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20  Parse->nErr>0 ) 
7540: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
7550: 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
7560: 76 65 72 79 20 74 61 62 6c 65 20 69 6e 20 74 68  very table in th
7570: 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64  e table list and
7580: 20 63 72 65 61 74 65 20 61 6e 20 61 70 70 72 6f   create an appro
7590: 70 72 69 61 74 65 0a 20 20 2a 2a 20 63 6f 6c 75  priate.  ** colu
75a0: 6d 6e 6c 69 73 74 20 69 6e 20 70 45 4c 69 73 74  mnlist in pEList
75b0: 20 69 66 20 74 68 65 72 65 20 69 73 6e 27 74 20   if there isn't 
75c0: 6f 6e 65 20 61 6c 72 65 61 64 79 2e 20 20 28 54  one already.  (T
75d0: 68 65 20 70 61 72 73 65 72 20 6c 65 61 76 65 73  he parser leaves
75e0: 0a 20 20 2a 2a 20 61 20 4e 55 4c 4c 20 69 6e 20  .  ** a NULL in 
75f0: 74 68 65 20 70 2d 3e 70 45 4c 69 73 74 20 69 66  the p->pEList if
7600: 20 74 68 65 20 53 51 4c 20 73 61 69 64 20 22 53   the SQL said "S
7610: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e  ELECT * FROM ...
7620: 22 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 69  ").  */.  if( fi
7630: 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  llInColumnList(p
7640: 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
7650: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
7660: 3b 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d  ;.  }.  pEList =
7670: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
7680: 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f  ( pEList==0 ) go
7690: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
76a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
76b0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
76c0: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 44  to use for the D
76d0: 49 53 54 49 4e 43 54 20 73 65 74 2c 20 69 66 0a  ISTINCT set, if.
76e0: 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 20    ** necessary. 
76f0: 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f   This must be do
7700: 6e 65 20 65 61 72 6c 79 20 74 6f 20 61 6c 6c 6f  ne early to allo
7710: 63 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20  cate the cursor 
7720: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 6e 79 20  before.  ** any 
7730: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 45  calls to sqliteE
7740: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 29 2e  xprResolveIds().
7750: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69  .  */.  if( isDi
7760: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 64 69  stinct ){.    di
7770: 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
7780: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65  >nTab++;.  }else
7790: 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  {.    distinct =
77a0: 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
77b0: 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d  f writing to mem
77c0: 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e  ory or generatin
77d0: 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c  g a set.  ** onl
77e0: 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  y a single colum
77f0: 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e  n may be output.
7800: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 44 65  .  */.  if( (eDe
7810: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
7820: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 26  Dest==SRT_Set) &
7830: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
7840: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  1 ){.    sqliteS
7850: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
7860: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6f 6e 6c 79  ->zErrMsg, "only
7870: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
7880: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20   allowed for ". 
7890: 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20        "a SELECT 
78a0: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
78b0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 2c 20  an expression", 
78c0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
78d0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
78e0: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
78f0: 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ..  /* ORDER BY 
7900: 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 77 65  is ignored if we
7910: 20 61 72 65 20 6e 6f 74 20 73 65 6e 64 69 6e 67   are not sending
7920: 20 74 68 65 20 72 65 73 75 6c 74 20 74 6f 20 61   the result to a
7930: 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2f 0a   callback..  */.
7940: 20 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54    if( eDest!=SRT
7950: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
7960: 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
7970: 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
7980: 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 22 65  e cursors for "e
7990: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
79a0: 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 73 2e  ..)" constructs.
79b0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
79c0: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
79d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
79e0: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 6e 53  teExprResolveInS
79f0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
7a00: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
7a10: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68  );.  }.  if( pWh
7a20: 65 72 65 20 29 20 73 71 6c 69 74 65 45 78 70 72  ere ) sqliteExpr
7a30: 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28  ResolveInSelect(
7a40: 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 29 3b  pParse, pWhere);
7a50: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
7a60: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
7a70: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
7a80: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  r; i++){.      s
7a90: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
7aa0: 49 6e 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  InSelect(pParse,
7ab0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
7ac0: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
7ad0: 7d 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79  }.  if( pGroupBy
7ae0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
7af0: 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
7b00: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
7b10: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
7b20: 65 49 6e 53 65 6c 65 63 74 28 70 50 61 72 73 65  eInSelect(pParse
7b30: 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  , pGroupBy->a[i]
7b40: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
7b50: 20 7d 0a 20 20 69 66 28 20 70 48 61 76 69 6e 67   }.  if( pHaving
7b60: 20 29 20 73 71 6c 69 74 65 45 78 70 72 52 65 73   ) sqliteExprRes
7b70: 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28 70 50 61  olveInSelect(pPa
7b80: 72 73 65 2c 20 70 48 61 76 69 6e 67 29 3b 0a 0a  rse, pHaving);..
7b90: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
7ba0: 6e 74 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61  nt, we should ha
7bb0: 76 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6c  ve allocated all
7bc0: 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
7bd0: 74 20 77 65 0a 20 20 2a 2a 20 6e 65 65 64 20 74  t we.  ** need t
7be0: 6f 20 68 61 6e 64 6c 65 20 73 75 62 71 75 65 72  o handle subquer
7bf0: 79 73 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79  ys and temporary
7c00: 20 74 61 62 6c 65 73 2e 20 20 46 72 6f 6d 20 68   tables.  From h
7c10: 65 72 65 20 6f 6e 20 77 65 0a 20 20 2a 2a 20 61  ere on we.  ** a
7c20: 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
7c30: 6b 65 65 70 69 6e 67 20 74 68 65 20 73 61 6d 65  keeping the same
7c40: 20 76 61 6c 75 65 20 66 6f 72 20 70 50 61 72 73   value for pPars
7c50: 65 2d 3e 6e 54 61 62 2e 0a 20 20 2a 2a 0a 20 20  e->nTab..  **.  
7c60: 2a 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 63  ** Resolve the c
7c70: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20  olumn names and 
7c80: 64 6f 20 61 20 73 65 6d 61 6e 74 69 63 73 20 63  do a semantics c
7c90: 68 65 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 65 20  heck on all the 
7ca0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a  expressions..  *
7cb0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
7cc0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
7cd0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
7ce0: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  teExprResolveIds
7cf0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
7d00: 74 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  t, 0, pEList->a[
7d10: 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
7d20: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
7d30: 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
7d40: 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63  ( sqliteExprChec
7d50: 6b 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  k(pParse, pEList
7d60: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 31 2c  ->a[i].pExpr, 1,
7d70: 20 26 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20   &isAgg) ){.    
7d80: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
7d90: 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  d;.    }.  }.  i
7da0: 66 28 20 70 57 68 65 72 65 20 29 7b 0a 20 20 20  f( pWhere ){.   
7db0: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52   if( sqliteExprR
7dc0: 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
7dd0: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
7de0: 73 74 2c 20 70 57 68 65 72 65 29 20 29 7b 0a 20  st, pWhere) ){. 
7df0: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
7e00: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
7e10: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68  if( sqliteExprCh
7e20: 65 63 6b 28 70 50 61 72 73 65 2c 20 70 57 68 65  eck(pParse, pWhe
7e30: 72 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  re, 0, 0) ){.   
7e40: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
7e50: 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  nd;.    }.  }.  
7e60: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
7e70: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
7e80: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
7e90: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
7ea0: 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
7eb0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
7ec0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
7ed0: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20  rIsConstant(pE) 
7ee0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7ef0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
7f00: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20  se->zErrMsg, .  
7f10: 20 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45             "ORDE
7f20: 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 73  R BY expressions
7f30: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63   should not be c
7f40: 6f 6e 73 74 61 6e 74 22 2c 20 30 29 3b 0a 20 20  onstant", 0);.  
7f50: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
7f60: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f  rr++;.        go
7f70: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
7f80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7f90: 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
7fa0: 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54  veIds(pParse, pT
7fb0: 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  abList, pEList, 
7fc0: 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67  pE) ){.        g
7fd0: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
7fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7ff0: 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63  ( sqliteExprChec
8000: 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73  k(pParse, pE, is
8010: 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  Agg, 0) ){.     
8020: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
8030: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
8040: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 47 72 6f  }.  }.  if( pGro
8050: 75 70 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28  upBy ){.    for(
8060: 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d  i=0; i<pGroupBy-
8070: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
8080: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
8090: 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45  GroupBy->a[i].pE
80a0: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73  xpr;.      if( s
80b0: 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74  qliteExprIsConst
80c0: 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20  ant(pE) ){.     
80d0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
80e0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
80f0: 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Msg, .          
8100: 20 20 20 22 47 52 4f 55 50 20 42 59 20 65 78 70     "GROUP BY exp
8110: 72 65 73 73 69 6f 6e 73 20 73 68 6f 75 6c 64 20  ressions should 
8120: 6e 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 22  not be constant"
8130: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50  , 0);.        pP
8140: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
8150: 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
8160: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
8170: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
8180: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
8190: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
81a0: 70 45 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20  pEList, pE) ){. 
81b0: 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
81c0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
81d0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
81e0: 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
81f0: 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20  , pE, isAgg, 0) 
8200: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
8210: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
8220: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
8230: 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
8240: 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d     if( pGroupBy=
8250: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
8260: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
8270: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 61  rse->zErrMsg, "a
8280: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
8290: 20 69 73 20 72 65 71 75 69 72 65 64 20 22 0a 20   is required ". 
82a0: 20 20 20 20 20 20 20 20 22 62 65 66 6f 72 65 20          "before 
82b0: 48 41 56 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20  HAVING", 0);.   
82c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
82d0: 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  +;.      goto se
82e0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
82f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
8300: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
8310: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
8320: 45 4c 69 73 74 2c 20 70 48 61 76 69 6e 67 29 20  EList, pHaving) 
8330: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
8340: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
8350: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
8360: 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
8370: 70 48 61 76 69 6e 67 2c 20 69 73 41 67 67 2c 20  pHaving, isAgg, 
8380: 30 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  0) ){.      goto
8390: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
83a0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
83b0: 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ck for the speci
83c0: 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e  al case of a min
83d0: 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63  () or max() func
83e0: 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20  tion by itself. 
83f0: 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
8400: 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
8410: 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75  ( simpleMinMaxQu
8420: 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 65  ery(pParse, p, e
8430: 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a  Dest, iParm) ){.
8440: 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
8450: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
8460: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
8470: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   generating code
8480: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
8490: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
84a0: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
84b0: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
84c0: 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
84d0: 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
84e0: 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
84f0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
8500: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
8510: 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  TabList->nId; i+
8520: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64 4e  +){.    int oldN
8530: 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Tab;.    if( pTa
8540: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
8550: 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ect==0 ) continu
8560: 65 3b 0a 20 20 20 20 6f 6c 64 4e 54 61 62 20 3d  e;.    oldNTab =
8570: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
8580: 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
8590: 2b 3d 20 69 2b 31 3b 0a 20 20 20 20 73 71 6c 69  += i+1;.    sqli
85a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
85b0: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 6f 6c 64 4e  P_OpenTemp, oldN
85c0: 54 61 62 2b 69 2c 20 30 29 3b 0a 20 20 20 20 73  Tab+i, 0);.    s
85d0: 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72  qliteSelect(pPar
85e0: 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  se, pTabList->a[
85f0: 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f  i].pSelect, SRT_
8600: 54 61 62 6c 65 2c 20 6f 6c 64 4e 54 61 62 2b 69  Table, oldNTab+i
8610: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
8620: 54 61 62 20 3d 20 6f 6c 64 4e 54 61 62 3b 0a 20  Tab = oldNTab;. 
8630: 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e 20 61   }..  /* Do an a
8640: 6e 61 6c 79 73 69 73 20 6f 66 20 61 67 67 72 65  nalysis of aggre
8650: 67 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  gate expressions
8660: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 41  ..  */.  sqliteA
8670: 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65  ggregateInfoRese
8680: 74 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  t(pParse);.  if(
8690: 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73   isAgg ){.    as
86a0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 41  sert( pParse->nA
86b0: 67 67 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  gg==0 && pParse-
86c0: 3e 69 41 67 67 43 6f 75 6e 74 3c 30 20 29 3b 0a  >iAggCount<0 );.
86d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
86e0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
86f0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
8700: 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
8710: 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
8720: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
8730: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
8740: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
8750: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8760: 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
8770: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
8780: 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; i<pGroupBy->n
8790: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
87a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
87b0: 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
87c0: 74 65 73 28 70 50 61 72 73 65 2c 20 70 47 72 6f  tes(pParse, pGro
87d0: 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  upBy->a[i].pExpr
87e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  ) ){.          g
87f0: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
8800: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8810: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
8820: 70 48 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74  pHaving && sqlit
8830: 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  eExprAnalyzeAggr
8840: 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70  egates(pParse, p
8850: 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20  Having) ){.     
8860: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
8870: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8880: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
8890: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
88a0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
88b0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
88c0: 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a  sqliteExprAnalyz
88d0: 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
88e0: 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
88f0: 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
8900: 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
8910: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
8920: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
8930: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
8940: 65 20 6c 69 6d 69 74 65 72 0a 20 20 2a 2f 0a 20  e limiter.  */. 
8950: 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3c 3d   if( p->nLimit<=
8960: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 66 66  0 ){.    p->nOff
8970: 73 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  set = 0;.  }else
8980: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 66  {.    if( p->nOf
8990: 66 73 65 74 3c 30 20 29 20 70 2d 3e 6e 4f 66 66  fset<0 ) p->nOff
89a0: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  set = 0;.    sql
89b0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
89c0: 4f 50 5f 4c 69 6d 69 74 2c 20 70 2d 3e 6e 4c 69  OP_Limit, p->nLi
89d0: 6d 69 74 2c 20 70 2d 3e 6e 4f 66 66 73 65 74 29  mit, p->nOffset)
89e0: 3b 0a 20 20 7d 0a 20 20 20 20 0a 0a 20 20 2f 2a  ;.  }.    ..  /*
89f0: 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
8a00: 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c   names if we wil
8a10: 6c 20 62 65 20 75 73 69 6e 67 20 69 6e 20 74 68  l be using in th
8a20: 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69  e callback.  Thi
8a30: 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73  s.  ** step is s
8a40: 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75  kipped if the ou
8a50: 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f  tput is going to
8a60: 20 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65   a table or a me
8a70: 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2f 0a  mory cell..  */.
8a80: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
8a90: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
8aa0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
8ab0: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
8ac0: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
8ad0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20    }..  /* Reset 
8ae0: 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 0a 20  the aggregator. 
8af0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20   */.  if( isAgg 
8b00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
8b10: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
8b20: 52 65 73 65 74 2c 20 30 2c 20 70 50 61 72 73 65  Reset, 0, pParse
8b30: 2d 3e 6e 41 67 67 29 3b 0a 20 20 20 20 69 66 28  ->nAgg);.    if(
8b40: 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
8b50: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8b60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
8b70: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
8b80: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8b90: 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c  (v, OP_AggFocus,
8ba0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f   0, 0);.      fo
8bb0: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
8bc0: 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAgg; i++){.   
8bd0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20       Expr *pE;. 
8be0: 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72         if( !pPar
8bf0: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67  se->aAgg[i].isAg
8c00: 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  g ) continue;.  
8c10: 20 20 20 20 20 20 70 45 20 3d 20 70 50 61 72 73        pE = pPars
8c20: 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72  e->aAgg[i].pExpr
8c30: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
8c40: 28 20 70 45 3d 3d 30 20 7c 7c 20 70 45 2d 3e 6f  ( pE==0 || pE->o
8c50: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
8c60: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ON );.        as
8c70: 73 65 72 74 28 20 70 45 3d 3d 30 20 7c 7c 20 28  sert( pE==0 || (
8c80: 70 45 2d 3e 70 4c 69 73 74 21 3d 30 20 26 26 20  pE->pList!=0 && 
8c90: 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pE->pList->nExpr
8ca0: 3d 3d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ==1) );.        
8cb0: 69 66 28 20 70 45 3d 3d 30 20 7c 7c 20 70 45 2d  if( pE==0 || pE-
8cc0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 46 4e 5f 53 75 6d  >iColumn==FN_Sum
8cd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
8ce0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8cf0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
8d00: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
8d10: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8d20: 20 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69   OP_AggSet, 0, i
8d30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  );.          con
8d40: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
8d50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8d60: 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
8d70: 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  ize the memory c
8d80: 65 6c 6c 20 74 6f 20 4e 55 4c 4c 0a 20 20 2a 2f  ell to NULL.  */
8d90: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
8da0: 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c  T_Mem ){.    sql
8db0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8dc0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
8dd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
8de0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
8df0: 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b  tore, iParm, 1);
8e00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
8e10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
8e20: 61 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  an.  */.  if( is
8e30: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
8e40: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8e50: 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
8e60: 64 69 73 74 69 6e 63 74 2c 20 31 29 3b 0a 20 20  distinct, 1);.  
8e70: 7d 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  }.  pWInfo = sql
8e80: 69 74 65 57 68 65 72 65 42 65 67 69 6e 28 70 50  iteWhereBegin(pP
8e90: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
8ea0: 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 69 66  pWhere, 0);.  if
8eb0: 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
8ec0: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
8ed0: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
8ee0: 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
8ef0: 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 64   if we are not d
8f00: 65 61 6c 69 6e 67 20 77 69 74 68 0a 20 20 2a 2a  ealing with.  **
8f10: 20 61 67 67 72 65 67 61 74 65 73 0a 20 20 2a 2f   aggregates.  */
8f20: 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 29 7b  .  if( !isAgg ){
8f30: 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49  .    if( selectI
8f40: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
8f50: 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70   pEList, 0, 0, p
8f60: 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63  OrderBy, distinc
8f70: 74 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  t, eDest, iParm,
8f80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8f90: 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f       pWInfo->iCo
8fa0: 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e  ntinue, pWInfo->
8fb0: 69 42 72 65 61 6b 29 20 29 7b 0a 20 20 20 20 20  iBreak) ){.     
8fc0: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
8fd0: 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  d;.    }.  }..  
8fe0: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 65 61  /* If we are dea
8ff0: 6c 69 6e 67 20 77 69 74 68 20 61 67 67 72 65 67  ling with aggreg
9000: 61 74 65 73 2c 20 74 68 65 6e 20 74 6f 20 74 68  ates, then to th
9010: 65 20 73 70 65 63 69 61 6c 20 61 67 67 72 65 67  e special aggreg
9020: 61 74 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  ate.  ** process
9030: 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20 20 65 6c  ing.  .  */.  el
9040: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 47 72 6f  se{.    if( pGro
9050: 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  upBy ){.      in
9060: 74 20 6c 62 6c 31 3b 0a 20 20 20 20 20 20 66 6f  t lbl1;.      fo
9070: 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42  r(i=0; i<pGroupB
9080: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
9090: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
90a0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
90b0: 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45  GroupBy->a[i].pE
90c0: 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
90d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
90e0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65  dOp(v, OP_MakeKe
90f0: 79 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  y, pGroupBy->nEx
9100: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 6c 62  pr, 0);.      lb
9110: 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  l1 = sqliteVdbeM
9120: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
9130: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
9140: 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75  Op(v, OP_AggFocu
9150: 73 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a 20 20 20  s, 0, lbl1);.   
9160: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
9170: 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29  arse->nAgg; i++)
9180: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
9190: 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73  arse->aAgg[i].is
91a0: 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Agg ) continue;.
91b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
91c0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
91d0: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
91e0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
91f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
9200: 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c 20  , OP_AggSet, 0, 
9210: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
9220: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
9230: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 31  lveLabel(v, lbl1
9240: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
9250: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
9260: 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAgg; i++){.    
9270: 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
9280: 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20 20 20    int op;.      
9290: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 61 41 67  if( !pParse->aAg
92a0: 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e  g[i].isAgg ) con
92b0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 20  tinue;.      pE 
92c0: 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69  = pParse->aAgg[i
92d0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
92e0: 66 28 20 70 45 3d 3d 30 20 29 7b 0a 20 20 20 20  f( pE==0 ){.    
92f0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
9300: 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 49 6e 63  dOp(v, OP_AggInc
9310: 72 2c 20 31 2c 20 69 29 3b 0a 20 20 20 20 20 20  r, 1, i);.      
9320: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
9330: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
9340: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  ( pE->op==TK_AGG
9350: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
9360: 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70     assert( pE->p
9370: 4c 69 73 74 21 3d 30 20 26 26 20 70 45 2d 3e 70  List!=0 && pE->p
9380: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  List->nExpr==1 )
9390: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  ;.      sqliteEx
93a0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
93b0: 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  E->pList->a[0].p
93c0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
93d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
93e0: 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c 20 69 29  OP_AggGet, 0, i)
93f0: 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  ;.      switch( 
9400: 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pE->iColumn ){. 
9410: 20 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 4d         case FN_M
9420: 69 6e 3a 20 20 6f 70 20 3d 20 4f 50 5f 4d 69 6e  in:  op = OP_Min
9430: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
9440: 20 20 20 63 61 73 65 20 46 4e 5f 4d 61 78 3a 20     case FN_Max: 
9450: 20 6f 70 20 3d 20 4f 50 5f 4d 61 78 3b 20 20 20   op = OP_Max;   
9460: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
9470: 61 73 65 20 46 4e 5f 41 76 67 3a 20 20 6f 70 20  ase FN_Avg:  op 
9480: 3d 20 4f 50 5f 41 64 64 3b 20 20 20 62 72 65 61  = OP_Add;   brea
9490: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
94a0: 46 4e 5f 53 75 6d 3a 20 20 6f 70 20 3d 20 4f 50  FN_Sum:  op = OP
94b0: 5f 41 64 64 3b 20 20 20 62 72 65 61 6b 3b 0a 20  _Add;   break;. 
94c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
94d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
94e0: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
94f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
9500: 28 76 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20 30  (v, OP_AggSet, 0
9510: 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
9520: 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64  ..  /* End the d
9530: 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
9540: 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  p..  */.  sqlite
9550: 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
9560: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  ;..  /* If we ar
9570: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  e processing agg
9580: 72 65 67 61 74 65 73 2c 20 77 65 20 6e 65 65 64  regates, we need
9590: 20 74 6f 20 73 65 74 20 75 70 20 61 20 73 65 63   to set up a sec
95a0: 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76  ond loop.  ** ov
95b0: 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 67  er all of the ag
95c0: 67 72 65 67 61 74 65 20 76 61 6c 75 65 73 20 61  gregate values a
95d0: 6e 64 20 70 72 6f 63 65 73 73 20 74 68 65 6d 2e  nd process them.
95e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67  .  */.  if( isAg
95f0: 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64  g ){.    int end
9600: 61 67 67 20 3d 20 73 71 6c 69 74 65 56 64 62 65  agg = sqliteVdbe
9610: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
9620: 20 20 69 6e 74 20 73 74 61 72 74 61 67 67 3b 0a    int startagg;.
9630: 20 20 20 20 73 74 61 72 74 61 67 67 20 3d 20 73      startagg = s
9640: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
9650: 2c 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c  , OP_AggNext, 0,
9660: 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 70 50   endagg);.    pP
9670: 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 31  arse->useAgg = 1
9680: 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
9690: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
96a0: 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  eExprIfFalse(pPa
96b0: 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73 74  rse, pHaving, st
96c0: 61 72 74 61 67 67 29 3b 0a 20 20 20 20 7d 0a 20  artagg);.    }. 
96d0: 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e     if( selectInn
96e0: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
96f0: 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
9700: 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c  derBy, distinct,
9710: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 0a 20   eDest, iParm,. 
9720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9730: 20 20 20 73 74 61 72 74 61 67 67 2c 20 65 6e 64     startagg, end
9740: 61 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  agg) ){.      go
9750: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
9760: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
9770: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
9780: 6f 74 6f 2c 20 30 2c 20 73 74 61 72 74 61 67 67  oto, 0, startagg
9790: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
97a0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
97b0: 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 73 71   endagg);.    sq
97c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
97d0: 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b   OP_Noop, 0, 0);
97e0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65  .    pParse->use
97f0: 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Agg = 0;.  }..  
9800: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
9810: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
9820: 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20  e, then we need 
9830: 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75  to sort the resu
9840: 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e  lts.  ** and sen
9850: 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61  d them to the ca
9860: 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e  llback one by on
9870: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  e..  */.  if( pO
9880: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65  rderBy ){.    ge
9890: 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 76  nerateSortTail(v
98a0: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
98b0: 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
98c0: 6e 54 61 62 20 3d 20 62 61 73 65 3b 0a 0a 0a 20  nTab = base;... 
98d0: 20 2f 2a 20 49 73 73 75 65 20 61 20 6e 75 6c 6c   /* Issue a null
98e0: 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 61   callback if tha
98f0: 74 20 69 73 20 77 68 61 74 20 74 68 65 20 75 73  t is what the us
9900: 65 72 20 77 61 6e 74 73 2e 0a 20 20 2a 2f 0a 20  er wants..  */. 
9910: 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62   if( (pParse->db
9920: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
9930: 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 29 21 3d  _NullCallback)!=
9940: 30 20 26 26 20 65 44 65 73 74 3d 3d 53 52 54 5f  0 && eDest==SRT_
9950: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
9960: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9970: 76 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c 6c 62 61  v, OP_NullCallba
9980: 63 6b 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ck, pEList->nExp
9990: 72 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r, 0);.  }..  /*
99a0: 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20   The SELECT was 
99b0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64  successfully cod
99c0: 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65  ed.   Set the re
99d0: 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20  turn code to 0. 
99e0: 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
99f0: 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  no errors..  */.
9a00: 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20    rc = 0;..  /* 
9a10: 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f  Control jumps to
9a20: 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f   here if an erro
9a30: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
9a40: 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a   above, or upon.
9a50: 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
9a60: 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45  coding of the SE
9a70: 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63  LECT..  */.selec
9a80: 74 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 41  t_end:.  sqliteA
9a90: 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65  ggregateInfoRese
9aa0: 74 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74  t(pParse);.  ret
9ab0: 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.