/ Hex Artifact Content
Login

Artifact f0cbfd2d9059e0f33837797ee326fbe964a35f09:


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 34 20  select.c,v 1.64 
0200: 32 30 30 32 2f 30 32 2f 32 31 20 31 32 3a 30 31  2002/02/21 12:01
0210: 3a 32 37 20 64 72 68 20 45 78 70 20 24 0a 2a 2f  :27 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: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  );.}../*.** Dele
0890: 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65  te the aggregate
08a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
08b0: 6d 20 74 68 65 20 70 61 72 73 65 20 73 74 72 75  m the parse stru
08c0: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
08d0: 20 76 6f 69 64 20 73 71 6c 69 74 65 41 67 67 72   void sqliteAggr
08e0: 65 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28 50  egateInfoReset(P
08f0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
0900: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 72   sqliteFree(pPar
0910: 73 65 2d 3e 61 41 67 67 29 3b 0a 20 20 70 50 61  se->aAgg);.  pPa
0920: 72 73 65 2d 3e 61 41 67 67 20 3d 20 30 3b 0a 20  rse->aAgg = 0;. 
0930: 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20   pParse->nAgg = 
0940: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 41 67  0;.  pParse->iAg
0950: 67 43 6f 75 6e 74 20 3d 20 2d 31 3b 0a 20 20 70  gCount = -1;.  p
0960: 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20  Parse->useAgg = 
0970: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
0980: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
0990: 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
09a0: 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68  the inside of th
09b0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
09c0: 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  of a SELECT..**.
09d0: 2a 2a 20 54 68 65 20 70 45 4c 69 73 74 20 69 73  ** The pEList is
09e0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
09f0: 6e 65 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f  ne the values fo
0a00: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e  r each column in
0a10: 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 72   the.** result r
0a20: 6f 77 2e 20 20 45 78 63 65 70 74 20 20 69 66 20  ow.  Except  if 
0a30: 70 45 4c 69 73 74 3d 3d 4e 55 4c 4c 2c 20 74 68  pEList==NULL, th
0a40: 65 6e 20 77 65 20 6a 75 73 74 20 72 65 61 64 20  en we just read 
0a50: 6e 43 6f 6c 75 6d 6e 0a 2a 2a 20 65 6c 65 6d 65  nColumn.** eleme
0a60: 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 72 63  nts from the src
0a70: 54 61 62 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  Tab table..*/.st
0a80: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 49  atic int selectI
0a90: 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73  nnerLoop(.  Pars
0aa0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
0ab0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
0ac0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  r context */.  E
0ad0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
0ae0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
0af0: 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65  f values being e
0b00: 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e  xtracted */.  in
0b10: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
0b20: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
0b30: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
0b40: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  le */.  int nCol
0b50: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
0b60: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
0b70: 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72  umns in the sour
0b80: 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  ce table */.  Ex
0b90: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0ba0: 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20  ,     /* If not 
0bb0: 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c  NULL, sort resul
0bc0: 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65  ts using this ke
0bd0: 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  y */.  int disti
0be0: 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  nct,           /
0bf0: 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73  * If >=0, make s
0c00: 75 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ure results are 
0c10: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e  distinct */.  in
0c20: 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20  t eDest,        
0c30: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
0c40: 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
0c50: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
0c60: 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iParm,          
0c70: 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65      /* An argume
0c80: 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73  nt to the dispos
0c90: 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69  al method */.  i
0ca0: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20  nt iContinue,   
0cb0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
0cc0: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
0cd0: 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f  with next row */
0ce0: 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
0cf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
0d00: 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
0d10: 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65   out of the inne
0d20: 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56  r loop */.){.  V
0d30: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
0d40: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
0d50: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
0d60: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 50 75  turn 0;..  /* Pu
0d70: 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ll the requested
0d80: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20   columns..  */. 
0d90: 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20   if( pEList ){. 
0da0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
0db0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
0dc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  ){.      sqliteE
0dd0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
0de0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
0df0: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  pr);.    }.    n
0e00: 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74 2d  Column = pEList-
0e10: 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c 73 65 7b  >nExpr;.  }else{
0e20: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
0e30: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
0e40: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
0e50: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
0e60: 6e 2c 20 73 72 63 54 61 62 2c 20 69 29 3b 0a 20  n, srcTab, i);. 
0e70: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
0e80: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
0e90: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
0ea0: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
0eb0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
0ec0: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
0ed0: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
0ee0: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
0ef0: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
0f00: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
0f10: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
0f20: 20 64 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a   distinct>=0 ){.
0f30: 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71      int lbl = sq
0f40: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
0f50: 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l(v);.    sqlite
0f60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
0f70: 4d 61 6b 65 4b 65 79 2c 20 70 45 4c 69 73 74 2d  MakeKey, pEList-
0f80: 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20  >nExpr, 1);.    
0f90: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
0fa0: 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20  v, OP_Distinct, 
0fb0: 64 69 73 74 69 6e 63 74 2c 20 6c 62 6c 29 3b 0a  distinct, lbl);.
0fc0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
0fd0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 70  dOp(v, OP_Pop, p
0fe0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 2c 20  EList->nExpr+1, 
0ff0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
1000: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
1010: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65  to, 0, iContinue
1020: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
1030: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1040: 20 6c 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74   lbl);.    sqlit
1050: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
1060: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
1070: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
1080: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72  dOp(v, OP_PutStr
1090: 4b 65 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 30  Key, distinct, 0
10a0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
10b0: 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
10c0: 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
10d0: 6e 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  n store the resu
10e0: 6c 74 73 0a 20 20 2a 2a 20 69 6e 20 61 20 73 6f  lts.  ** in a so
10f0: 72 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rter..  */.  if(
1100: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
1110: 20 63 68 61 72 20 2a 7a 53 6f 72 74 4f 72 64 65   char *zSortOrde
1120: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  r;.    sqliteVdb
1130: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
1140: 74 4d 61 6b 65 52 65 63 2c 20 6e 43 6f 6c 75 6d  tMakeRec, nColum
1150: 6e 2c 20 30 29 3b 0a 20 20 20 20 7a 53 6f 72 74  n, 0);.    zSort
1160: 4f 72 64 65 72 20 3d 20 73 71 6c 69 74 65 4d 61  Order = sqliteMa
1170: 6c 6c 6f 63 28 20 70 4f 72 64 65 72 42 79 2d 3e  lloc( pOrderBy->
1180: 6e 45 78 70 72 20 2b 20 31 20 29 3b 0a 20 20 20  nExpr + 1 );.   
1190: 20 69 66 28 20 7a 53 6f 72 74 4f 72 64 65 72 3d   if( zSortOrder=
11a0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
11b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
11c0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
11d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 6f 72 74  ++){.      zSort
11e0: 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65  Order[i] = pOrde
11f0: 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
1200: 64 65 72 20 3f 20 27 2d 27 20 3a 20 27 2b 27 3b  der ? '-' : '+';
1210: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
1220: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4f  rCode(pParse, pO
1230: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
1240: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  pr);.    }.    z
1250: 53 6f 72 74 4f 72 64 65 72 5b 70 4f 72 64 65 72  SortOrder[pOrder
1260: 42 79 2d 3e 6e 45 78 70 72 5d 20 3d 20 30 3b 0a  By->nExpr] = 0;.
1270: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
1280: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61  dOp(v, OP_SortMa
1290: 6b 65 4b 65 79 2c 20 70 4f 72 64 65 72 42 79 2d  keKey, pOrderBy-
12a0: 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  >nExpr, 0);.    
12b0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
12c0: 50 33 28 76 2c 20 2d 31 2c 20 7a 53 6f 72 74 4f  P3(v, -1, zSortO
12d0: 72 64 65 72 2c 20 73 74 72 6c 65 6e 28 7a 53 6f  rder, strlen(zSo
12e0: 72 74 4f 72 64 65 72 29 29 3b 0a 20 20 20 20 73  rtOrder));.    s
12f0: 71 6c 69 74 65 46 72 65 65 28 7a 53 6f 72 74 4f  qliteFree(zSortO
1300: 72 64 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rder);.    sqlit
1310: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
1320: 5f 53 6f 72 74 50 75 74 2c 20 30 2c 20 30 29 3b  _SortPut, 0, 0);
1330: 0a 20 20 7d 65 6c 73 65 20 0a 0a 20 20 2f 2a 20  .  }else ..  /* 
1340: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
1350: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
1360: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
1370: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
1380: 79 0a 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61  y.  ** table iPa
1390: 72 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  rm..  */.  if( e
13a0: 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20  Dest==SRT_Union 
13b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
13c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
13d0: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
13e0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1400: 53 74 72 69 6e 67 2c 20 69 50 61 72 6d 2c 20 30  String, iParm, 0
1410: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
1420: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
1430: 53 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30  StrKey, iParm, 0
1440: 29 3b 0a 20 20 7d 65 6c 73 65 20 0a 0a 20 20 2f  );.  }else ..  /
1450: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
1460: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
1470: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
1480: 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
1490: 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20  =SRT_Table ){.  
14a0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
14b0: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
14c0: 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  rd, nColumn, 0);
14d0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
14e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
14f0: 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  cno, iParm, 0);.
1500: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
1510: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
1520: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
1530: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
1540: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72  _PutIntKey, iPar
1550: 6d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 0a  m, 0);.  }else .
1560: 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
1570: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  a record from th
1580: 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20  e query result, 
1590: 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20  but instead of. 
15a0: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
15b0: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
15c0: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
15d0: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
15e0: 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61    ** the tempora
15f0: 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ry table iParm..
1600: 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
1610: 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 29 7b 0a  ==SRT_Except ){.
1620: 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73      int addr = s
1630: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
1640: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
1650: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
1660: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
1670: 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  p(v, OP_NotFound
1680: 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 2b 33 29  , iParm, addr+3)
1690: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
16a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65  AddOp(v, OP_Dele
16b0: 74 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  te, iParm, 0);. 
16c0: 20 7d 65 6c 73 65 20 0a 0a 20 20 2f 2a 20 49 66   }else ..  /* If
16d0: 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
16e0: 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
16f0: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
1700: 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
1710: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
1720: 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67  should be a sing
1730: 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73  le item on the s
1740: 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69  tack.  Write thi
1750: 73 0a 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f  s.  ** item into
1760: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
1770: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
1780: 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
1790: 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20 20 20  ==SRT_Set ){.   
17a0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
17b0: 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==1 );.    sqlit
17c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
17d0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
17e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
17f0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72  dOp(v, OP_PutStr
1800: 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  Key, iParm, 0);.
1810: 20 20 7d 65 6c 73 65 20 0a 0a 0a 20 20 2f 2a 20    }else ...  /* 
1820: 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
1830: 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
1840: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
1850: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
1860: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
1870: 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
1880: 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
1890: 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
18a0: 75 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  ut.  ** of the s
18b0: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20  can loop..  */. 
18c0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
18d0: 4d 65 6d 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Mem ){.    asser
18e0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
18f0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
1900: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
1910: 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ore, iParm, 1);.
1920: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
1930: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
1940: 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 65  0, iBreak);.  }e
1950: 6c 73 65 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 6e  lse..  /* If non
1960: 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20  e of the above, 
1970: 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f  send the data to
1980: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75   the callback fu
1990: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 7b  nction..  */.  {
19a0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
19b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62  ddOp(v, OP_Callb
19c0: 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 69 42  ack, nColumn, iB
19d0: 72 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74  reak);.  }.  ret
19e0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
19f0: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
1a00: 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  p was generated 
1a10: 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c  using a non-null
1a20: 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65   pOrderBy argume
1a30: 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  nt,.** then the 
1a40: 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61  results were pla
1a50: 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e  ced in a sorter.
1a60: 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70    After the loop
1a70: 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a   is terminated.*
1a80: 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e  * we need to run
1a90: 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20   the sorter and 
1aa0: 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c  output the resul
1ab0: 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ts.  The followi
1ac0: 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  ng.** routine ge
1ad0: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
1ae0: 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68   needed to do th
1af0: 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  at..*/.static vo
1b00: 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54  id generateSortT
1b10: 61 69 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ail(Vdbe *v, int
1b20: 20 6e 43 6f 6c 75 6d 6e 29 7b 0a 20 20 69 6e 74   nColumn){.  int
1b30: 20 65 6e 64 20 3d 20 73 71 6c 69 74 65 56 64 62   end = sqliteVdb
1b40: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1b50: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 73 71 6c   int addr;.  sql
1b60: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
1b70: 4f 50 5f 53 6f 72 74 2c 20 30 2c 20 30 29 3b 0a  OP_Sort, 0, 0);.
1b80: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
1b90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
1ba0: 6f 72 74 4e 65 78 74 2c 20 30 2c 20 65 6e 64 29  ortNext, 0, end)
1bb0: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64  ;.  sqliteVdbeAd
1bc0: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 43 61  dOp(v, OP_SortCa
1bd0: 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c  llback, nColumn,
1be0: 20 65 6e 64 29 3b 0a 20 20 73 71 6c 69 74 65 56   end);.  sqliteV
1bf0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
1c00: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20  oto, 0, addr);. 
1c10: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
1c20: 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 29 3b  veLabel(v, end);
1c30: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  .  sqliteVdbeAdd
1c40: 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 52 65 73  Op(v, OP_SortRes
1c50: 65 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  et, 0, 0);.}../*
1c60: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1c70: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
1c80: 20 74 68 65 20 56 44 42 45 20 68 6f 77 20 6d 61   the VDBE how ma
1c90: 6e 79 20 63 6f 6c 75 6d 6e 73 20 74 68 65 72 65  ny columns there
1ca0: 0a 2a 2a 20 61 72 65 20 69 6e 20 74 68 65 20 72  .** are in the r
1cb0: 65 73 75 6c 74 20 61 6e 64 20 74 68 65 20 6e 61  esult and the na
1cc0: 6d 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  me for each colu
1cd0: 6d 6e 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  mn.  This inform
1ce0: 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64  ation.** is used
1cf0: 20 74 6f 20 70 72 6f 76 69 64 65 20 22 61 72 67   to provide "arg
1d00: 63 22 20 61 6e 64 20 22 61 7a 43 6f 6c 5b 5d 22  c" and "azCol[]"
1d10: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63   values in the c
1d20: 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  allback..*/.stat
1d30: 69 63 20 0a 76 6f 69 64 20 67 65 6e 65 72 61 74  ic .void generat
1d40: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72  eColumnNames(Par
1d50: 73 65 20 2a 70 50 61 72 73 65 2c 20 49 64 4c 69  se *pParse, IdLi
1d60: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 45 78  st *pTabList, Ex
1d70: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b  prList *pEList){
1d80: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1d90: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1da0: 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73  t i;.  if( pPars
1db0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c  e->colNamesSet |
1dc0: 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  | v==0 || sqlite
1dd0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
1de0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73   return;.  pPars
1df0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
1e00: 20 31 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65   1;.  sqliteVdbe
1e10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
1e20: 6d 6e 43 6f 75 6e 74 2c 20 70 45 4c 69 73 74 2d  mnCount, pEList-
1e30: 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 66 6f  >nExpr, 0);.  fo
1e40: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
1e50: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1e60: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 69    Expr *p;.    i
1e70: 6e 74 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73  nt showFullNames
1e80: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
1e90: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
1ea0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
1eb0: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
1ec0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
1ed0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
1ee0: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
1ef0: 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  i, 0);.      sql
1f00: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
1f10: 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73 74  v, -1, zName, st
1f20: 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20  rlen(zName));.  
1f30: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1f40: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 45 4c 69    }.    p = pELi
1f50: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
1f60: 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63      if( p==0 ) c
1f70: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 68 6f  ontinue;.    sho
1f80: 77 46 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 70 50  wFullNames = (pP
1f90: 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
1fa0: 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
1fb0: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 20 20 69  Names)!=0;.    i
1fc0: 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  f( p->span.z && 
1fd0: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 26 26 20  p->span.z[0] && 
1fe0: 21 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 29  !showFullNames )
1ff0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
2000: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
2010: 4f 70 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e 61  Op(v,OP_ColumnNa
2020: 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  me, i, 0);.     
2030: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
2040: 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 73 70  eP3(v, -1, p->sp
2050: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
2060: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
2070: 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65 28  beCompressSpace(
2080: 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 65  v, addr);.    }e
2090: 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  lse if( p->op==T
20a0: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62  K_COLUMN && pTab
20b0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61  List ){.      Ta
20c0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
20d0: 4c 69 73 74 2d 3e 61 5b 70 2d 3e 69 54 61 62 6c  List->a[p->iTabl
20e0: 65 20 2d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e - pParse->nTab
20f0: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68  ].pTab;.      ch
2100: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
2110: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
2120: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28  olumn;.      if(
2130: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
2140: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
2150: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
2160: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
2170: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
2180: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 7a 43  Col) );.      zC
2190: 6f 6c 20 3d 20 69 43 6f 6c 3c 30 20 3f 20 22 5f  ol = iCol<0 ? "_
21a0: 52 4f 57 49 44 5f 22 20 3a 20 70 54 61 62 2d 3e  ROWID_" : pTab->
21b0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
21c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
21d0: 4c 69 73 74 2d 3e 6e 49 64 3e 31 20 7c 7c 20 73  List->nId>1 || s
21e0: 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a  howFullNames ){.
21f0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
2200: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
2210: 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20   char *zTab;. . 
2220: 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70 54         zTab = pT
2230: 61 62 4c 69 73 74 2d 3e 61 5b 70 2d 3e 69 54 61  abList->a[p->iTa
2240: 62 6c 65 20 2d 20 70 50 61 72 73 65 2d 3e 6e 54  ble - pParse->nT
2250: 61 62 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  ab].zAlias;.    
2260: 20 20 20 20 69 66 28 20 73 68 6f 77 46 75 6c 6c      if( showFull
2270: 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30  Names || zTab==0
2280: 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e   ) zTab = pTab->
2290: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73  zName;.        s
22a0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
22b0: 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22  zName, zTab, "."
22c0: 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20  , zCol, 0);.    
22d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
22e0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
22f0: 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20  Name, i, 0);.   
2300: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
2310: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a  hangeP3(v, -1, z
2320: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
2330: 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  me));.        sq
2340: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
2350: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2360: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
2370: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
2380: 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20  mnName, i, 0);. 
2390: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
23a0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
23b0: 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20   zCol, 0);.     
23c0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
23d0: 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d   p->span.z && p-
23e0: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  >span.z[0] ){.  
23f0: 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73      int addr = s
2400: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
2410: 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20  ,OP_ColumnName, 
2420: 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  i, 0);.      sql
2430: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
2440: 76 2c 20 2d 31 2c 20 70 2d 3e 73 70 61 6e 2e 7a  v, -1, p->span.z
2450: 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20  , p->span.n);.  
2460: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 6f      sqliteVdbeCo
2470: 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c 20 61  mpressSpace(v, a
2480: 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
2490: 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d  .      char zNam
24a0: 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73  e[30];.      ass
24b0: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43  ert( p->op!=TK_C
24c0: 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73  OLUMN || pTabLis
24d0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 70  t==0 );.      sp
24e0: 72 69 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f  rintf(zName, "co
24f0: 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20  lumn%d", i+1);. 
2500: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
2510: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
2520: 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20  nName, i, 0);.  
2530: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
2540: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e  angeP3(v, -1, zN
2550: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
2560: 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  e));.    }.  }.}
2570: 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20  ../*.** Name of 
2580: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
2590: 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f  perator, used fo
25a0: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
25b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
25c0: 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70  t char *selectOp
25d0: 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20  Name(int id){.  
25e0: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
25f0: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73  h( id ){.    cas
2600: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20  e TK_ALL:       
2610: 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b  z = "UNION ALL";
2620: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
2630: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
2640: 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22   z = "INTERSECT"
2650: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
2660: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
2670: 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20    z = "EXCEPT"; 
2680: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2690: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
26a0: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20     z = "UNION"; 
26b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
26c0: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
26d0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45  /*.** Given a SE
26e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
26f0: 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65  generate a Table
2700: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2710: 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65  describes.** the
2720: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
2730: 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54  hat SELECT..*/.T
2740: 61 62 6c 65 20 2a 73 71 6c 69 74 65 52 65 73 75  able *sqliteResu
2750: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
2760: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61  rse *pParse, cha
2770: 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c  r *zTabName, Sel
2780: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
2790: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
27a0: 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73  int i;.  ExprLis
27b0: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 61  t *pEList;.  sta
27c0: 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 6f  tic int fillInCo
27d0: 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73 65 2a 2c  lumnList(Parse*,
27e0: 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 20 20 69 66   Select*);..  if
27f0: 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69  ( fillInColumnLi
2800: 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
2810: 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ct) ){.    retur
2820: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20  n 0;.  }.  pTab 
2830: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
2840: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b  sizeof(Table) );
2850: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
2860: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2870: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d    }.  pTab->zNam
2880: 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73  e = zTabName ? s
2890: 71 6c 69 74 65 53 74 72 44 75 70 28 7a 54 61 62  qliteStrDup(zTab
28a0: 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c  Name) : 0;.  pEL
28b0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
28c0: 45 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e  EList;.  pTab->n
28d0: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
28e0: 78 70 72 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f  xpr;.  pTab->aCo
28f0: 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
2900: 28 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61  ( sizeof(pTab->a
2910: 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43  Col[0])*pTab->nC
2920: 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ol );.  for(i=0;
2930: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
2940: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
2950: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
2960: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
2970: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
2980: 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
2990: 74 65 53 74 72 44 75 70 28 70 45 4c 69 73 74 2d  teStrDup(pEList-
29a0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
29b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 3d 70    }else if( (p=p
29c0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
29d0: 72 29 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d  r)->span.z && p-
29e0: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  >span.z[0] ){.  
29f0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
2a00: 72 69 6e 67 28 26 70 54 61 62 2d 3e 61 43 6f 6c  ring(&pTab->aCol
2a10: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 2d 3e 73 70  [i].zName, p->sp
2a20: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 2c  an.z, p->span.n,
2a30: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   0);.    }else i
2a40: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  f( p->op==TK_DOT
2a50: 20 26 26 20 70 2d 3e 70 52 69 67 68 74 20 26 26   && p->pRight &&
2a60: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
2a70: 6e 2e 7a 20 26 26 0a 20 20 20 20 20 20 20 20 20  n.z &&.         
2a80: 20 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b    p->pRight->tok
2a90: 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  en.z[0] ){.     
2aa0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
2ab0: 67 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  g(&pTab->aCol[i]
2ac0: 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  .zName, .       
2ad0: 20 20 20 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74      p->pRight->t
2ae0: 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 70 52 69 67 68  oken.z, p->pRigh
2af0: 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a  t->token.n, 0);.
2b00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b10: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
2b20: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42        sprintf(zB
2b30: 75 66 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20  uf, "column%d", 
2b40: 69 2b 31 29 3b 0a 20 20 20 20 20 20 70 54 61 62  i+1);.      pTab
2b50: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20  ->aCol[i].zName 
2b60: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a  = sqliteStrDup(z
2b70: 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Buf);.    }.  }.
2b80: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
2b90: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61  -1;.  return pTa
2ba0: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  b;.}../*.** For 
2bb0: 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54  the given SELECT
2bc0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 64 6f 20 74   statement, do t
2bd0: 77 6f 20 74 68 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a  wo things..**.**
2be0: 20 20 20 20 28 31 29 20 20 46 69 6c 6c 20 69 6e      (1)  Fill in
2bf0: 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
2c00: 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
2c10: 6e 20 74 68 65 20 49 64 4c 69 73 74 20 74 68 61  n the IdList tha
2c20: 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  t .**         de
2c30: 66 69 6e 65 73 20 74 68 65 20 73 65 74 20 6f 66  fines the set of
2c40: 20 74 61 62 6c 65 73 20 74 68 61 74 20 73 68 6f   tables that sho
2c50: 75 6c 64 20 62 65 20 73 63 61 6e 6e 65 64 2e 20  uld be scanned. 
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49  .**.**    (2)  I
2c70: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 74 6f  f the columns to
2c80: 20 62 65 20 65 78 74 72 61 63 74 65 64 20 76 61   be extracted va
2c90: 72 69 61 62 6c 65 20 28 70 45 4c 69 73 74 29 20  riable (pEList) 
2ca0: 69 73 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20  is NULL.**      
2cb0: 20 20 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74     (meaning that
2cc0: 20 61 20 22 2a 22 20 77 61 73 20 75 73 65 64 20   a "*" was used 
2cd0: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  in the SQL state
2ce0: 6d 65 6e 74 29 20 74 68 65 6e 0a 2a 2a 20 20 20  ment) then.**   
2cf0: 20 20 20 20 20 20 63 72 65 61 74 65 20 61 20 66        create a f
2d00: 61 6b 65 20 70 45 4c 69 73 74 20 63 6f 6e 74 61  ake pEList conta
2d10: 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ining the names 
2d20: 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 0a 2a  of all columns.*
2d30: 2a 20 20 20 20 20 20 20 20 20 6f 66 20 61 6c 6c  *         of all
2d40: 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 52   tables..**.** R
2d50: 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65  eturn 0 on succe
2d60: 73 73 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  ss.  If there ar
2d70: 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76  e problems, leav
2d80: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
2d90: 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20  ge.** in pParse 
2da0: 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  and return non-z
2db0: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
2dc0: 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  nt fillInColumnL
2dd0: 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ist(Parse *pPars
2de0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
2df0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20   int i, j, k;.  
2e00: 49 64 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  IdList *pTabList
2e10: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
2e20: 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 3d 3d  List;..  if( p==
2e30: 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20  0 || p->pSrc==0 
2e40: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 54  ) return 1;.  pT
2e50: 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
2e60: 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
2e70: 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4c 6f  pEList;..  /* Lo
2e80: 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
2e90: 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c  e in the table l
2ea0: 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ist..  */.  for(
2eb0: 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
2ec0: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
2ed0: 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
2ee0: 69 5d 2e 70 54 61 62 20 29 7b 0a 20 20 20 20 20  i].pTab ){.     
2ef0: 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
2f00: 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65 21   has run before!
2f10: 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 6f 6e    No need to con
2f20: 74 69 6e 75 65 20 2a 2f 0a 20 20 20 20 20 20 72  tinue */.      r
2f30: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
2f40: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
2f50: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29  >a[i].zName==0 )
2f60: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  {.      /* A sub
2f70: 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
2f80: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
2f90: 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 54  ELECT */.      T
2fa0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
2fb0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69    assert( pTabLi
2fc0: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
2fd0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61  !=0 );.      pTa
2fe0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  bList->a[i].pTab
2ff0: 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20   = pTab = .     
3000: 20 20 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53     sqliteResultS
3010: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
3020: 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  e, pTabList->a[i
3030: 5d 2e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20  ].zAlias,.      
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3060: 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
3070: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  .pSelect);.     
3080: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
3090: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
30a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30b0: 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e  pTab->isTransien
30c0: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 1;.    }else
30d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72  {.      /* An or
30e0: 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6e 61 6d  dinary table nam
30f0: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
3100: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 70 54  ause */.      pT
3110: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
3120: 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  b = sqliteFindTa
3130: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
3140: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
3150: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
3160: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
3170: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
3180: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
3190: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
31a0: 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  Msg, "no such ta
31b0: 62 6c 65 3a 20 22 2c 20 0a 20 20 20 20 20 20 20  ble: ", .       
31c0: 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b      pTabList->a[
31d0: 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  i].zName, 0);.  
31e0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
31f0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65  rr++;.        re
3200: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
3210: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
3220: 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68  For every "*" th
3230: 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  at occurs in the
3240: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e   column list, in
3250: 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f  sert the names o
3260: 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d  f.  ** all colum
3270: 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
3280: 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
3290: 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
32a0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
32b0: 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c   with the TK_ALL
32c0: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
32d0: 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
32e0: 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
32f0: 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68  mn list..  ** Th
3300: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
3310: 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
3320: 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65  ate the TK_ALL e
3330: 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
3340: 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20  xpand.  ** each 
3350: 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
3360: 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
3370: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  n all tables..  
3380: 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
3390: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
33a0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 45 4c  ++){.    if( pEL
33b0: 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 2d  ist->a[k].pExpr-
33c0: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
33d0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b  eak;.  }.  if( k
33e0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
33f0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
3400: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
3410: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
3420: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
3430: 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  0;.    for(k=0; 
3440: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
3450: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   k++){.      if(
3460: 20 61 5b 6b 5d 2e 70 45 78 70 72 2d 3e 6f 70 21   a[k].pExpr->op!
3470: 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20  =TK_ALL ){.     
3480: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
3490: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
34a0: 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c  New, a[k].pExpr,
34b0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65   0);.        pNe
34c0: 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
34d0: 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d  -1].zName = a[k]
34e0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
34f0: 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
3500: 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
3510: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  me = 0;.      }e
3520: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
3530: 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
3540: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
3550: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
3560: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
3570: 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [i].pTab;.      
3580: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3590: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
35a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
35b0: 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66 74  r *pExpr, *pLeft
35c0: 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20  , *pRight;.     
35d0: 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
35e0: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44  sqliteExpr(TK_ID
35f0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
3600: 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67          if( pRig
3610: 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ht==0 ) break;. 
3620: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
3630: 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 70 54 61  t->token.z = pTa
3640: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
3650: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  ;.            pR
3660: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  ight->token.n = 
3670: 73 74 72 6c 65 6e 28 70 54 61 62 2d 3e 61 43 6f  strlen(pTab->aCo
3680: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[j].zName);.   
3690: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61           if( pTa
36a0: 62 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  b->zName ){.    
36b0: 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
36c0: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
36d0: 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ID, 0, 0, 0);.  
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
36f0: 70 4c 65 66 74 3d 3d 30 20 29 20 62 72 65 61 6b  pLeft==0 ) break
3700: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3710: 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
3720: 69 5d 2e 7a 41 6c 69 61 73 20 26 26 20 70 54 61  i].zAlias && pTa
3730: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  bList->a[i].zAli
3740: 61 73 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  as[0] ){.       
3750: 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e           pLeft->
3760: 74 6f 6b 65 6e 2e 7a 20 3d 20 70 54 61 62 4c 69  token.z = pTabLi
3770: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b  st->a[i].zAlias;
3780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3790: 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 20   pLeft->token.n 
37a0: 3d 20 73 74 72 6c 65 6e 28 70 54 61 62 4c 69 73  = strlen(pTabLis
37b0: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b  t->a[i].zAlias);
37c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
37d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
37e0: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b        pLeft->tok
37f0: 65 6e 2e 7a 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  en.z = pTab->zNa
3800: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
3810: 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e      pLeft->token
3820: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 61 62  .n = strlen(pTab
3830: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
3840: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3850: 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
3860: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 44 4f  sqliteExpr(TK_DO
3870: 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  T, pLeft, pRight
3880: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
3890: 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30      if( pExpr==0
38a0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
38b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
38c0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
38d0: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
38e0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
38f0: 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f  span = pExpr->to
3900: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ken;.           
3910: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
3920: 4e 65 77 20 3d 20 73 71 6c 69 74 65 45 78 70 72  New = sqliteExpr
3930: 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c  ListAppend(pNew,
3940: 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
3950: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3960: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
3970: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69      sqliteExprLi
3980: 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29  stDelete(pEList)
3990: 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20  ;.    p->pEList 
39a0: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65  = pNew;.  }.  re
39b0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
39c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   This routine as
39d0: 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65 73  sociates entries
39e0: 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
39f0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
3a00: 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  with.** columns 
3a10: 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f  in a result.  Fo
3a20: 72 20 65 61 63 68 20 4f 52 44 45 52 20 42 59 20  r each ORDER BY 
3a30: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20  expression, the 
3a40: 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65  opcode of.** the
3a50: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
3a60: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b  is changed to TK
3a70: 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20  _COLUMN and the 
3a80: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66  iColumn value of
3a90: 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  .** the top-leve
3aa0: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
3ab0: 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20   in with column 
3ac0: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
3ad0: 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  Table.** value o
3ae0: 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
3af0: 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77  node is filled w
3b00: 69 74 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d  ith iTable param
3b10: 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eter..**.** If t
3b20: 68 65 72 65 20 61 72 65 20 70 72 69 6f 72 20 53  here are prior S
3b30: 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74  ELECT clauses, t
3b40: 68 65 79 20 61 72 65 20 70 72 6f 63 65 73 73 65  hey are processe
3b50: 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63  d first.  A matc
3b60: 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69  h.** in an earli
3b70: 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20  er SELECT takes 
3b80: 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20  precedence over 
3b90: 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a  a later SELECT..
3ba0: 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20  **.** Any entry 
3bb0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  that does not ma
3bc0: 74 63 68 20 69 73 20 66 6c 61 67 67 65 64 20 61  tch is flagged a
3bd0: 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  s an error.  The
3be0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
3bf0: 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64  rors is returned
3c00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3c10: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
3c20: 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
3c30: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
3c40: 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65  /* A place to le
3c50: 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ave error messag
3c60: 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
3c70: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
3c80: 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75  /* Match to resu
3c90: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  lt columns of th
3ca0: 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45  is SELECT */.  E
3cb0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
3cc0: 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  y,     /* The OR
3cd0: 44 45 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f  DER BY values to
3ce0: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 63   match against c
3cf0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
3d00: 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
3d10: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
3d20: 69 73 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e  is this value in
3d30: 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   iTable */.  int
3d40: 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 20 20   mustComplete   
3d50: 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55 45 20       /* If TRUE 
3d60: 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20 6d 75  all ORDER BYs mu
3d70: 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  st match */.){. 
3d80: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20   int nErr = 0;. 
3d90: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70   int i, j;.  Exp
3da0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a  rList *pEList;..
3db0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30    if( pSelect==0
3dc0: 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   || pOrderBy==0 
3dd0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
3de0: 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29  ( mustComplete )
3df0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
3e00: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
3e10: 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79  ; i++){ pOrderBy
3e20: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b  ->a[i].done = 0;
3e30: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6c   }.  }.  if( fil
3e40: 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50  lInColumnList(pP
3e50: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29  arse, pSelect) )
3e60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
3e70: 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63    }.  if( pSelec
3e80: 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  t->pPrior ){.   
3e90: 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65 72 62   if( matchOrderb
3ea0: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
3eb0: 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  , pSelect->pPrio
3ec0: 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69 54 61  r, pOrderBy, iTa
3ed0: 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ble, 0) ){.     
3ee0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3ef0: 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20  .  }.  pEList = 
3f00: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
3f10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
3f20: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
3f30: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
3f40: 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
3f50: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e  i].pExpr;.    in
3f60: 74 20 6d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  t match = 0;.   
3f70: 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61   if( pOrderBy->a
3f80: 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69  [i].done ) conti
3f90: 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  nue;.    for(j=0
3fa0: 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; j<pEList->nExp
3fb0: 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; j++){.      i
3fc0: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  f( pEList->a[j].
3fd0: 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e 6f 70  zName && (pE->op
3fe0: 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f  ==TK_ID || pE->o
3ff0: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20 29 7b  p==TK_STRING) ){
4000: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
4010: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
4020: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
4030: 20 20 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 20     char *zLabel 
4040: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
4050: 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 2d  pE->token.z, pE-
4060: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
4070: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
4080: 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  (zLabel);.      
4090: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
40a0: 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65  Cmp(zName, zLabe
40b0: 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20  l)==0 ){ .      
40c0: 20 20 20 20 6d 61 74 63 68 20 3d 20 31 3b 20 0a      match = 1; .
40d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
40e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 61    sqliteFree(zLa
40f0: 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bel);.      }.  
4100: 20 20 20 20 69 66 28 20 6d 61 74 63 68 3d 3d 30      if( match==0
4110: 20 26 26 20 73 71 6c 69 74 65 45 78 70 72 43 6f   && sqliteExprCo
4120: 6d 70 61 72 65 28 70 45 2c 20 70 45 4c 69 73 74  mpare(pE, pEList
4130: 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[j].pExpr) ){
4140: 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 3d  .        match =
4150: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
4160: 20 20 69 66 28 20 6d 61 74 63 68 20 29 7b 0a 20    if( match ){. 
4170: 20 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20         pE->op = 
4180: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
4190: 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d     pE->iColumn =
41a0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e   j;.        pE->
41b0: 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b  iTable = iTable;
41c0: 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
41d0: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31  y->a[i].done = 1
41e0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
41f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4200: 20 20 20 69 66 28 20 21 6d 61 74 63 68 20 26 26     if( !match &&
4210: 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b   mustComplete ){
4220: 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66  .      char zBuf
4230: 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73 70 72 69  [30];.      spri
4240: 6e 74 66 28 7a 42 75 66 2c 22 25 64 22 2c 69 2b  ntf(zBuf,"%d",i+
4250: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
4260: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
4270: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 4f 52 44  e->zErrMsg, "ORD
4280: 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65  ER BY term numbe
4290: 72 20 22 2c 20 7a 42 75 66 2c 20 0a 20 20 20 20  r ", zBuf, .    
42a0: 20 20 20 20 22 20 64 6f 65 73 20 6e 6f 74 20 6d      " does not m
42b0: 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20  atch any result 
42c0: 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
42d0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
42e0: 2b 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  +;.      nErr++;
42f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4300: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4310: 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a   nErr;  .}../*.*
4320: 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
4330: 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
4340: 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
4350: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
4360: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
4370: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
4380: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
4390: 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
43a0: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
43b0: 56 64 62 65 20 2a 73 71 6c 69 74 65 47 65 74 56  Vdbe *sqliteGetV
43c0: 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  dbe(Parse *pPars
43d0: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
43e0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
43f0: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
4400: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
4410: 62 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43  be = sqliteVdbeC
4420: 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62  reate(pParse->db
4430: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4440: 76 3b 0a 7d 0a 20 20 20 20 0a 0a 2f 2a 0a 2a 2a  v;.}.    ../*.**
4450: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4460: 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
4470: 73 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20  ss a query that 
4480: 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75 6e  is really the un
4490: 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73  ion.** or inters
44a0: 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72  ection of two or
44b0: 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71   more separate q
44c0: 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ueries..*/.stati
44d0: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
44e0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
44f0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
4500: 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d  eDest, int iParm
4510: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
4520: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 63 63           /* Succ
4530: 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20  ess code from a 
4540: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
4550: 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
4560: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
4570: 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
4580: 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
4590: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
45a0: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
45b0: 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
45c0: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 62 61  VDBE */.  int ba
45d0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  se;           /*
45e0: 20 42 61 73 65 6c 69 6e 65 20 76 61 6c 75 65 20   Baseline value 
45f0: 66 6f 72 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  for pParse->nTab
4600: 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73   */..  /* Make s
4610: 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
4620: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
4630: 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73  on prior SELECTs
4640: 2e 20 20 4f 6e 6c 79 20 74 68 65 20 0a 20 20 2a  .  Only the .  *
4650: 2a 20 6c 61 73 74 20 53 45 4c 45 43 54 20 69 6e  * last SELECT in
4660: 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
4670: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
4680: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d  ..  */.  if( p==
4690: 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  0 || p->pPrior==
46a0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
46b0: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
46c0: 6f 72 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  or;.  if( pPrior
46d0: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
46e0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
46f0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
4700: 73 67 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61  sg,"ORDER BY cla
4710: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
4720: 61 66 74 65 72 20 22 2c 0a 20 20 20 20 20 20 73  after ",.      s
4730: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
4740: 70 29 2c 20 22 20 6e 6f 74 20 62 65 66 6f 72 65  p), " not before
4750: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
4760: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
4770: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
4780: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
4790: 68 61 76 65 20 61 20 76 61 6c 69 64 20 71 75 65  have a valid que
47a0: 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e  ry engine.  If n
47b0: 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ot, create a new
47c0: 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d   one..  */.  v =
47d0: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
47e0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
47f0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a  =0 ) return 1;..
4800: 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
4810: 20 55 4e 49 4f 4e 20 6f 72 20 49 4e 54 45 52 53   UNION or INTERS
4820: 45 43 54 49 4f 4e 0a 20 20 2a 2f 0a 20 20 62 61  ECTION.  */.  ba
4830: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  se = pParse->nTa
4840: 62 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  b;.  switch( p->
4850: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
4860: 4b 5f 41 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  K_ALL:.    case 
4870: 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63  TK_EXCEPT:.    c
4880: 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a  ase TK_UNION: {.
4890: 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54        int unionT
48a0: 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ab;    /* Cursor
48b0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
48c0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68  emporary table h
48d0: 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f  olding result */
48e0: 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20  .      int op;  
48f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
4900: 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61  f the SRT_ opera
4910: 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74  tions to apply t
4920: 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20  o self */.      
4930: 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20  int priorOp;    
4940: 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65   /* The SRT_ ope
4950: 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  ration to apply 
4960: 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73  to prior selects
4970: 20 2a 2f 0a 0a 20 20 20 20 20 20 70 72 69 6f 72   */..      prior
4980: 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  Op = p->op==TK_A
4990: 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a  LL ? SRT_Table :
49a0: 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
49b0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70 72 69    if( eDest==pri
49c0: 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  orOp ){.        
49d0: 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20  /* We can reuse 
49e0: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
49f0: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
4a00: 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20   SELECT to our. 
4a10: 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e         ** right.
4a20: 20 20 54 68 69 73 20 61 6c 73 6f 20 6d 65 61 6e    This also mean
4a30: 73 20 77 65 20 61 72 65 20 6e 6f 74 20 74 68 65  s we are not the
4a40: 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 65 6c 65   right-most sele
4a50: 63 74 20 61 6e 64 20 73 6f 0a 20 20 20 20 20 20  ct and so.      
4a60: 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 68    ** we cannot h
4a70: 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
4a80: 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a  clause.        *
4a90: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
4aa0: 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20  ab = iParm;.    
4ab0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
4ac0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
4ad0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4ae0: 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65     /* We will ne
4af0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ed to create our
4b00: 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74   own temporary t
4b10: 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  able to hold the
4b20: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  .        ** inte
4b30: 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
4b40: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
4b50: 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
4b60: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
4b70: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
4b80: 4f 72 64 65 72 42 79 20 0a 20 20 20 20 20 20 20  OrderBy .       
4b90: 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79   && matchOrderby
4ba0: 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  ToColumn(pParse,
4bb0: 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c   p, p->pOrderBy,
4bc0: 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 20 29 7b   unionTab, 1) ){
4bd0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
4be0: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
4bf0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70         if( p->op
4c00: 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  !=TK_ALL ){.    
4c10: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4c20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
4c30: 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Temp, unionTab, 
4c40: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
4c50: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4c60: 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 75   OP_KeyAsData, u
4c70: 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20  nionTab, 1);.   
4c80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4c90: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4ca0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
4cb0: 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Temp, unionTab, 
4cc0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
4cd0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
4ce0: 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
4cf0: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
4d00: 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a  r left.      */.
4d10: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
4d20: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
4d30: 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c  pPrior, priorOp,
4d40: 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20   unionTab);.    
4d50: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
4d60: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  n rc;..      /* 
4d70: 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
4d80: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4d90: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
4da0: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
4db0: 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  {.         case 
4dc0: 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d  TK_EXCEPT:  op =
4dd0: 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62   SRT_Except;   b
4de0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
4df0: 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20  ase TK_UNION:   
4e00: 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20  op = SRT_Union; 
4e10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4e20: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
4e30: 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62      op = SRT_Tab
4e40: 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  le;    break;.  
4e50: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
4e60: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
4e70: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
4e80: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70  ct(pParse, p, op
4e90: 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20  , unionTab);.   
4ea0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
4eb0: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
4ec0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
4ed0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
4ee0: 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
4ef0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
4f00: 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
4f10: 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
4f20: 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
4f30: 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
4f40: 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20     */      .    
4f50: 20 20 69 66 28 20 65 44 65 73 74 21 3d 70 72 69    if( eDest!=pri
4f60: 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  orOp ){.        
4f70: 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
4f80: 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
4f90: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
4fa0: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
4fb0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
4fc0: 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
4fd0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
4fe0: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
4ff0: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
5000: 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
5010: 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  t = sqliteVdbeMa
5020: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
5030: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5040: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
5050: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65  , unionTab, iBre
5060: 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74  ak);.        iSt
5070: 61 72 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65  art = sqliteVdbe
5080: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
5090: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c          rc = sel
50a0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
50b0: 72 73 65 2c 20 30 2c 20 75 6e 69 6f 6e 54 61 62  rse, 0, unionTab
50c0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
50d0: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31   p->pOrderBy, -1
5100: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
5110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
5130: 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
5140: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
5150: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
5160: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
5170: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
5180: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5190: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
51a0: 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  _Next, unionTab,
51b0: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
51c0: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
51d0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
51e0: 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
51f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5200: 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
5210: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
5220: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
5230: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  ){.          gen
5240: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 76 2c  erateSortTail(v,
5250: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
5260: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
5270: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
5280: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
5290: 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
52a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
52b0: 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
52c0: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
52d0: 20 69 53 74 61 72 74 3b 0a 0a 20 20 20 20 20 20   iStart;..      
52e0: 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
52f0: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
5300: 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
5310: 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
5320: 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
5330: 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
5340: 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
5350: 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
5360: 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
5370: 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
5380: 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
5390: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
53a0: 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
53b0: 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
53c0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
53d0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  .      if( p->pO
53e0: 72 64 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f  rderBy && matchO
53f0: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70  rderbyToColumn(p
5400: 50 61 72 73 65 2c 70 2c 70 2d 3e 70 4f 72 64 65  Parse,p,p->pOrde
5410: 72 42 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20  rBy,tab1,1) ){. 
5420: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
5430: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
5440: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5450: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74  , OP_OpenTemp, t
5460: 61 62 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ab1, 1);.      s
5470: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5480: 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20  , OP_KeyAsData, 
5490: 74 61 62 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20  tab1, 1);..     
54a0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
54b0: 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ECTs to our left
54c0: 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
54d0: 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20  table "tab1"..  
54e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
54f0: 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70  = sqliteSelect(p
5500: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 53  Parse, pPrior, S
5510: 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b  RT_Union, tab1);
5520: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
5530: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
5540: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
5550: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74  rrent SELECT int
5560: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
5570: 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a  e "tab2".      *
5580: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  /.      sqliteVd
5590: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
55a0: 65 6e 54 65 6d 70 2c 20 74 61 62 32 2c 20 31 29  enTemp, tab2, 1)
55b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
55c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65  beAddOp(v, OP_Ke
55d0: 79 41 73 44 61 74 61 2c 20 74 61 62 32 2c 20 31  yAsData, tab2, 1
55e0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
55f0: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  or = 0;.      rc
5600: 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28   = sqliteSelect(
5610: 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55  pParse, p, SRT_U
5620: 6e 69 6f 6e 2c 20 74 61 62 32 29 3b 0a 20 20 20  nion, tab2);.   
5630: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
5640: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
5650: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5660: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
5670: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65  ate code to take
5680: 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f   the intersectio
5690: 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d  n of the two tem
56a0: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20  porary.      ** 
56b0: 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f  tables..      */
56c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
56d0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
56e0: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
56f0: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
5700: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
5710: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
5720: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
5730: 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20  v);.      iCont 
5740: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
5750: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
5760: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5770: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
5780: 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  b1, iBreak);.   
5790: 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
57a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
57b0: 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61 62 31 2c  P_FullKey, tab1,
57c0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
57d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
57e0: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
57f0: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72   iCont);.      r
5800: 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  c = selectInnerL
5810: 6f 6f 70 28 70 50 61 72 73 65 2c 20 30 2c 20 74  oop(pParse, 0, t
5820: 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ab1, p->pEList->
5830: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5850: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c      p->pOrderBy,
5860: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
5870: 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5890: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
58a0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
58b0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
58c0: 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76  sqliteVdbeResolv
58d0: 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
58e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
58f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
5900: 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
5910: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
5920: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
5930: 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
5940: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5950: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  p(v, OP_Close, t
5960: 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab2, 0);.      s
5970: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5980: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31  , OP_Close, tab1
5990: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
59a0: 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
59b0: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53         generateS
59c0: 6f 72 74 54 61 69 6c 28 76 2c 20 70 2d 3e 70 45  ortTail(v, p->pE
59d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
59e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
59f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  k;.    }.  }.  a
5a00: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
5a10: 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
5a20: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  st );.  if( p->p
5a30: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50  EList->nExpr!=pP
5a40: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
5a50: 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
5a60: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
5a70: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 53 45  se->zErrMsg, "SE
5a80: 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
5a90: 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 22  t and right of "
5aa0: 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
5ab0: 4e 61 6d 65 28 70 2d 3e 6f 70 29 2c 20 22 20 64  Name(p->op), " d
5ac0: 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
5ad0: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
5ae0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 30  sult columns", 0
5af0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
5b00: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
5b10: 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  n 1;.  }.  pPars
5b20: 65 2d 3e 6e 54 61 62 20 3d 20 62 61 73 65 3b 0a  e->nTab = base;.
5b30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
5b40: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
5b50: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
5b60: 74 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 61  t passed in as a
5b70: 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65  n argument to se
5b80: 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20  e if it.** is a 
5b90: 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
5ba0: 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 49 66  max() query.  If
5bb0: 20 69 74 20 69 73 20 61 6e 64 20 74 68 69 73 20   it is and this 
5bc0: 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20  query can be.** 
5bd0: 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
5be0: 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f  a single seek to
5bf0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
5c00: 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65  r end of an inde
5c10: 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72  x,.** then gener
5c20: 61 74 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72  ate the code for
5c30: 20 74 68 69 73 20 53 45 4c 45 43 54 20 72 65 74   this SELECT ret
5c40: 75 72 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20  urn 1.  If this 
5c50: 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d  is not a .** sim
5c60: 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
5c70: 28 29 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72  () query, then r
5c80: 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41  eturn 0;.**.** A
5c90: 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72   simply min() or
5ca0: 20 6d 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f   max() query loo
5cb0: 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ks like this:.**
5cc0: 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69  .**    SELECT mi
5cd0: 6e 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b  n(a) FROM table;
5ce0: 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61  .**    SELECT ma
5cf0: 78 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b  x(a) FROM table;
5d00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79  .**.** The query
5d10: 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61   may have only a
5d20: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
5d30: 20 69 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65   its FROM argume
5d40: 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61  nt.  There.** ca
5d50: 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59  n be no GROUP BY
5d60: 20 6f 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48   or HAVING or WH
5d70: 45 52 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68  ERE clauses.  Th
5d80: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73  e result set mus
5d90: 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28  t.** be the min(
5da0: 29 20 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20  ) or max() of a 
5db0: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66  single column of
5dc0: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65   the table.  The
5dd0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68   column.** in th
5de0: 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
5df0: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
5e00: 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a  e indexed..**.**
5e10: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   The parameters 
5e20: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
5e30: 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
5e40: 66 6f 72 20 73 71 6c 69 74 65 53 65 6c 65 63 74  for sqliteSelect
5e50: 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68  ()..** See the h
5e60: 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
5e70: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f   that routine fo
5e80: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
5e90: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
5ea0: 74 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69  tic int simpleMi
5eb0: 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20  nMaxQuery(Parse 
5ec0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
5ed0: 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  *p, int eDest, i
5ee0: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 45 78 70  nt iParm){.  Exp
5ef0: 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74 20  r *pExpr;.  int 
5f00: 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iCol;.  Table *p
5f10: 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
5f20: 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a  dx;.  int base;.
5f30: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
5f40: 20 6f 70 65 6e 4f 70 3b 0a 20 20 69 6e 74 20 73   openOp;.  int s
5f50: 65 65 6b 4f 70 3b 0a 20 20 69 6e 74 20 63 6f 6e  eekOp;.  int con
5f60: 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 65 4c  t;.  ExprList eL
5f70: 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78  ist;.  struct Ex
5f80: 70 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73  prList_item eLis
5f90: 74 49 74 65 6d 3b 0a 0a 20 20 2f 2a 20 43 68 65  tItem;..  /* Che
5fa0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ck to see if thi
5fb0: 73 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d  s query is a sim
5fc0: 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
5fd0: 28 29 20 71 75 65 72 79 2e 20 20 52 65 74 75 72  () query.  Retur
5fe0: 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69  n.  ** zero if i
5ff0: 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a  t is  not..  */.
6000: 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
6010: 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20  y || p->pHaving 
6020: 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  || p->pWhere ) r
6030: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
6040: 2d 3e 70 53 72 63 2d 3e 6e 49 64 21 3d 31 20 29  ->pSrc->nId!=1 )
6050: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
6060: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
6070: 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
6080: 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  .  pExpr = p->pE
6090: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
60a0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
60b0: 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
60c0: 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
60d0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73   if( pExpr->pLis
60e0: 74 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70  t==0 || pExpr->p
60f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
6100: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
6110: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21   pExpr->iColumn!
6120: 3d 46 4e 5f 4d 69 6e 20 26 26 20 70 45 78 70 72  =FN_Min && pExpr
6130: 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 46 4e 5f 4d 61  ->iColumn!=FN_Ma
6140: 78 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  x ) return 0;.  
6150: 73 65 65 6b 4f 70 20 3d 20 70 45 78 70 72 2d 3e  seekOp = pExpr->
6160: 69 43 6f 6c 75 6d 6e 3d 3d 46 4e 5f 4d 69 6e 20  iColumn==FN_Min 
6170: 3f 20 4f 50 5f 52 65 77 69 6e 64 20 3a 20 4f 50  ? OP_Rewind : OP
6180: 5f 4c 61 73 74 3b 0a 20 20 70 45 78 70 72 20 3d  _Last;.  pExpr =
6190: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
61a0: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
61b0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
61c0: 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
61d0: 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  ;.  iCol = pExpr
61e0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61  ->iColumn;.  pTa
61f0: 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
6200: 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66  ].pTab;..  /* If
6210: 20 77 65 20 67 65 74 20 74 6f 20 68 65 72 65 2c   we get to here,
6220: 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 71 75   it means the qu
6230: 65 72 79 20 69 73 20 6f 66 20 74 68 65 20 63 6f  ery is of the co
6240: 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a  rrect form..  **
6250: 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
6260: 75 72 65 20 77 65 20 68 61 76 65 20 61 6e 20 69  ure we have an i
6270: 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65 20 70 49  ndex and make pI
6280: 64 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a  dx point to the.
6290: 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65    ** appropriate
62a0: 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20   index.  If the 
62b0: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69  min() or max() i
62c0: 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52 20  s on an INTEGER 
62d0: 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79  PRIMARY.  ** key
62e0: 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65   column, no inde
62f0: 78 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73  x is necessary s
6300: 6f 20 73 65 74 20 70 49 64 78 20 74 6f 20 4e 55  o set pIdx to NU
6310: 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20  LL.  If no.  ** 
6320: 75 73 61 62 6c 65 20 69 6e 64 65 78 20 69 73 20  usable index is 
6330: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e  found, return 0.
6340: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c  .  */.  if( iCol
6350: 3c 30 20 29 7b 0a 20 20 20 20 70 49 64 78 20 3d  <0 ){.    pIdx =
6360: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
6370: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
6380: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
6390: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
63a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
63b0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20  Idx->nColumn>=1 
63c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
63d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
63e0: 69 43 6f 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20  iCol ) break;.  
63f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78    }.    if( pIdx
6400: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
6410: 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69    }..  /* Identi
6420: 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
6430: 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
6440: 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  ing the callback
6450: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65  .  This.  ** ste
6460: 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  p is skipped if 
6470: 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
6480: 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ing to a table o
6490: 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  r a memory cell.
64a0: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
64b0: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
64c0: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
64d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
64e0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
64f0: 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ack ){.    gener
6500: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
6510: 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20  Parse, p->pSrc, 
6520: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  p->pEList);.  }.
6530: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67  .  /* Generating
6540: 20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20 74 68   code to find th
6550: 65 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61 78  e min or the max
6560: 2e 20 20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c  .  Basically all
6570: 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f   we have.  ** to
6580: 20 64 6f 20 69 73 20 66 69 6e 64 20 74 68 65 20   do is find the 
6590: 66 69 72 73 74 20 6f 72 20 74 68 65 20 6c 61 73  first or the las
65a0: 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63  t entry in the c
65b0: 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20 49 66  hosen index.  If
65c0: 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20  .  ** the min() 
65d0: 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 74  or max() is on t
65e0: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
65f0: 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e  RY KEY, then fin
6600: 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  d the first.  **
6610: 20 6f 72 20 6c 61 73 74 20 65 6e 74 72 79 20 69   or last entry i
6620: 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  n the main table
6630: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
6640: 61 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69  arse->schemaVeri
6650: 66 69 65 64 20 26 26 20 28 70 50 61 72 73 65 2d  fied && (pParse-
6660: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
6670: 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20  ITE_InTrans)==0 
6680: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
6690: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72  eAddOp(v, OP_Ver
66a0: 69 66 79 43 6f 6f 6b 69 65 2c 20 70 50 61 72 73  ifyCookie, pPars
66b0: 65 2d 3e 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f  e->db->schema_co
66c0: 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 70 50  okie, 0);.    pP
66d0: 61 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69  arse->schemaVeri
66e0: 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  fied = 1;.  }.  
66f0: 6f 70 65 6e 4f 70 20 3d 20 70 54 61 62 2d 3e 69  openOp = pTab->i
6700: 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 41  sTemp ? OP_OpenA
6710: 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 3b 0a 20 20  ux : OP_Open;.  
6720: 62 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  base = pParse->n
6730: 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  Tab;.  sqliteVdb
6740: 65 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70  eAddOp(v, openOp
6750: 2c 20 62 61 73 65 2c 20 70 54 61 62 2d 3e 74 6e  , base, pTab->tn
6760: 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  um);.  sqliteVdb
6770: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
6780: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33   pTab->zName, P3
6790: 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20  _STATIC);.  if( 
67a0: 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pIdx==0 ){.    s
67b0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
67c0: 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20  , seekOp, base, 
67d0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
67e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
67f0: 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 62 61 73 65  (v, openOp, base
6800: 2b 31 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b  +1, pIdx->tnum);
6810: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
6820: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
6830: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Idx->zName, P3_S
6840: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
6850: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73  teVdbeAddOp(v, s
6860: 65 65 6b 4f 70 2c 20 62 61 73 65 2b 31 2c 20 30  eekOp, base+1, 0
6870: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
6880: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
6890: 52 65 63 6e 6f 2c 20 62 61 73 65 2b 31 2c 20 30  Recno, base+1, 0
68a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
68b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
68c0: 73 65 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a  se, base+1, 0);.
68d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
68e0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 54 6f  dOp(v, OP_MoveTo
68f0: 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a  , base, 0);.  }.
6900: 20 20 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20    eList.nExpr = 
6910: 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c 69  1;.  memset(&eLi
6920: 73 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  stItem, 0, sizeo
6930: 66 28 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20  f(eListItem));. 
6940: 20 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69 73   eList.a = &eLis
6950: 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61  tItem;.  eList.a
6960: 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70  [0].pExpr = pExp
6970: 72 3b 0a 20 20 63 6f 6e 74 20 3d 20 73 71 6c 69  r;.  cont = sqli
6980: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
6990: 76 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65  v);.  selectInne
69a0: 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 26 65  rLoop(pParse, &e
69b0: 4c 69 73 74 2c 20 62 61 73 65 2c 20 31 2c 20 30  List, base, 1, 0
69c0: 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61  , -1, eDest, iPa
69d0: 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74 29 3b  rm, cont, cont);
69e0: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73  .  sqliteVdbeRes
69f0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e  olveLabel(v, con
6a00: 74 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65  t);.  sqliteVdbe
6a10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
6a20: 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 72  e, base, 0);.  r
6a30: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
6a40: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
6a50: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 45  for the given SE
6a60: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
6a70: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
6a80: 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65  s are distribute
6a90: 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79  d in various way
6aa0: 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  s depending on t
6ab0: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65  he.** value of e
6ac0: 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a  Dest and iParm..
6ad0: 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74 20  **.**     eDest 
6ae0: 56 61 6c 75 65 20 20 20 20 20 20 20 52 65 73 75  Value       Resu
6af0: 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d  lt.**     ------
6b00: 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
6b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b30: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54  -----.**     SRT
6b40: 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76  _Callback    Inv
6b50: 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  oke the callback
6b60: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
6b70: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
6b80: 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20  **     SRT_Mem  
6b90: 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69 72         Store fir
6ba0: 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d  st result in mem
6bb0: 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a  ory cell iParm.*
6bc0: 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74  *.**     SRT_Set
6bd0: 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 72           Store r
6be0: 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f  esults as keys o
6bf0: 66 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 63  f a table with c
6c00: 75 72 73 6f 72 20 69 50 61 72 6d 0a 2a 2a 0a 2a  ursor iParm.**.*
6c10: 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20  *     SRT_Union 
6c20: 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
6c30: 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20  lts as a key in 
6c40: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
6c50: 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  e iParm.**.**   
6c60: 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20    SRT_Except    
6c70: 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73    Remove results
6c80: 20 66 6f 72 6d 20 74 68 65 20 74 65 6d 70 6f 72   form the tempor
6c90: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
6ca0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54  .**.**     SRT_T
6cb0: 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65  able       Store
6cc0: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70   results in temp
6cd0: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
6ce0: 6d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  m.**.** This rou
6cf0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
6d00: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
6d10: 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72  s.  If any error
6d20: 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74  s are.** encount
6d30: 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70  ered, then an ap
6d40: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
6d50: 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
6d60: 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  in.** pParse->zE
6d70: 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrMsg..**.** Thi
6d80: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e  s routine does N
6d90: 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65  OT free the Sele
6da0: 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  ct structure pas
6db0: 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20  sed in.  The.** 
6dc0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
6dd0: 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61   needs to do tha
6de0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
6df0: 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
6e00: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
6e10: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
6e20: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
6e30: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
6e40: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
6e50: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
6e60: 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74   coded. */.  int
6e70: 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20   eDest,         
6e80: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 3a 20 53      /* One of: S
6e90: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 4d 65 6d 20  RT_Callback Mem 
6ea0: 53 65 74 20 55 6e 69 6f 6e 20 45 78 63 65 70 74  Set Union Except
6eb0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20   */.  int iParm 
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6ed0: 53 61 76 65 20 72 65 73 75 6c 74 20 69 6e 20 74  Save result in t
6ee0: 68 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  his memory locat
6ef0: 69 6f 6e 2c 20 69 66 20 3e 3d 30 20 2a 2f 0a 29  ion, if >=0 */.)
6f00: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
6f10: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a  reInfo *pWInfo;.
6f20: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
6f30: 20 69 73 41 67 67 20 3d 20 30 3b 20 20 20 20 20   isAgg = 0;     
6f40: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
6f50: 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
6f60: 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
6f70: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
6f80: 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
6f90: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
6fa0: 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 49 64 4c  xtract. */.  IdL
6fb0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
6fc0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
6fd0: 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
6fe0: 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
6ff0: 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
7000: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
7010: 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
7020: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
7030: 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f   *pOrderBy;    /
7040: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
7050: 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
7060: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
7070: 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
7080: 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
7090: 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
70a0: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
70b0: 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20  pHaving;        
70c0: 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63   /* The HAVING c
70d0: 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
70e0: 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  ULL */.  int isD
70f0: 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
7100: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
7110: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
7120: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
7130: 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20  int distinct;   
7140: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
7150: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
7160: 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20  istinct set */. 
7170: 20 69 6e 74 20 62 61 73 65 3b 20 20 20 20 20 20   int base;      
7180: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
7190: 20 63 75 72 73 6f 72 20 61 76 61 69 6c 61 62 6c   cursor availabl
71a0: 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 20 20 69  e for use */.  i
71b0: 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
71c0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
71d0: 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
71e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  is function */..
71f0: 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c    if( sqlite_mal
7200: 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70 50  loc_failed || pP
7210: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d  arse->nErr || p=
7220: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a  =0 ) return 1;..
7230: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
7240: 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20   are a sequence 
7250: 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74  of queries, do t
7260: 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20  he earlier ones 
7270: 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  first..  */.  if
7280: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
7290: 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
72a0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
72b0: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a   eDest, iParm);.
72c0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c    }..  /* Make l
72d0: 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74  ocal copies of t
72e0: 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f  he parameters fo
72f0: 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20  r this query..  
7300: 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  */.  pTabList = 
7310: 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68 65 72  p->pSrc;.  pWher
7320: 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
7330: 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
7340: 4f 72 64 65 72 42 79 3b 0a 20 20 70 47 72 6f 75  OrderBy;.  pGrou
7350: 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
7360: 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70  y;.  pHaving = p
7370: 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 44  ->pHaving;.  isD
7380: 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
7390: 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 53  istinct;..  /* S
73a0: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
73b0: 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d  value of pParse-
73c0: 3e 6e 54 61 62 2e 20 20 52 65 73 74 6f 72 65 20  >nTab.  Restore 
73d0: 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72  this value befor
73e0: 65 0a 20 20 2a 2a 20 77 65 20 65 78 69 74 2e 0a  e.  ** we exit..
73f0: 20 20 2a 2f 0a 20 20 62 61 73 65 20 3d 20 70 50    */.  base = pP
7400: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 0a 20 20 2f  arse->nTab;..  /
7410: 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65  * .  ** Do not e
7420: 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67  ven attempt to g
7430: 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65  enerate any code
7440: 20 69 66 20 77 65 20 68 61 76 65 20 61 6c 72 65   if we have alre
7450: 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72  ady seen.  ** er
7460: 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69 73  rors before this
7470: 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e   routine starts.
7480: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
7490: 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74  se->nErr>0 ) got
74a0: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
74b0: 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
74c0: 79 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74  y table in the t
74d0: 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 63 72  able list and cr
74e0: 65 61 74 65 20 61 6e 20 61 70 70 72 6f 70 72 69  eate an appropri
74f0: 61 74 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 6c  ate.  ** columnl
7500: 69 73 74 20 69 6e 20 70 45 4c 69 73 74 20 69 66  ist in pEList if
7510: 20 74 68 65 72 65 20 69 73 6e 27 74 20 6f 6e 65   there isn't one
7520: 20 61 6c 72 65 61 64 79 2e 20 20 28 54 68 65 20   already.  (The 
7530: 70 61 72 73 65 72 20 6c 65 61 76 65 73 0a 20 20  parser leaves.  
7540: 2a 2a 20 61 20 4e 55 4c 4c 20 69 6e 20 74 68 65  ** a NULL in the
7550: 20 70 2d 3e 70 45 4c 69 73 74 20 69 66 20 74 68   p->pEList if th
7560: 65 20 53 51 4c 20 73 61 69 64 20 22 53 45 4c 45  e SQL said "SELE
7570: 43 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e 22 29 0a  CT * FROM ...").
7580: 20 20 2a 2f 0a 20 20 69 66 28 20 66 69 6c 6c 49    */.  if( fillI
7590: 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72  nColumnList(pPar
75a0: 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 67 6f  se, p) ){.    go
75b0: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
75c0: 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d   }.  pEList = p-
75d0: 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
75e0: 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  EList==0 ) goto 
75f0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
7600: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 74 65 6d  * Allocate a tem
7610: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
7620: 75 73 65 20 66 6f 72 20 74 68 65 20 44 49 53 54  use for the DIST
7630: 49 4e 43 54 20 73 65 74 2c 20 69 66 0a 20 20 2a  INCT set, if.  *
7640: 2a 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  * necessary.  Th
7650: 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20  is must be done 
7660: 65 61 72 6c 79 20 74 6f 20 61 6c 6c 6f 63 61 74  early to allocat
7670: 65 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 66  e the cursor bef
7680: 6f 72 65 0a 20 20 2a 2a 20 61 6e 79 20 63 61 6c  ore.  ** any cal
7690: 6c 73 20 74 6f 20 73 71 6c 69 74 65 45 78 70 72  ls to sqliteExpr
76a0: 52 65 73 6f 6c 76 65 49 64 73 28 29 2e 0a 20 20  ResolveIds()..  
76b0: 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69  */.  if( isDisti
76c0: 6e 63 74 20 29 7b 0a 20 20 20 20 64 69 73 74 69  nct ){.    disti
76d0: 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
76e0: 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ab++;.  }else{. 
76f0: 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31     distinct = -1
7700: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
7710: 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79  riting to memory
7720: 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61   or generating a
7730: 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61   set.  ** only a
7740: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d   single column m
7750: 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ay be output..  
7760: 2a 2f 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d  */.  if( (eDest=
7770: 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
7780: 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70  t==SRT_Set) && p
7790: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29  EList->nExpr>1 )
77a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
77b0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
77c0: 45 72 72 4d 73 67 2c 20 22 6f 6e 6c 79 20 61 20  ErrMsg, "only a 
77d0: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c  single result al
77e0: 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20  lowed for ".    
77f0: 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61     "a SELECT tha
7800: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
7810: 65 78 70 72 65 73 73 69 6f 6e 22 2c 20 30 29 3b  expression", 0);
7820: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
7830: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  r++;.    goto se
7840: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
7850: 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20   /* ORDER BY is 
7860: 69 67 6e 6f 72 65 64 20 69 66 20 77 65 20 61 72  ignored if we ar
7870: 65 20 6e 6f 74 20 73 65 6e 64 69 6e 67 20 74 68  e not sending th
7880: 65 20 72 65 73 75 6c 74 20 74 6f 20 61 20 63 61  e result to a ca
7890: 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  llback..  */.  i
78a0: 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 43 61  f( eDest!=SRT_Ca
78b0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 70 4f  llback ){.    pO
78c0: 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
78d0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63  .  /* Allocate c
78e0: 75 72 73 6f 72 73 20 66 6f 72 20 22 65 78 70 72  ursors for "expr
78f0: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
7900: 22 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 20 20  " constructs..  
7910: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
7920: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
7930: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  ++){.    sqliteE
7940: 78 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65  xprResolveInSele
7950: 63 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  ct(pParse, pELis
7960: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
7970: 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65 72 65    }.  if( pWhere
7980: 20 29 20 73 71 6c 69 74 65 45 78 70 72 52 65 73   ) sqliteExprRes
7990: 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28 70 50 61  olveInSelect(pPa
79a0: 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  rse, pWhere);.  
79b0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
79c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
79d0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
79e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
79f0: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 6e 53  teExprResolveInS
7a00: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 4f  elect(pParse, pO
7a10: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
7a20: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pr);.    }.  }. 
7a30: 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
7a40: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7a50: 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
7a60: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
7a70: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 6e  iteExprResolveIn
7a80: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
7a90: 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45  GroupBy->a[i].pE
7aa0: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
7ab0: 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 20    if( pHaving ) 
7ac0: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
7ad0: 65 49 6e 53 65 6c 65 63 74 28 70 50 61 72 73 65  eInSelect(pParse
7ae0: 2c 20 70 48 61 76 69 6e 67 29 3b 0a 0a 20 20 2f  , pHaving);..  /
7af0: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
7b00: 20 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20   we should have 
7b10: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6c 20 74 68  allocated all th
7b20: 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77  e cursors that w
7b30: 65 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 68  e.  ** need to h
7b40: 61 6e 64 6c 65 20 73 75 62 71 75 65 72 79 73 20  andle subquerys 
7b50: 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 74 61  and temporary ta
7b60: 62 6c 65 73 2e 20 20 46 72 6f 6d 20 68 65 72 65  bles.  From here
7b70: 20 6f 6e 20 77 65 0a 20 20 2a 2a 20 61 72 65 20   on we.  ** are 
7b80: 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 6b 65 65  committed to kee
7b90: 70 69 6e 67 20 74 68 65 20 73 61 6d 65 20 76 61  ping the same va
7ba0: 6c 75 65 20 66 6f 72 20 70 50 61 72 73 65 2d 3e  lue for pParse->
7bb0: 6e 54 61 62 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nTab..  **.  ** 
7bc0: 52 65 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75  Resolve the colu
7bd0: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 64 6f 20  mn names and do 
7be0: 61 20 73 65 6d 61 6e 74 69 63 73 20 63 68 65 63  a semantics chec
7bf0: 6b 20 6f 6e 20 61 6c 6c 20 74 68 65 20 65 78 70  k on all the exp
7c00: 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
7c10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
7c20: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
7c30: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
7c40: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
7c50: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
7c60: 30 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  0, pEList->a[i].
7c70: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
7c80: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
7c90: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
7ca0: 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70  qliteExprCheck(p
7cb0: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
7cc0: 5b 69 5d 2e 70 45 78 70 72 2c 20 31 2c 20 26 69  [i].pExpr, 1, &i
7cd0: 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67  sAgg) ){.      g
7ce0: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
7cf0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
7d00: 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 69 66  pWhere ){.    if
7d10: 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  ( sqliteExprReso
7d20: 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
7d30: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  TabList, pEList,
7d40: 20 70 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20   pWhere) ){.    
7d50: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
7d60: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
7d70: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
7d80: 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c  (pParse, pWhere,
7d90: 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   0, 0) ){.      
7da0: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
7db0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
7dc0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
7dd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
7de0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
7df0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
7e00: 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
7e10: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
7e20: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49 73  if( sqliteExprIs
7e30: 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b 0a  Constant(pE) ){.
7e40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
7e50: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
7e60: 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20 20 20  >zErrMsg, .     
7e70: 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
7e80: 59 20 65 78 70 72 65 73 73 69 6f 6e 73 20 73 68  Y expressions sh
7e90: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6f 6e 73  ould not be cons
7ea0: 74 61 6e 74 22 2c 20 30 29 3b 0a 20 20 20 20 20  tant", 0);.     
7eb0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
7ec0: 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  +;.        goto 
7ed0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
7ee0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
7ef0: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
7f00: 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  ds(pParse, pTabL
7f10: 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 29  ist, pEList, pE)
7f20: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
7f30: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
7f40: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
7f50: 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70  qliteExprCheck(p
7f60: 50 61 72 73 65 2c 20 70 45 2c 20 69 73 41 67 67  Parse, pE, isAgg
7f70: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
7f80: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
7f90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7fa0: 20 7d 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42   }.  if( pGroupB
7fb0: 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  y ){.    for(i=0
7fc0: 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
7fd0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
7fe0: 20 45 78 70 72 20 2a 70 45 20 3d 20 70 47 72 6f   Expr *pE = pGro
7ff0: 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  upBy->a[i].pExpr
8000: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
8010: 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  teExprIsConstant
8020: 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (pE) ){.        
8030: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
8040: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
8050: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
8060: 22 47 52 4f 55 50 20 42 59 20 65 78 70 72 65 73  "GROUP BY expres
8070: 73 69 6f 6e 73 20 73 68 6f 75 6c 64 20 6e 6f 74  sions should not
8080: 20 62 65 20 63 6f 6e 73 74 61 6e 74 22 2c 20 30   be constant", 0
8090: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
80a0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
80b0: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
80c0: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
80d0: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
80e0: 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
80f0: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
8100: 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20  ist, pE) ){.    
8110: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
8120: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
8130: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
8140: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
8150: 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a  E, isAgg, 0) ){.
8160: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
8170: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
8180: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8190: 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
81a0: 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20  if( pGroupBy==0 
81b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
81c0: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
81d0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 61 20 47 52  ->zErrMsg, "a GR
81e0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73  OUP BY clause is
81f0: 20 72 65 71 75 69 72 65 64 20 22 0a 20 20 20 20   required ".    
8200: 20 20 20 20 20 22 62 65 66 6f 72 65 20 48 41 56       "before HAV
8210: 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ING", 0);.      
8220: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
8230: 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
8240: 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
8250: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52   if( sqliteExprR
8260: 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
8270: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
8280: 73 74 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a  st, pHaving) ){.
8290: 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
82a0: 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
82b0: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43   if( sqliteExprC
82c0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 48 61  heck(pParse, pHa
82d0: 76 69 6e 67 2c 20 69 73 41 67 67 2c 20 30 29 20  ving, isAgg, 0) 
82e0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
82f0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
8300: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
8310: 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 20  for the special 
8320: 63 61 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20  case of a min() 
8330: 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
8340: 6e 20 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a  n by itself.  **
8350: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
8360: 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  et..  */.  if( s
8370: 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79  impleMinMaxQuery
8380: 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73  (pParse, p, eDes
8390: 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a 20 20 20  t, iParm) ){.   
83a0: 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74   rc = 0;.    got
83b0: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
83c0: 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  }..  /* Begin ge
83d0: 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
83e0: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
83f0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
8400: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f  .  if( v==0 ) go
8410: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
8420: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
8430: 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
8440: 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
8450: 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  OM clause.  */. 
8460: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
8470: 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
8480: 0a 20 20 20 20 69 6e 74 20 6f 6c 64 4e 54 61 62  .    int oldNTab
8490: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
84a0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
84b0: 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  i].pTab;.    if(
84c0: 20 21 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69   !pTab->isTransi
84d0: 65 6e 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ent ) continue;.
84e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
84f0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
8500: 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 6f 6c 64  ct!=0 );.    old
8510: 4e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  NTab = pParse->n
8520: 54 61 62 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Tab;.    pParse-
8530: 3e 6e 54 61 62 20 2b 3d 20 69 2b 31 3b 0a 20 20  >nTab += i+1;.  
8540: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8550: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
8560: 2c 20 6f 6c 64 4e 54 61 62 2b 69 2c 20 30 29 3b  , oldNTab+i, 0);
8570: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63  .    sqliteSelec
8580: 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  t(pParse, pTabLi
8590: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
85a0: 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 6f 6c 64  , SRT_Table, old
85b0: 4e 54 61 62 2b 69 29 3b 0a 20 20 20 20 70 50 61  NTab+i);.    pPa
85c0: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6f 6c 64 4e  rse->nTab = oldN
85d0: 54 61 62 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  Tab;.  }..  /* D
85e0: 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66  o an analysis of
85f0: 20 61 67 67 72 65 67 61 74 65 20 65 78 70 72 65   aggregate expre
8600: 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73  ssions..  */.  s
8610: 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49 6e  qliteAggregateIn
8620: 66 6f 52 65 73 65 74 28 70 50 61 72 73 65 29 3b  foReset(pParse);
8630: 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a  .  if( isAgg ){.
8640: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
8650: 73 65 2d 3e 6e 41 67 67 3d 3d 30 20 26 26 20 70  se->nAgg==0 && p
8660: 50 61 72 73 65 2d 3e 69 41 67 67 43 6f 75 6e 74  Parse->iAggCount
8670: 3c 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  <0 );.    for(i=
8680: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
8690: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
86a0: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 41 6e  if( sqliteExprAn
86b0: 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
86c0: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
86d0: 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
86e0: 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
86f0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
8700: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47      }.    if( pG
8710: 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
8720: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75  for(i=0; i<pGrou
8730: 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pBy->nExpr; i++)
8740: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
8750: 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
8760: 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
8770: 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  , pGroupBy->a[i]
8780: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
8790: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
87a0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
87b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
87c0: 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 26 26    if( pHaving &&
87d0: 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79   sqliteExprAnaly
87e0: 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61  zeAggregates(pPa
87f0: 72 73 65 2c 20 70 48 61 76 69 6e 67 29 20 29 7b  rse, pHaving) ){
8800: 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
8810: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
8820: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
8830: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
8840: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
8850: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
8860: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
8870: 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
8880: 73 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  s(pParse, pOrder
8890: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  By->a[i].pExpr) 
88a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
88b0: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
88c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
88d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
88e0: 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 0a  Set the limiter.
88f0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c    */.  if( p->nL
8900: 69 6d 69 74 3c 3d 30 20 29 7b 0a 20 20 20 20 70  imit<=0 ){.    p
8910: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->nOffset = 0;. 
8920: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
8930: 70 2d 3e 6e 4f 66 66 73 65 74 3c 30 20 29 20 70  p->nOffset<0 ) p
8940: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->nOffset = 0;. 
8950: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8960: 4f 70 28 76 2c 20 4f 50 5f 4c 69 6d 69 74 2c 20  Op(v, OP_Limit, 
8970: 70 2d 3e 6e 4c 69 6d 69 74 2c 20 70 2d 3e 6e 4f  p->nLimit, p->nO
8980: 66 66 73 65 74 29 3b 0a 20 20 7d 0a 20 20 20 20  ffset);.  }.    
8990: 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
89a0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20  column names if 
89b0: 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
89c0: 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   in the callback
89d0: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65  .  This.  ** ste
89e0: 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  p is skipped if 
89f0: 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
8a00: 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ing to a table o
8a10: 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  r a memory cell.
8a20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
8a30: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
8a40: 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
8a50: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
8a60: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
8a70: 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
8a80: 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
8a90: 61 74 6f 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ator.  */.  if( 
8aa0: 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 71 6c  isAgg ){.    sql
8ab0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8ac0: 4f 50 5f 41 67 67 52 65 73 65 74 2c 20 30 2c 20  OP_AggReset, 0, 
8ad0: 70 50 61 72 73 65 2d 3e 6e 41 67 67 29 3b 0a 20  pParse->nAgg);. 
8ae0: 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d     if( pGroupBy=
8af0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
8b00: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8b10: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
8b20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
8b30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
8b40: 46 6f 63 75 73 2c 20 30 2c 20 30 29 3b 0a 20 20  Focus, 0, 0);.  
8b50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
8b60: 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
8b70: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
8b80: 2a 70 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28  *pE;.        if(
8b90: 20 21 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69   !pParse->aAgg[i
8ba0: 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e  ].isAgg ) contin
8bb0: 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d  ue;.        pE =
8bc0: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
8bd0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
8be0: 61 73 73 65 72 74 28 20 70 45 3d 3d 30 20 7c 7c  assert( pE==0 ||
8bf0: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f   pE->op==TK_AGG_
8c00: 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
8c10: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 3d 3d      assert( pE==
8c20: 30 20 7c 7c 20 28 70 45 2d 3e 70 4c 69 73 74 21  0 || (pE->pList!
8c30: 3d 30 20 26 26 20 70 45 2d 3e 70 4c 69 73 74 2d  =0 && pE->pList-
8c40: 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 20 20  >nExpr==1) );.  
8c50: 20 20 20 20 20 20 69 66 28 20 70 45 3d 3d 30 20        if( pE==0 
8c60: 7c 7c 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  || pE->iColumn==
8c70: 46 4e 5f 53 75 6d 20 29 7b 0a 20 20 20 20 20 20  FN_Sum ){.      
8c80: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8c90: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
8ca0: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
8cb0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8cc0: 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 53 65 74  dOp(v, OP_AggSet
8cd0: 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  , 0, i);.       
8ce0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
8cf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8d00: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
8d10: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
8d20: 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c  mory cell to NUL
8d30: 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  L.  */.  if( eDe
8d40: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20  st==SRT_Mem ){. 
8d50: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8d60: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
8d70: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
8d80: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8d90: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
8da0: 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  m, 1);.  }..  /*
8db0: 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
8dc0: 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20  ase scan.  */.  
8dd0: 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29  if( isDistinct )
8de0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
8df0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
8e00: 54 65 6d 70 2c 20 64 69 73 74 69 6e 63 74 2c 20  Temp, distinct, 
8e10: 31 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  1);.  }.  pWInfo
8e20: 20 3d 20 73 71 6c 69 74 65 57 68 65 72 65 42 65   = sqliteWhereBe
8e30: 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
8e40: 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30 29  List, pWhere, 0)
8e50: 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d  ;.  if( pWInfo==
8e60: 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
8e70: 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 74  end;..  /* Use t
8e80: 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65  he standard inne
8e90: 72 20 6c 6f 6f 70 20 69 66 20 77 65 20 61 72 65  r loop if we are
8ea0: 20 6e 6f 74 20 64 65 61 6c 69 6e 67 20 77 69 74   not dealing wit
8eb0: 68 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65  h.  ** aggregate
8ec0: 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  s.  */.  if( !is
8ed0: 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73  Agg ){.    if( s
8ee0: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
8ef0: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 30  Parse, pEList, 0
8f00: 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64  , 0, pOrderBy, d
8f10: 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 20  istinct, eDest, 
8f20: 69 50 61 72 6d 2c 0a 20 20 20 20 20 20 20 20 20  iParm,.         
8f30: 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
8f40: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57  o->iContinue, pW
8f50: 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 20 29 7b  Info->iBreak) ){
8f60: 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  .       goto sel
8f70: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
8f80: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61   }..  /* If we a
8f90: 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
8fa0: 61 67 67 72 65 67 61 74 65 73 2c 20 74 68 65 6e  aggregates, then
8fb0: 20 74 6f 20 74 68 65 20 73 70 65 63 69 61 6c 20   to the special 
8fc0: 61 67 67 72 65 67 61 74 65 0a 20 20 2a 2a 20 70  aggregate.  ** p
8fd0: 72 6f 63 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a  rocessing.  .  *
8fe0: 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 66  /.  else{.    if
8ff0: 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
9000: 20 20 20 20 69 6e 74 20 6c 62 6c 31 3b 0a 20 20      int lbl1;.  
9010: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
9020: 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
9030: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
9040: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
9050: 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
9060: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
9070: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
9080: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9090: 4d 61 6b 65 4b 65 79 2c 20 70 47 72 6f 75 70 42  MakeKey, pGroupB
90a0: 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20  y->nExpr, 0);.  
90b0: 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74      lbl1 = sqlit
90c0: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
90d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
90e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
90f0: 67 67 46 6f 63 75 73 2c 20 30 2c 20 6c 62 6c 31  ggFocus, 0, lbl1
9100: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
9110: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
9120: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
9130: 69 66 28 20 70 50 61 72 73 65 2d 3e 61 41 67 67  if( pParse->aAgg
9140: 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74  [i].isAgg ) cont
9150: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71  inue;.        sq
9160: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
9170: 72 73 65 2c 20 70 50 61 72 73 65 2d 3e 61 41 67  rse, pParse->aAg
9180: 67 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  g[i].pExpr);.   
9190: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
91a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 53 65  ddOp(v, OP_AggSe
91b0: 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20  t, 0, i);.      
91c0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  }.      sqliteVd
91d0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
91e0: 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20  , lbl1);.    }. 
91f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
9200: 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29  arse->nAgg; i++)
9210: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
9220: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 0a  ;.      int op;.
9230: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
9240: 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  e->aAgg[i].isAgg
9250: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9260: 20 20 20 70 45 20 3d 20 70 50 61 72 73 65 2d 3e     pE = pParse->
9270: 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  aAgg[i].pExpr;. 
9280: 20 20 20 20 20 69 66 28 20 70 45 3d 3d 30 20 29       if( pE==0 )
9290: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
92a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
92b0: 41 67 67 49 6e 63 72 2c 20 31 2c 20 69 29 3b 0a  AggIncr, 1, i);.
92c0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
92d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
92e0: 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 3d 3d  assert( pE->op==
92f0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
9300: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9310: 20 70 45 2d 3e 70 4c 69 73 74 21 3d 30 20 26 26   pE->pList!=0 &&
9320: 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70   pE->pList->nExp
9330: 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  r==1 );.      sq
9340: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
9350: 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e  rse, pE->pList->
9360: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
9370: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
9380: 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c  Op(v, OP_AggGet,
9390: 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 77   0, i);.      sw
93a0: 69 74 63 68 28 20 70 45 2d 3e 69 43 6f 6c 75 6d  itch( pE->iColum
93b0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  n ){.        cas
93c0: 65 20 46 4e 5f 4d 69 6e 3a 20 20 6f 70 20 3d 20  e FN_Min:  op = 
93d0: 4f 50 5f 4d 69 6e 3b 20 20 20 62 72 65 61 6b 3b  OP_Min;   break;
93e0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e  .        case FN
93f0: 5f 4d 61 78 3a 20 20 6f 70 20 3d 20 4f 50 5f 4d  _Max:  op = OP_M
9400: 61 78 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ax;   break;.   
9410: 20 20 20 20 20 63 61 73 65 20 46 4e 5f 41 76 67       case FN_Avg
9420: 3a 20 20 6f 70 20 3d 20 4f 50 5f 41 64 64 3b 20  :  op = OP_Add; 
9430: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
9440: 20 63 61 73 65 20 46 4e 5f 53 75 6d 3a 20 20 6f   case FN_Sum:  o
9450: 70 20 3d 20 4f 50 5f 41 64 64 3b 20 20 20 62 72  p = OP_Add;   br
9460: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9470: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
9480: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b  Op(v, op, 0, 0);
9490: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
94a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
94b0: 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20  Set, 0, i);.    
94c0: 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 45 6e 64  }.  }...  /* End
94d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
94e0: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20  an loop..  */.  
94f0: 73 71 6c 69 74 65 57 68 65 72 65 45 6e 64 28 70  sqliteWhereEnd(p
9500: 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66  WInfo);..  /* If
9510: 20 77 65 20 61 72 65 20 70 72 6f 63 65 73 73 69   we are processi
9520: 6e 67 20 61 67 67 72 65 67 61 74 65 73 2c 20 77  ng aggregates, w
9530: 65 20 6e 65 65 64 20 74 6f 20 73 65 74 20 75 70  e need to set up
9540: 20 61 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20   a second loop. 
9550: 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20   ** over all of 
9560: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 76 61  the aggregate va
9570: 6c 75 65 73 20 61 6e 64 20 70 72 6f 63 65 73 73  lues and process
9580: 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66   them..  */.  if
9590: 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69  ( isAgg ){.    i
95a0: 6e 74 20 65 6e 64 61 67 67 20 3d 20 73 71 6c 69  nt endagg = sqli
95b0: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
95c0: 76 29 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  v);.    int star
95d0: 74 61 67 67 3b 0a 20 20 20 20 73 74 61 72 74 61  tagg;.    starta
95e0: 67 67 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  gg = sqliteVdbeA
95f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 4e 65  ddOp(v, OP_AggNe
9600: 78 74 2c 20 30 2c 20 65 6e 64 61 67 67 29 3b 0a  xt, 0, endagg);.
9610: 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41      pParse->useA
9620: 67 67 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  gg = 1;.    if( 
9630: 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
9640: 20 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c   sqliteExprIfFal
9650: 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
9660: 6e 67 2c 20 73 74 61 72 74 61 67 67 29 3b 0a 20  ng, startagg);. 
9670: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 65 6c     }.    if( sel
9680: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
9690: 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20  rse, pEList, 0, 
96a0: 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73  0, pOrderBy, dis
96b0: 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 20 69 50  tinct, eDest, iP
96c0: 61 72 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  arm,.           
96d0: 20 20 20 20 20 20 20 20 20 73 74 61 72 74 61 67           startag
96e0: 67 2c 20 65 6e 64 61 67 67 29 20 29 7b 0a 20 20  g, endagg) ){.  
96f0: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
9700: 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  end;.    }.    s
9710: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
9720: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74  , OP_Goto, 0, st
9730: 61 72 74 61 67 67 29 3b 0a 20 20 20 20 73 71 6c  artagg);.    sql
9740: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
9750: 62 65 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a  bel(v, endagg);.
9760: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
9770: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20  dOp(v, OP_Noop, 
9780: 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  0, 0);.    pPars
9790: 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 20  e->useAgg = 0;. 
97a0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
97b0: 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
97c0: 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65   clause, then we
97d0: 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68   need to sort th
97e0: 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61  e results.  ** a
97f0: 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20  nd send them to 
9800: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65  the callback one
9810: 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   by one..  */.  
9820: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
9830: 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
9840: 54 61 69 6c 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Tail(v, pEList->
9850: 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 70 50  nExpr);.  }.  pP
9860: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 62 61 73  arse->nTab = bas
9870: 65 3b 0a 0a 0a 20 20 2f 2a 20 49 73 73 75 65 20  e;...  /* Issue 
9880: 61 20 6e 75 6c 6c 20 63 61 6c 6c 62 61 63 6b 20  a null callback 
9890: 69 66 20 74 68 61 74 20 69 73 20 77 68 61 74 20  if that is what 
98a0: 74 68 65 20 75 73 65 72 20 77 61 6e 74 73 2e 0a  the user wants..
98b0: 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 61 72    */.  if( (pPar
98c0: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
98d0: 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62  SQLITE_NullCallb
98e0: 61 63 6b 29 21 3d 30 20 26 26 20 65 44 65 73 74  ack)!=0 && eDest
98f0: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
9900: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
9910: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
9920: 43 61 6c 6c 62 61 63 6b 2c 20 70 45 4c 69 73 74  Callback, pEList
9930: 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  ->nExpr, 0);.  }
9940: 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43  ..  /* The SELEC
9950: 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  T was successful
9960: 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20  ly coded.   Set 
9970: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
9980: 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  to 0.  ** to ind
9990: 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e  icate no errors.
99a0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a  .  */.  rc = 0;.
99b0: 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
99c0: 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
99d0: 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
99e0: 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
99f0: 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
9a00: 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
9a10: 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
9a20: 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 73  .select_end:.  s
9a30: 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49 6e  qliteAggregateIn
9a40: 66 6f 52 65 73 65 74 28 70 50 61 72 73 65 29 3b  foReset(pParse);
9a50: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.