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

Artifact 48c14a44da6bc04a6e19f2c5da15b5ea984ede13:


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 30 20  select.c,v 1.60 
0200: 32 30 30 32 2f 30 32 2f 31 38 20 30 31 3a 31 37  2002/02/18 01:17
0210: 3a 30 30 20 64 72 68 20 45 78 70 20 24 0a 2a 2f  :00 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 7b 0a   0);.    }else{.
2a40: 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b        char zBuf[
2a50: 33 30 5d 3b 0a 20 20 20 20 20 20 73 70 72 69 6e  30];.      sprin
2a60: 74 66 28 7a 42 75 66 2c 20 22 63 6f 6c 75 6d 6e  tf(zBuf, "column
2a70: 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  %d", i+1);.     
2a80: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   pTab->aCol[i].z
2a90: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
2aa0: 44 75 70 28 7a 42 75 66 29 3b 0a 20 20 20 20 7d  Dup(zBuf);.    }
2ab0: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b  .  }.  pTab->iPK
2ac0: 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  ey = -1;.  retur
2ad0: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
2ae0: 20 46 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   For the given S
2af0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
2b00: 20 64 6f 20 74 77 6f 20 74 68 69 6e 67 73 2e 0a   do two things..
2b10: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 46 69  **.**    (1)  Fi
2b20: 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  ll in the pTabLi
2b30: 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  st->a[].pTab fie
2b40: 6c 64 73 20 69 6e 20 74 68 65 20 49 64 4c 69 73  lds in the IdLis
2b50: 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
2b60: 20 20 20 64 65 66 69 6e 65 73 20 74 68 65 20 73     defines the s
2b70: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
2b80: 74 20 73 68 6f 75 6c 64 20 62 65 20 73 63 61 6e  t should be scan
2b90: 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ned. .**.**    (
2ba0: 32 29 20 20 49 66 20 74 68 65 20 63 6f 6c 75 6d  2)  If the colum
2bb0: 6e 73 20 74 6f 20 62 65 20 65 78 74 72 61 63 74  ns to be extract
2bc0: 65 64 20 76 61 72 69 61 62 6c 65 20 28 70 45 4c  ed variable (pEL
2bd0: 69 73 74 29 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  ist) is NULL.** 
2be0: 20 20 20 20 20 20 20 20 28 6d 65 61 6e 69 6e 67          (meaning
2bf0: 20 74 68 61 74 20 61 20 22 2a 22 20 77 61 73 20   that a "*" was 
2c00: 75 73 65 64 20 69 6e 20 74 68 65 20 53 51 4c 20  used in the SQL 
2c10: 73 74 61 74 65 6d 65 6e 74 29 20 74 68 65 6e 0a  statement) then.
2c20: 2a 2a 20 20 20 20 20 20 20 20 20 63 72 65 61 74  **         creat
2c30: 65 20 61 20 66 61 6b 65 20 70 45 4c 69 73 74 20  e a fake pEList 
2c40: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
2c50: 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  ames of all colu
2c60: 6d 6e 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  mns.**         o
2c70: 66 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 2a 2a  f all tables..**
2c80: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20  .** Return 0 on 
2c90: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
2ca0: 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c  re are problems,
2cb0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2cc0: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
2cd0: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
2ce0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
2cf0: 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 6f  tic int fillInCo
2d00: 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73 65 20 2a  lumnList(Parse *
2d10: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2d20: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  p){.  int i, j, 
2d30: 6b 3b 0a 20 20 49 64 4c 69 73 74 20 2a 70 54 61  k;.  IdList *pTa
2d40: 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
2d50: 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66  t *pEList;..  if
2d60: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72  ( p==0 || p->pSr
2d70: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  c==0 ) return 1;
2d80: 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
2d90: 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
2da0: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  = p->pEList;..  
2db0: 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79  /* Look up every
2dc0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61   table in the ta
2dd0: 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ble list..  */. 
2de0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
2df0: 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
2e00: 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
2e10: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 29 7b 0a  t->a[i].pTab ){.
2e20: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f        /* This ro
2e30: 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65  utine has run be
2e40: 66 6f 72 65 21 20 20 4e 6f 20 6e 65 65 64 20 74  fore!  No need t
2e50: 6f 20 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20  o continue */.  
2e60: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2e70: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62    }.    if( pTab
2e80: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
2e90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
2ea0: 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
2eb0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2ec0: 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
2ed0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
2ee0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2ef0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
2f00: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20  elect!=0 );.    
2f10: 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
2f20: 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a  .pTab = pTab = .
2f30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 52 65          sqliteRe
2f40: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
2f50: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2f60: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 0a 20  ->a[i].zAlias,. 
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
2fa0: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a  >a[i].pSelect);.
2fb0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
2fc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
2fd0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
2fe0: 20 20 20 20 20 70 54 61 62 2d 3e 69 73 54 72 61       pTab->isTra
2ff0: 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20  nsient = 1;.    
3000: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
3010: 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
3020: 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  e name in the FR
3030: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
3040: 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
3050: 5d 2e 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46  ].pTab = sqliteF
3060: 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
3070: 3e 64 62 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  >db, pTabList->a
3080: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
3090: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
30a0: 61 5b 69 5d 2e 70 54 61 62 3d 3d 30 20 29 7b 0a  a[i].pTab==0 ){.
30b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
30c0: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
30d0: 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75  >zErrMsg, "no su
30e0: 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 0a 20 20  ch table: ", .  
30f0: 20 20 20 20 20 20 20 20 20 70 54 61 62 4c 69 73           pTabLis
3100: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30  t->a[i].zName, 0
3110: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
3120: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
3130: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3140: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
3150: 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22    /* For every "
3160: 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  *" that occurs i
3170: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
3180: 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  t, insert the na
3190: 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20  mes of.  ** all 
31a0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
31b0: 61 62 6c 65 73 2e 20 20 54 68 65 20 70 61 72 73  ables.  The pars
31c0: 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
31d0: 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
31e0: 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
31f0: 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66  K_ALL operator f
3200: 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
3210: 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
3220: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20   column list..  
3230: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
3240: 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74   code just has t
3250: 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f  o locate the TK_
3260: 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ALL expressions 
3270: 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20  and expand.  ** 
3280: 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
3290: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
32a0: 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
32b0: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  s..  */.  for(k=
32c0: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
32d0: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66  pr; k++){.    if
32e0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70  ( pEList->a[k].p
32f0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  Expr->op==TK_ALL
3300: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
3310: 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
3320: 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63  xpr ){.    struc
3330: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
3340: 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
3350: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
3360: 65 77 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ew = 0;.    for(
3370: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
3380: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
3390: 20 20 69 66 28 20 61 5b 6b 5d 2e 70 45 78 70 72    if( a[k].pExpr
33a0: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ->op!=TK_ALL ){.
33b0: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
33c0: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70  qliteExprListApp
33d0: 65 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  end(pNew, a[k].p
33e0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
33f0: 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
3400: 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
3410: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
3420: 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
3430: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b  = 0;.        a[k
3440: 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
3450: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3460: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
3470: 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  bList->nId; i++)
3480: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
3490: 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69  e *pTab = pTabLi
34a0: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a 20  st->a[i].pTab;. 
34b0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
34c0: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
34d0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
34e0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a    Expr *pExpr, *
34f0: 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a  pLeft, *pRight;.
3500: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
3510: 68 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  ht = sqliteExpr(
3520: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b  TK_ID, 0, 0, 0);
3530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
3540: 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65   pRight==0 ) bre
3550: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
3560: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20  pRight->token.z 
3570: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
3580: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
3590: 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e     pRight->token
35a0: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 61 62  .n = strlen(pTab
35b0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
35c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
35d0: 28 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 29 7b  ( pTab->zName ){
35e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
35f0: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45 78 70  Left = sqliteExp
3600: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30  r(TK_ID, 0, 0, 0
3610: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3620: 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 20   if( pLeft==0 ) 
3630: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
3640: 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73       if( pTabLis
3650: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 20 26  t->a[i].zAlias &
3660: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  & pTabList->a[i]
3670: 2e 7a 41 6c 69 61 73 5b 30 5d 20 29 7b 0a 20 20  .zAlias[0] ){.  
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
3690: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 70  eft->token.z = p
36a0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  TabList->a[i].zA
36b0: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
36c0: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b        pLeft->tok
36d0: 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54  en.n = strlen(pT
36e0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
36f0: 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ias);.          
3700: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3710: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
3720: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 70 54 61 62  ->token.z = pTab
3730: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
3740: 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e           pLeft->
3750: 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e  token.n = strlen
3760: 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pTab->zName);. 
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
3790: 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  pr = sqliteExpr(
37a0: 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
37b0: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
37c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
37d0: 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  pr==0 ) break;. 
37e0: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
37f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3800: 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
3820: 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70  xpr->span = pExp
3830: 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  r->token;.      
3840: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3850: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
3860: 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  eExprListAppend(
3870: 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 30 29 3b  pNew, pExpr, 0);
3880: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
38a0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45     }.    sqliteE
38b0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
38c0: 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45  List);.    p->pE
38d0: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
38e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
38f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3900: 6e 65 20 61 73 73 6f 63 69 61 74 65 73 20 65 6e  ne associates en
3910: 74 72 69 65 73 20 69 6e 20 61 6e 20 4f 52 44 45  tries in an ORDE
3920: 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20  R BY expression 
3930: 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c  list with.** col
3940: 75 6d 6e 73 20 69 6e 20 61 20 72 65 73 75 6c 74  umns in a result
3950: 2e 20 20 46 6f 72 20 65 61 63 68 20 4f 52 44 45  .  For each ORDE
3960: 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 2c  R BY expression,
3970: 20 74 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a   the opcode of.*
3980: 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  * the top-level 
3990: 6e 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64 20  node is changed 
39a0: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64  to TK_COLUMN and
39b0: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c   the iColumn val
39c0: 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70  ue of.** the top
39d0: 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66  -level node is f
39e0: 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 63 6f  illed in with co
39f0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20  lumn number and 
3a00: 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61  the iTable.** va
3a10: 6c 75 65 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c  lue of the top-l
3a20: 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c  evel node is fil
3a30: 6c 65 64 20 77 69 74 68 20 69 54 61 62 6c 65 20  led with iTable 
3a40: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
3a50: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70 72   If there are pr
3a60: 69 6f 72 20 53 45 4c 45 43 54 20 63 6c 61 75 73  ior SELECT claus
3a70: 65 73 2c 20 74 68 65 79 20 61 72 65 20 70 72 6f  es, they are pro
3a80: 63 65 73 73 65 64 20 66 69 72 73 74 2e 20 20 41  cessed first.  A
3a90: 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20   match.** in an 
3aa0: 65 61 72 6c 69 65 72 20 53 45 4c 45 43 54 20 74  earlier SELECT t
3ab0: 61 6b 65 73 20 70 72 65 63 65 64 65 6e 63 65 20  akes precedence 
3ac0: 6f 76 65 72 20 61 20 6c 61 74 65 72 20 53 45 4c  over a later SEL
3ad0: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65  ECT..**.** Any e
3ae0: 6e 74 72 79 20 74 68 61 74 20 64 6f 65 73 20 6e  ntry that does n
3af0: 6f 74 20 6d 61 74 63 68 20 69 73 20 66 6c 61 67  ot match is flag
3b00: 67 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2e  ged as an error.
3b10: 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
3b20: 6f 66 20 65 72 72 6f 72 73 20 69 73 20 72 65 74  of errors is ret
3b30: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
3b40: 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65 72 62   int matchOrderb
3b50: 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  yToColumn(.  Par
3b60: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
3b70: 20 20 20 20 20 2f 2a 20 41 20 70 6c 61 63 65 20       /* A place 
3b80: 74 6f 20 6c 65 61 76 65 20 65 72 72 6f 72 20 6d  to leave error m
3b90: 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c  essages */.  Sel
3ba0: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
3bb0: 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f       /* Match to
3bc0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
3bd0: 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  of this SELECT *
3be0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
3bf0: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54  rderBy,     /* T
3c00: 68 65 20 4f 52 44 45 52 20 42 59 20 76 61 6c 75  he ORDER BY valu
3c10: 65 73 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69  es to match agai
3c20: 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nst columns */. 
3c30: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
3c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
3c50: 72 74 20 74 68 69 73 20 74 68 69 73 20 76 61 6c  rt this this val
3c60: 75 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a  ue in iTable */.
3c70: 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65    int mustComple
3c80: 74 65 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  te        /* If 
3c90: 54 52 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42  TRUE all ORDER B
3ca0: 59 73 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f  Ys must match */
3cb0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  .){.  int nErr =
3cc0: 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   0;.  int i, j;.
3cd0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
3ce0: 73 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65  st;..  if( pSele
3cf0: 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42  ct==0 || pOrderB
3d00: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  y==0 ) return 1;
3d10: 0a 20 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c  .  if( mustCompl
3d20: 65 74 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ete ){.    for(i
3d30: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
3d40: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72  nExpr; i++){ pOr
3d50: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
3d60: 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66   = 0; }.  }.  if
3d70: 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69  ( fillInColumnLi
3d80: 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
3d90: 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ct) ){.    retur
3da0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
3db0: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
3dc0: 7b 0a 20 20 20 20 69 66 28 20 6d 61 74 63 68 4f  {.    if( matchO
3dd0: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70  rderbyToColumn(p
3de0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
3df0: 70 50 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79  pPrior, pOrderBy
3e00: 2c 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a  , iTable, 0) ){.
3e10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3e20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69      }.  }.  pELi
3e30: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
3e40: 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  List;.  for(i=0;
3e50: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
3e60: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
3e70: 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42  pr *pE = pOrderB
3e80: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
3e90: 20 20 20 69 6e 74 20 6d 61 74 63 68 20 3d 20 30     int match = 0
3ea0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  ;.    if( pOrder
3eb0: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20  By->a[i].done ) 
3ec0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
3ed0: 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d  r(j=0; j<pEList-
3ee0: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
3ef0: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
3f00: 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70  a[j].zName && (p
3f10: 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20  E->op==TK_ID || 
3f20: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  pE->op==TK_STRIN
3f30: 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  G) ){.        ch
3f40: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
3f50: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
3f60: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4c          char *zL
3f70: 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 53 74 72  abel = sqliteStr
3f80: 4e 44 75 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a  NDup(pE->token.z
3f90: 2c 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  , pE->token.n);.
3fa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 44 65          sqliteDe
3fb0: 71 75 6f 74 65 28 7a 4c 61 62 65 6c 29 3b 0a 20  quote(zLabel);. 
3fc0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
3fd0: 65 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  eStrICmp(zName, 
3fe0: 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20  zLabel)==0 ){ . 
3ff0: 20 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 3d           match =
4000: 20 31 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20   1; .        }. 
4010: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
4020: 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  e(zLabel);.     
4030: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61 74   }.      if( mat
4040: 63 68 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 45  ch==0 && sqliteE
4050: 78 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70  xprCompare(pE, p
4060: 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70  EList->a[j].pExp
4070: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  r) ){.        ma
4080: 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  tch = 1;.      }
4090: 0a 20 20 20 20 20 20 69 66 28 20 6d 61 74 63 68  .      if( match
40a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e   ){.        pE->
40b0: 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
40c0: 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c          pE->iCol
40d0: 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
40e0: 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54   pE->iTable = iT
40f0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 4f  able;.        pO
4100: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
4110: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62  e = 1;.        b
4120: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4130: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 6d 61 74    }.    if( !mat
4140: 63 68 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65  ch && mustComple
4150: 74 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  te ){.      char
4160: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20   zBuf[30];.     
4170: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 25   sprintf(zBuf,"%
4180: 64 22 2c 69 2b 31 29 3b 0a 20 20 20 20 20 20 73  d",i+1);.      s
4190: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
41a0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
41b0: 20 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20   "ORDER BY term 
41c0: 6e 75 6d 62 65 72 20 22 2c 20 7a 42 75 66 2c 20  number ", zBuf, 
41d0: 0a 20 20 20 20 20 20 20 20 22 20 64 6f 65 73 20  .        " does 
41e0: 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 72 65  not match any re
41f0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  sult column", 0)
4200: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
4210: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 6e 45  nErr++;.      nE
4220: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61  rr++;.      brea
4230: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
4240: 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
4250: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42  ./*.** Get a VDB
4260: 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  E for the given 
4270: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20  parser context. 
4280: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
4290: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
42a0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
42b0: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
42c0: 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d  LL and leave a m
42d0: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
42e0: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
42f0: 65 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a  eGetVdbe(Parse *
4300: 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
4310: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4320: 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  be;.  if( v==0 )
4330: 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65  {.    v = pParse
4340: 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65  ->pVdbe = sqlite
4350: 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73  VdbeCreate(pPars
4360: 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65  e->db);.  }.  re
4370: 74 75 72 6e 20 76 3b 0a 7d 0a 20 20 20 20 0a 0a  turn v;.}.    ..
4380: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4390: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
43a0: 70 72 6f 63 65 73 73 20 61 20 71 75 65 72 79 20  process a query 
43b0: 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74  that is really t
43c0: 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69  he union.** or i
43d0: 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
43e0: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
43f0: 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2f 0a  ate queries..*/.
4400: 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
4410: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
4420: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
4430: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
4440: 69 50 61 72 6d 29 7b 0a 20 20 69 6e 74 20 72 63  iParm){.  int rc
4450: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4460: 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
4470: 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
4480: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
4490: 69 6f 72 3b 20 20 20 20 20 2f 2a 20 41 6e 6f 74  ior;     /* Anot
44a0: 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
44b0: 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
44c0: 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
44e0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
44f0: 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69  this VDBE */.  i
4500: 6e 74 20 62 61 73 65 3b 20 20 20 20 20 20 20 20  nt base;        
4510: 20 20 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20 76     /* Baseline v
4520: 61 6c 75 65 20 66 6f 72 20 70 50 61 72 73 65 2d  alue for pParse-
4530: 3e 6e 54 61 62 20 2a 2f 0a 0a 20 20 2f 2a 20 4d  >nTab */..  /* M
4540: 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
4550: 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
4560: 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45  ause on prior SE
4570: 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 20 74 68 65  LECTs.  Only the
4580: 20 0a 20 20 2a 2a 20 6c 61 73 74 20 53 45 4c 45   .  ** last SELE
4590: 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73  CT in the series
45a0: 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44   may have an ORD
45b0: 45 52 20 42 59 2e 0a 20 20 2a 2f 0a 20 20 69 66  ER BY..  */.  if
45c0: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72  ( p==0 || p->pPr
45d0: 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
45e0: 31 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d  1;.  pPrior = p-
45f0: 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70  >pPrior;.  if( p
4600: 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
4610: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
4620: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
4630: 7a 45 72 72 4d 73 67 2c 22 4f 52 44 45 52 20 42  zErrMsg,"ORDER B
4640: 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  Y clause should 
4650: 63 6f 6d 65 20 61 66 74 65 72 20 22 2c 0a 20 20  come after ",.  
4660: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
4670: 28 70 2d 3e 6f 70 29 2c 20 22 20 6e 6f 74 20 62  (p->op), " not b
4680: 65 66 6f 72 65 22 2c 20 30 29 3b 0a 20 20 20 20  efore", 0);.    
4690: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
46a0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
46b0: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
46c0: 65 20 77 65 20 68 61 76 65 20 61 20 76 61 6c 69  e we have a vali
46d0: 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20  d query engine. 
46e0: 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20   If not, create 
46f0: 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
4700: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
4710: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
4720: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
4730: 20 31 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73   1;..  /* Proces
4740: 73 20 74 68 65 20 55 4e 49 4f 4e 20 6f 72 20 49  s the UNION or I
4750: 4e 54 45 52 53 45 43 54 49 4f 4e 0a 20 20 2a 2f  NTERSECTION.  */
4760: 0a 20 20 62 61 73 65 20 3d 20 70 50 61 72 73 65  .  base = pParse
4770: 2d 3e 6e 54 61 62 3b 0a 20 20 73 77 69 74 63 68  ->nTab;.  switch
4780: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
4790: 61 73 65 20 54 4b 5f 41 4c 4c 3a 0a 20 20 20 20  ase TK_ALL:.    
47a0: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a  case TK_EXCEPT:.
47b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
47c0: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75  N: {.      int u
47d0: 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
47e0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
47f0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
4800: 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ble holding resu
4810: 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lt */.      int 
4820: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
4830: 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20  One of the SRT_ 
4840: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70  operations to ap
4850: 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20  ply to self */. 
4860: 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70       int priorOp
4870: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54  ;     /* The SRT
4880: 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61  _ operation to a
4890: 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65  pply to prior se
48a0: 6c 65 63 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20  lects */..      
48b0: 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d  priorOp = p->op=
48c0: 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61  =TK_ALL ? SRT_Ta
48d0: 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b  ble : SRT_Union;
48e0: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
48f0: 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20  ==priorOp ){.   
4900: 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
4910: 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
4920: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
4930: 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
4940: 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
4950: 69 67 68 74 2e 20 20 54 68 69 73 20 61 6c 73 6f  ight.  This also
4960: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 6e 6f   means we are no
4970: 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  t the right-most
4980: 20 73 65 6c 65 63 74 20 61 6e 64 20 73 6f 0a 20   select and so. 
4990: 20 20 20 20 20 20 20 2a 2a 20 77 65 20 63 61 6e         ** we can
49a0: 6e 6f 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45  not have an ORDE
49b0: 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  R BY clause.    
49c0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
49d0: 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b  nionTab = iParm;
49e0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
49f0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
4a00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
4a10: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69          /* We wi
4a20: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  ll need to creat
4a30: 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72  e our own tempor
4a40: 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c  ary table to hol
4a50: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
4a60: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
4a70: 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  sults..        *
4a80: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
4a90: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
4aa0: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b++;.        if(
4ab0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 0a 20 20   p->pOrderBy .  
4ac0: 20 20 20 20 20 20 26 26 20 6d 61 74 63 68 4f 72        && matchOr
4ad0: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50  derbyToColumn(pP
4ae0: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
4af0: 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  erBy, unionTab, 
4b00: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
4b10: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
4b20: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
4b30: 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b  p->op!=TK_ALL ){
4b40: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4b50: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4b60: 5f 4f 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e  _OpenTemp, union
4b70: 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  Tab, 1);.       
4b80: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4b90: 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61  Op(v, OP_KeyAsDa
4ba0: 74 61 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29  ta, unionTab, 1)
4bb0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
4bc0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4bd0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4be0: 5f 4f 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e  _OpenTemp, union
4bf0: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
4c00: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
4c10: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
4c20: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
4c30: 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20  to our left.    
4c40: 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
4c50: 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61  sqliteSelect(pPa
4c60: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 72 69  rse, pPrior, pri
4c70: 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b  orOp, unionTab);
4c80: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
4c90: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
4ca0: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
4cb0: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
4cc0: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a  tement.      */.
4cd0: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d        switch( p-
4ce0: 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >op ){.         
4cf0: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
4d00: 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74   op = SRT_Except
4d10: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
4d20: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
4d30: 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e  N:   op = SRT_Un
4d40: 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ion;    break;. 
4d50: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
4d60: 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52  ALL:     op = SR
4d70: 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61  T_Table;    brea
4d80: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4d90: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
4da0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
4db0: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
4dc0: 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 29  p, op, unionTab)
4dd0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
4de0: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
4df0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
4e00: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  n rc;..      /* 
4e10: 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61  Convert the data
4e20: 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
4e30: 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61  y table into wha
4e40: 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20  tever form.     
4e50: 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77   ** it is that w
4e60: 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64  e currently need
4e70: 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20  ..      */      
4e80: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
4e90: 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20  !=priorOp ){.   
4ea0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
4eb0: 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
4ec0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
4ed0: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
4ee0: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
4ef0: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
4f00: 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a   0, p->pEList);.
4f10: 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
4f20: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
4f30: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
4f40: 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56   iCont = sqliteV
4f50: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
4f60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
4f70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
4f80: 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
4f90: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
4fa0: 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
4fb0: 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  eVdbeCurrentAddr
4fc0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  (v);.        rc 
4fd0: 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  = selectInnerLoo
4fe0: 70 28 70 50 61 72 73 65 2c 20 30 2c 20 75 6e 69  p(pParse, 0, uni
4ff0: 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74  onTab, p->pEList
5000: 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
5030: 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  y, -1, eDest, iP
5040: 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  arm, .          
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5060: 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b     iCont, iBreak
5070: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
5080: 63 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  c ) return 1;.  
5090: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
50a0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
50b0: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
50c0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
50d0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
50e0: 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20  nTab, iStart);. 
50f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
5100: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
5110: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
5120: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5130: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  p(v, OP_Close, u
5140: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
5150: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
5160: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
5170: 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
5180: 69 6c 28 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  il(v, p->pEList-
5190: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >nExpr);.       
51a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
51b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
51c0: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
51d0: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ECT: {.      int
51e0: 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20   tab1, tab2;.   
51f0: 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
5200: 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 0a 20  reak, iStart;.. 
5210: 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
5220: 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
5230: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
5240: 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
5250: 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
5260: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
5270: 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
5280: 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
5290: 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
52a0: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
52b0: 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
52c0: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
52d0: 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
52e0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
52f0: 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
5300: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
5310: 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 6d  p->pOrderBy && m
5320: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
5330: 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e  umn(pParse,p,p->
5340: 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29  pOrderBy,tab1,1)
5350: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
5360: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
5370: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5380: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
5390: 6d 70 2c 20 74 61 62 31 2c 20 31 29 3b 0a 20 20  mp, tab1, 1);.  
53a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
53b0: 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44  dOp(v, OP_KeyAsD
53c0: 61 74 61 2c 20 74 61 62 31 2c 20 31 29 3b 0a 0a  ata, tab1, 1);..
53d0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
53e0: 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
53f0: 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
5400: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
5410: 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
5420: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c    rc = sqliteSel
5430: 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
5440: 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  or, SRT_Union, t
5450: 61 62 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab1);.      if( 
5460: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
5470: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
5480: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
5490: 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  T into temporary
54a0: 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20   table "tab2".  
54b0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
54c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
54d0: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62  OP_OpenTemp, tab
54e0: 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 1);.      sql
54f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5500: 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61  OP_KeyAsData, ta
5510: 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d  b2, 1);.      p-
5520: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
5530: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65     rc = sqliteSe
5540: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
5550: 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 29  SRT_Union, tab2)
5560: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
5570: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
5580: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
5590: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  n rc;..      /* 
55a0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
55b0: 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73   take the inters
55c0: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77  ection of the tw
55d0: 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  o temporary.    
55e0: 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20    ** tables..   
55f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
5600: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
5610: 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43  .      generateC
5620: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
5630: 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29  e, 0, p->pEList)
5640: 3b 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  ;.      iBreak =
5650: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
5660: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
5670: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62  Cont = sqliteVdb
5680: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
5690: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
56a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
56b0: 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
56c0: 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d  ;.      iStart =
56d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
56e0: 28 76 2c 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20  (v, OP_FullKey, 
56f0: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
5700: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5710: 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
5720: 74 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  tab2, iCont);.  
5730: 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49      rc = selectI
5740: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
5750: 20 30 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c   0, tab1, p->pEL
5760: 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  ist->nExpr,.    
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5780: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64           p->pOrd
5790: 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c  erBy, -1, eDest,
57a0: 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20   iParm, .       
57b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57c0: 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72        iCont, iBr
57d0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  eak);.      if( 
57e0: 72 63 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  rc ) return 1;. 
57f0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
5800: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
5810: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cont);.      sql
5820: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5830: 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
5840: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Start);.      sq
5850: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
5860: 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
5870: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
5880: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
5890: 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
58a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
58b0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
58c0: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
58d0: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
58e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65   ){.        gene
58f0: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 76 2c 20  rateSortTail(v, 
5900: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
5910: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5920: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5930: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
5940: 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
5950: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28  >pEList );.  if(
5960: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
5970: 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r!=pPrior->pELis
5980: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
5990: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
59a0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
59b0: 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68  , "SELECTs to th
59c0: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
59d0: 20 6f 66 20 22 2c 0a 20 20 20 20 20 20 73 65 6c   of ",.      sel
59e0: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
59f0: 2c 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  , " do not have 
5a00: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
5a10: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
5a20: 73 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  s", 0);.    pPar
5a30: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
5a40: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
5a50: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 62  pParse->nTab = b
5a60: 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ase;.  return 0;
5a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
5a80: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
5a90: 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61  given SELECT sta
5aa0: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
5ab0: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
5ac0: 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72  stributed in var
5ad0: 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64  ious ways depend
5ae0: 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61  ing on the.** va
5af0: 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e 64  lue of eDest and
5b00: 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20   iParm..**.**   
5b10: 20 20 65 44 65 73 74 20 56 61 6c 75 65 20 20 20    eDest Value   
5b20: 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20      Result.**   
5b30: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20    ------------  
5b40: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
5b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
5b70: 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63       SRT_Callbac
5b80: 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20  k    Invoke the 
5b90: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63  callback for eac
5ba0: 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  h row of the res
5bb0: 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ult..**.**     S
5bc0: 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53  RT_Mem         S
5bd0: 74 6f 72 65 20 66 69 72 73 74 20 72 65 73 75 6c  tore first resul
5be0: 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t in memory cell
5bf0: 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20   iParm.**.**    
5c00: 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20   SRT_Set        
5c10: 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61   Store results a
5c20: 73 20 6b 65 79 73 20 6f 66 20 61 20 74 61 62 6c  s keys of a tabl
5c30: 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 50  e with cursor iP
5c40: 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  arm.**.**     SR
5c50: 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74  T_Union       St
5c60: 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61  ore results as a
5c70: 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72   key in a tempor
5c80: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a  ary table iParm.
5c90: 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
5ca0: 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65  cept      Remove
5cb0: 20 72 65 73 75 6c 74 73 20 66 6f 72 6d 20 74 68   results form th
5cc0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
5cd0: 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  e iParm..**.**  
5ce0: 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20     SRT_Table    
5cf0: 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
5d00: 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   in temporary ta
5d10: 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  ble iParm.**.** 
5d20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
5d30: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
5d40: 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
5d50: 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a  ny errors are.**
5d60: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
5d70: 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  en an appropriat
5d80: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
5d90: 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50  is left in.** pP
5da0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
5db0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5dc0: 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20  e does NOT free 
5dd0: 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63  the Select struc
5de0: 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20  ture passed in. 
5df0: 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
5e00: 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  function needs t
5e10: 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e  o do that..*/.in
5e20: 74 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 0a  t sqliteSelect(.
5e30: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5e50: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
5e60: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
5e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5e80: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
5e90: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
5ea0: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5ec0: 6e 65 20 6f 66 3a 20 53 52 54 5f 43 61 6c 6c 62  ne of: SRT_Callb
5ed0: 61 63 6b 20 4d 65 6d 20 53 65 74 20 55 6e 69 6f  ack Mem Set Unio
5ee0: 6e 20 45 78 63 65 70 74 20 2a 2f 0a 20 20 69 6e  n Except */.  in
5ef0: 74 20 69 50 61 72 6d 20 20 20 20 20 20 20 20 20  t iParm         
5f00: 20 20 20 20 20 2f 2a 20 53 61 76 65 20 72 65 73       /* Save res
5f10: 75 6c 74 20 69 6e 20 74 68 69 73 20 6d 65 6d 6f  ult in this memo
5f20: 72 79 20 6c 6f 63 61 74 69 6f 6e 2c 20 69 66 20  ry location, if 
5f30: 3e 3d 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  >=0 */.){.  int 
5f40: 69 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  i;.  WhereInfo *
5f50: 70 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20 2a  pWInfo;.  Vdbe *
5f60: 76 3b 0a 20 20 69 6e 74 20 69 73 41 67 67 20 3d  v;.  int isAgg =
5f70: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
5f80: 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c  rue for select l
5f90: 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74  ists like "count
5fa0: 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69  (*)" */.  ExprLi
5fb0: 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
5fc0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
5fd0: 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20  mns to extract. 
5fe0: 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 54 61  */.  IdList *pTa
5ff0: 62 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  bList;      /* L
6000: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ist of tables to
6010: 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a   select from */.
6020: 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
6030: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6040: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d  WHERE clause.  M
6050: 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
6060: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
6070: 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  By;    /* The OR
6080: 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
6090: 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
60a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
60b0: 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47  pBy;    /* The G
60c0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
60d0: 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
60e0: 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b    Expr *pHaving;
60f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6100: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
6110: 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
6120: 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b   int isDistinct;
6130: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
6140: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
6150: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
6160: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74  nt */.  int dist
6170: 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f  inct;          /
6180: 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66  * Table to use f
6190: 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
61a0: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73  set */.  int bas
61b0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
61c0: 2f 2a 20 46 69 72 73 74 20 63 75 72 73 6f 72 20  /* First cursor 
61d0: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
61e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
61f0: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
6200: 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
6210: 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
6220: 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71  ion */..  if( sq
6230: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
6240: 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
6250: 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72 65 74  rr || p==0 ) ret
6260: 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  urn 1;..  /* If 
6270: 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73  there is are a s
6280: 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69  equence of queri
6290: 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69  es, do the earli
62a0: 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20  er ones first.. 
62b0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
62c0: 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ior ){.    retur
62d0: 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50  n multiSelect(pP
62e0: 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20  arse, p, eDest, 
62f0: 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iParm);.  }..  /
6300: 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70  * Make local cop
6310: 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d  ies of the param
6320: 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20 71  eters for this q
6330: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61  uery..  */.  pTa
6340: 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
6350: 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
6360: 57 68 65 72 65 3b 0a 20 20 70 4f 72 64 65 72 42  Where;.  pOrderB
6370: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
6380: 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
6390: 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
63a0: 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
63b0: 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20  g;.  isDistinct 
63c0: 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  = p->isDistinct;
63d0: 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20  ..  /* Save the 
63e0: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
63f0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2e 20 20   pParse->nTab.  
6400: 52 65 73 74 6f 72 65 20 74 68 69 73 20 76 61 6c  Restore this val
6410: 75 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 77  ue before.  ** w
6420: 65 20 65 78 69 74 2e 0a 20 20 2a 2f 0a 20 20 62  e exit..  */.  b
6430: 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ase = pParse->nT
6440: 61 62 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  ab;..  /* .  ** 
6450: 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65  Do not even atte
6460: 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20  mpt to generate 
6470: 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68  any code if we h
6480: 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e  ave already seen
6490: 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66  .  ** errors bef
64a0: 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
64b0: 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20   starts..  */.  
64c0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
64d0: 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  >0 ) goto select
64e0: 5f 65 6e 64 3b 0a 20 20 73 71 6c 69 74 65 41 67  _end;.  sqliteAg
64f0: 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65 74  gregateInfoReset
6500: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20  (pParse);..  /* 
6510: 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61  Look up every ta
6520: 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ble in the table
6530: 20 6c 69 73 74 20 61 6e 64 20 63 72 65 61 74 65   list and create
6540: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a   an appropriate.
6550: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 6c 69 73 74 20    ** columnlist 
6560: 69 6e 20 70 45 4c 69 73 74 20 69 66 20 74 68 65  in pEList if the
6570: 72 65 20 69 73 6e 27 74 20 6f 6e 65 20 61 6c 72  re isn't one alr
6580: 65 61 64 79 2e 20 20 28 54 68 65 20 70 61 72 73  eady.  (The pars
6590: 65 72 20 6c 65 61 76 65 73 0a 20 20 2a 2a 20 61  er leaves.  ** a
65a0: 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 70 2d 3e   NULL in the p->
65b0: 70 45 4c 69 73 74 20 69 66 20 74 68 65 20 53 51  pEList if the SQ
65c0: 4c 20 73 61 69 64 20 22 53 45 4c 45 43 54 20 2a  L said "SELECT *
65d0: 20 46 52 4f 4d 20 2e 2e 2e 22 29 0a 20 20 2a 2f   FROM ...").  */
65e0: 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c  .  if( fillInCol
65f0: 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20  umnList(pParse, 
6600: 70 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  p) ){.    goto s
6610: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
6620: 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
6630: 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ist;.  if( pELis
6640: 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  t==0 ) goto sele
6650: 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 41 6c  ct_end;..  /* Al
6660: 6c 6f 63 61 74 65 20 61 20 74 65 6d 70 6f 72 61  locate a tempora
6670: 72 79 20 74 61 62 6c 65 20 74 6f 20 75 73 65 20  ry table to use 
6680: 66 6f 72 20 74 68 65 20 44 49 53 54 49 4e 43 54  for the DISTINCT
6690: 20 73 65 74 2c 20 69 66 0a 20 20 2a 2a 20 6e 65   set, if.  ** ne
66a0: 63 65 73 73 61 72 79 2e 20 20 54 68 69 73 20 6d  cessary.  This m
66b0: 75 73 74 20 62 65 20 64 6f 6e 65 20 65 61 72 6c  ust be done earl
66c0: 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  y to allocate th
66d0: 65 20 63 75 72 73 6f 72 20 62 65 66 6f 72 65 0a  e cursor before.
66e0: 20 20 2a 2a 20 61 6e 79 20 63 61 6c 6c 73 20 74    ** any calls t
66f0: 6f 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  o sqliteExprReso
6700: 6c 76 65 49 64 73 28 29 2e 0a 20 20 2a 2f 0a 20  lveIds()..  */. 
6710: 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 20   if( isDistinct 
6720: 29 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  ){.    distinct 
6730: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
6740: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
6750: 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
6760: 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  }..  /* If writi
6770: 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
6780: 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
6790: 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
67a0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
67b0: 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20  e output..  */. 
67c0: 20 69 66 28 20 28 65 44 65 73 74 3d 3d 53 52 54   if( (eDest==SRT
67d0: 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53  _Mem || eDest==S
67e0: 52 54 5f 53 65 74 29 20 26 26 20 70 45 4c 69 73  RT_Set) && pELis
67f0: 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b 0a 20 20  t->nExpr>1 ){.  
6800: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
6810: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
6820: 73 67 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  sg, "only a sing
6830: 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
6840: 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
6850: 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
6860: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
6870: 65 73 73 69 6f 6e 22 2c 20 30 29 3b 0a 20 20 20  ession", 0);.   
6880: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
6890: 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
68a0: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
68b0: 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f  ORDER BY is igno
68c0: 72 65 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f  red if we are no
68d0: 74 20 73 65 6e 64 69 6e 67 20 74 68 65 20 72 65  t sending the re
68e0: 73 75 6c 74 20 74 6f 20 61 20 63 61 6c 6c 62 61  sult to a callba
68f0: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ck..  */.  if( e
6900: 44 65 73 74 21 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest!=SRT_Callba
6910: 63 6b 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72  ck ){.    pOrder
6920: 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  By = 0;.  }..  /
6930: 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f  * Allocate curso
6940: 72 73 20 66 6f 72 20 22 65 78 70 72 20 49 4e 20  rs for "expr IN 
6950: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
6960: 6e 73 74 72 75 63 74 73 2e 0a 20 20 2a 2f 0a 20  nstructs..  */. 
6970: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
6980: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
6990: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 52  .    sqliteExprR
69a0: 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28 70  esolveInSelect(p
69b0: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
69c0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [i].pExpr);.  }.
69d0: 20 20 69 66 28 20 70 57 68 65 72 65 20 29 20 73    if( pWhere ) s
69e0: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
69f0: 49 6e 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  InSelect(pParse,
6a00: 20 70 57 68 65 72 65 29 3b 0a 20 20 69 66 28 20   pWhere);.  if( 
6a10: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
6a20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
6a30: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
6a40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
6a50: 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63  prResolveInSelec
6a60: 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  t(pParse, pOrder
6a70: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
6a80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
6a90: 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
6aa0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f   for(i=0; i<pGro
6ab0: 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
6ac0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  ){.      sqliteE
6ad0: 78 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65  xprResolveInSele
6ae0: 63 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  ct(pParse, pGrou
6af0: 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  pBy->a[i].pExpr)
6b00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
6b10: 28 20 70 48 61 76 69 6e 67 20 29 20 73 71 6c 69  ( pHaving ) sqli
6b20: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 6e 53  teExprResolveInS
6b30: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 48  elect(pParse, pH
6b40: 61 76 69 6e 67 29 3b 0a 0a 20 20 2f 2a 20 41 74  aving);..  /* At
6b50: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
6b60: 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 6c 6f  should have allo
6b70: 63 61 74 65 64 20 61 6c 6c 20 74 68 65 20 63 75  cated all the cu
6b80: 72 73 6f 72 73 20 74 68 61 74 20 77 65 0a 20 20  rsors that we.  
6b90: 2a 2a 20 6e 65 65 64 20 74 6f 20 68 61 6e 64 6c  ** need to handl
6ba0: 65 20 73 75 62 71 75 65 72 79 73 20 61 6e 64 20  e subquerys and 
6bb0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
6bc0: 2e 20 20 46 72 6f 6d 20 68 65 72 65 20 6f 6e 20  .  From here on 
6bd0: 77 65 0a 20 20 2a 2a 20 61 72 65 20 63 6f 6d 6d  we.  ** are comm
6be0: 69 74 74 65 64 20 74 6f 20 6b 65 65 70 69 6e 67  itted to keeping
6bf0: 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
6c00: 66 6f 72 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  for pParse->nTab
6c10: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 73 6f  ..  **.  ** Reso
6c20: 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  lve the column n
6c30: 61 6d 65 73 20 61 6e 64 20 64 6f 20 61 20 73 65  ames and do a se
6c40: 6d 61 6e 74 69 63 73 20 63 68 65 63 6b 20 6f 6e  mantics check on
6c50: 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73   all the express
6c60: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
6c70: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
6c80: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
6c90: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52   if( sqliteExprR
6ca0: 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
6cb0: 2c 20 70 54 61 62 4c 69 73 74 2c 20 30 2c 20 70  , pTabList, 0, p
6cc0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
6cd0: 72 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  r) ){.      goto
6ce0: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
6cf0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
6d00: 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
6d10: 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  e, pEList->a[i].
6d20: 70 45 78 70 72 2c 20 31 2c 20 26 69 73 41 67 67  pExpr, 1, &isAgg
6d30: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
6d40: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
6d50: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65  }.  }.  if( pWhe
6d60: 72 65 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  re ){.    if( sq
6d70: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
6d80: 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  ds(pParse, pTabL
6d90: 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 57 68  ist, pEList, pWh
6da0: 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ere) ){.      go
6db0: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
6dc0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
6dd0: 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61  iteExprCheck(pPa
6de0: 72 73 65 2c 20 70 57 68 65 72 65 2c 20 30 2c 20  rse, pWhere, 0, 
6df0: 30 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  0) ){.      goto
6e00: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
6e10: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 72   }.  }.  if( pOr
6e20: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 66 6f 72  derBy ){.    for
6e30: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
6e40: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
6e50: 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
6e60: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
6e70: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
6e80: 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73  sqliteExprIsCons
6e90: 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20  tant(pE) ){.    
6ea0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
6eb0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
6ec0: 72 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20  rMsg, .         
6ed0: 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 65 78      "ORDER BY ex
6ee0: 70 72 65 73 73 69 6f 6e 73 20 73 68 6f 75 6c 64  pressions should
6ef0: 20 6e 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e 74   not be constant
6f00: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ", 0);.        p
6f10: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
6f20: 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
6f30: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
6f40: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6f50: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
6f60: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
6f70: 20 70 45 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a   pEList, pE) ){.
6f80: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
6f90: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
6fa0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
6fb0: 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
6fc0: 65 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29  e, pE, isAgg, 0)
6fd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
6fe0: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
6ff0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
7000: 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
7010: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7020: 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
7030: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
7040: 72 20 2a 70 45 20 3d 20 70 47 72 6f 75 70 42 79  r *pE = pGroupBy
7050: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
7060: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
7070: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29  prIsConstant(pE)
7080: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7090: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
70a0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20  rse->zErrMsg, . 
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 47 52 4f              "GRO
70c0: 55 50 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  UP BY expression
70d0: 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  s should not be 
70e0: 63 6f 6e 73 74 61 6e 74 22 2c 20 30 29 3b 0a 20  constant", 0);. 
70f0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
7100: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67  Err++;.        g
7110: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
7120: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7130: 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  ( sqliteExprReso
7140: 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
7150: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  TabList, pEList,
7160: 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pE) ){.        
7170: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
7180: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7190: 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
71a0: 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69  ck(pParse, pE, i
71b0: 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20  sAgg, 0) ){.    
71c0: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
71d0: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
71e0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 48 61   }.  }.  if( pHa
71f0: 76 69 6e 67 20 29 7b 0a 20 20 20 20 69 66 28 20  ving ){.    if( 
7200: 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
7210: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
7220: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
7230: 72 72 4d 73 67 2c 20 22 61 20 47 52 4f 55 50 20  rrMsg, "a GROUP 
7240: 42 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  BY clause is req
7250: 75 69 72 65 64 20 22 0a 20 20 20 20 20 20 20 20  uired ".        
7260: 20 22 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22   "before HAVING"
7270: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
7280: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
7290: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
72a0: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
72b0: 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
72c0: 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54  veIds(pParse, pT
72d0: 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  abList, pEList, 
72e0: 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20  pHaving) ){.    
72f0: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
7300: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
7310: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
7320: 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
7330: 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20  , isAgg, 0) ){. 
7340: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
7350: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _end;.    }.  }.
7360: 0a 20 20 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c  .  /* Do an anal
7370: 79 73 69 73 20 6f 66 20 61 67 67 72 65 67 61 74  ysis of aggregat
7380: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  e expressions.. 
7390: 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20   */.  if( isAgg 
73a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
73b0: 50 61 72 73 65 2d 3e 6e 41 67 67 3d 3d 30 20 26  Parse->nAgg==0 &
73c0: 26 20 70 50 61 72 73 65 2d 3e 69 41 67 67 43 6f  & pParse->iAggCo
73d0: 75 6e 74 3c 30 20 29 3b 0a 20 20 20 20 66 6f 72  unt<0 );.    for
73e0: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
73f0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
7400: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
7410: 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
7420: 65 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  es(pParse, pELis
7430: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
7440: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
7450: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
7460: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
7470: 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
7480: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47     for(i=0; i<pG
7490: 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
74a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
74b0: 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79   sqliteExprAnaly
74c0: 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61  zeAggregates(pPa
74d0: 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
74e0: 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
74f0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
7500: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
7510: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
7520: 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
7530: 20 26 26 20 73 71 6c 69 74 65 45 78 70 72 41 6e   && sqliteExprAn
7540: 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
7550: 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 29  pParse, pHaving)
7560: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
7570: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
7580: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
7590: 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  y ){.      for(i
75a0: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
75b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
75c0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
75d0: 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
75e0: 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 4f 72  ates(pParse, pOr
75f0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
7600: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
7610: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
7620: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7630: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
7640: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
7650: 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing code..  */. 
7660: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
7670: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
7680: 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
7690: 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
76a0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
76b0: 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
76c0: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
76d0: 61 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ause.  */.  for(
76e0: 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
76f0: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
7700: 69 6e 74 20 6f 6c 64 4e 54 61 62 3b 0a 20 20 20  int oldNTab;.   
7710: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
7720: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  TabList->a[i].pT
7730: 61 62 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  ab;.    if( !pTa
7740: 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29  b->isTransient )
7750: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
7760: 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74 2d  ssert( pTabList-
7770: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 21 3d 30  >a[i].pSelect!=0
7780: 20 29 3b 0a 20 20 20 20 6f 6c 64 4e 54 61 62 20   );.    oldNTab 
7790: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
77a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
77b0: 20 2b 3d 20 69 2b 31 3b 0a 20 20 20 20 73 71 6c   += i+1;.    sql
77c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
77d0: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 6f 6c 64  OP_OpenTemp, old
77e0: 4e 54 61 62 2b 69 2c 20 30 29 3b 0a 20 20 20 20  NTab+i, 0);.    
77f0: 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61  sqliteSelect(pPa
7800: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  rse, pTabList->a
7810: 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53 52 54  [i].pSelect, SRT
7820: 5f 54 61 62 6c 65 2c 20 6f 6c 64 4e 54 61 62 2b  _Table, oldNTab+
7830: 69 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  i);.    pParse->
7840: 6e 54 61 62 20 3d 20 6f 6c 64 4e 54 61 62 3b 0a  nTab = oldNTab;.
7850: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
7860: 65 20 6c 69 6d 69 74 65 72 0a 20 20 2a 2f 0a 20  e limiter.  */. 
7870: 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3c 3d   if( p->nLimit<=
7880: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 66 66  0 ){.    p->nOff
7890: 73 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  set = 0;.  }else
78a0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 66  {.    if( p->nOf
78b0: 66 73 65 74 3c 30 20 29 20 70 2d 3e 6e 4f 66 66  fset<0 ) p->nOff
78c0: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  set = 0;.    sql
78d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
78e0: 4f 50 5f 4c 69 6d 69 74 2c 20 70 2d 3e 6e 4c 69  OP_Limit, p->nLi
78f0: 6d 69 74 2c 20 70 2d 3e 6e 4f 66 66 73 65 74 29  mit, p->nOffset)
7900: 3b 0a 20 20 7d 0a 20 20 20 20 0a 0a 20 20 2f 2a  ;.  }.    ..  /*
7910: 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
7920: 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c   names if we wil
7930: 6c 20 62 65 20 75 73 69 6e 67 20 69 6e 20 74 68  l be using in th
7940: 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69  e callback.  Thi
7950: 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73  s.  ** step is s
7960: 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75  kipped if the ou
7970: 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f  tput is going to
7980: 20 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65   a table or a me
7990: 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2f 0a  mory cell..  */.
79a0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
79b0: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
79c0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
79d0: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
79e0: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
79f0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20    }..  /* Reset 
7a00: 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 0a 20  the aggregator. 
7a10: 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20   */.  if( isAgg 
7a20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
7a30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
7a40: 52 65 73 65 74 2c 20 30 2c 20 70 50 61 72 73 65  Reset, 0, pParse
7a50: 2d 3e 6e 41 67 67 29 3b 0a 20 20 20 20 69 66 28  ->nAgg);.    if(
7a60: 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
7a70: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
7a80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
7a90: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
7aa0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7ab0: 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c  (v, OP_AggFocus,
7ac0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f   0, 0);.      fo
7ad0: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
7ae0: 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAgg; i++){.   
7af0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20       Expr *pE;. 
7b00: 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72         if( !pPar
7b10: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67  se->aAgg[i].isAg
7b20: 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  g ) continue;.  
7b30: 20 20 20 20 20 20 70 45 20 3d 20 70 50 61 72 73        pE = pPars
7b40: 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72  e->aAgg[i].pExpr
7b50: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
7b60: 28 20 70 45 3d 3d 30 20 7c 7c 20 70 45 2d 3e 6f  ( pE==0 || pE->o
7b70: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
7b80: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ON );.        as
7b90: 73 65 72 74 28 20 70 45 3d 3d 30 20 7c 7c 20 28  sert( pE==0 || (
7ba0: 70 45 2d 3e 70 4c 69 73 74 21 3d 30 20 26 26 20  pE->pList!=0 && 
7bb0: 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pE->pList->nExpr
7bc0: 3d 3d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ==1) );.        
7bd0: 69 66 28 20 70 45 3d 3d 30 20 7c 7c 20 70 45 2d  if( pE==0 || pE-
7be0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 46 4e 5f 53 75 6d  >iColumn==FN_Sum
7bf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7c00: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7c10: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
7c20: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
7c30: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7c40: 20 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69   OP_AggSet, 0, i
7c50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  );.          con
7c60: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
7c70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7c80: 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
7c90: 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  ize the memory c
7ca0: 65 6c 6c 20 74 6f 20 4e 55 4c 4c 0a 20 20 2a 2f  ell to NULL.  */
7cb0: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
7cc0: 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c  T_Mem ){.    sql
7cd0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
7ce0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
7cf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
7d00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
7d10: 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b  tore, iParm, 1);
7d20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
7d30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
7d40: 61 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  an.  */.  if( is
7d50: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
7d60: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7d70: 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
7d80: 64 69 73 74 69 6e 63 74 2c 20 31 29 3b 0a 20 20  distinct, 1);.  
7d90: 7d 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  }.  pWInfo = sql
7da0: 69 74 65 57 68 65 72 65 42 65 67 69 6e 28 70 50  iteWhereBegin(pP
7db0: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
7dc0: 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 69 66  pWhere, 0);.  if
7dd0: 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
7de0: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
7df0: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
7e00: 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
7e10: 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 64   if we are not d
7e20: 65 61 6c 69 6e 67 20 77 69 74 68 0a 20 20 2a 2a  ealing with.  **
7e30: 20 61 67 67 72 65 67 61 74 65 73 0a 20 20 2a 2f   aggregates.  */
7e40: 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 29 7b  .  if( !isAgg ){
7e50: 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49  .    if( selectI
7e60: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
7e70: 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70   pEList, 0, 0, p
7e80: 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63  OrderBy, distinc
7e90: 74 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  t, eDest, iParm,
7ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7eb0: 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f       pWInfo->iCo
7ec0: 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e  ntinue, pWInfo->
7ed0: 69 42 72 65 61 6b 29 20 29 7b 0a 20 20 20 20 20  iBreak) ){.     
7ee0: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
7ef0: 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  d;.    }.  }..  
7f00: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 65 61  /* If we are dea
7f10: 6c 69 6e 67 20 77 69 74 68 20 61 67 67 72 65 67  ling with aggreg
7f20: 61 74 65 73 2c 20 74 68 65 6e 20 74 6f 20 74 68  ates, then to th
7f30: 65 20 73 70 65 63 69 61 6c 20 61 67 67 72 65 67  e special aggreg
7f40: 61 74 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  ate.  ** process
7f50: 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20 20 65 6c  ing.  .  */.  el
7f60: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 47 72 6f  se{.    if( pGro
7f70: 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  upBy ){.      in
7f80: 74 20 6c 62 6c 31 3b 0a 20 20 20 20 20 20 66 6f  t lbl1;.      fo
7f90: 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42  r(i=0; i<pGroupB
7fa0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
7fb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
7fc0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
7fd0: 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45  GroupBy->a[i].pE
7fe0: 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
7ff0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8000: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65  dOp(v, OP_MakeKe
8010: 79 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  y, pGroupBy->nEx
8020: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 6c 62  pr, 0);.      lb
8030: 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  l1 = sqliteVdbeM
8040: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
8050: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8060: 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75  Op(v, OP_AggFocu
8070: 73 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a 20 20 20  s, 0, lbl1);.   
8080: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
8090: 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29  arse->nAgg; i++)
80a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
80b0: 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73  arse->aAgg[i].is
80c0: 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Agg ) continue;.
80d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
80e0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
80f0: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
8100: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
8110: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8120: 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c 20  , OP_AggSet, 0, 
8130: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
8140: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
8150: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 31  lveLabel(v, lbl1
8160: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
8170: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
8180: 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAgg; i++){.    
8190: 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
81a0: 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20 20 20    int op;.      
81b0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 61 41 67  if( !pParse->aAg
81c0: 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e  g[i].isAgg ) con
81d0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 20  tinue;.      pE 
81e0: 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69  = pParse->aAgg[i
81f0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
8200: 66 28 20 70 45 3d 3d 30 20 29 7b 0a 20 20 20 20  f( pE==0 ){.    
8210: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8220: 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 49 6e 63  dOp(v, OP_AggInc
8230: 72 2c 20 31 2c 20 69 29 3b 0a 20 20 20 20 20 20  r, 1, i);.      
8240: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8250: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
8260: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  ( pE->op==TK_AGG
8270: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
8280: 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70     assert( pE->p
8290: 4c 69 73 74 21 3d 30 20 26 26 20 70 45 2d 3e 70  List!=0 && pE->p
82a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  List->nExpr==1 )
82b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  ;.      sqliteEx
82c0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
82d0: 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  E->pList->a[0].p
82e0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
82f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8300: 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c 20 69 29  OP_AggGet, 0, i)
8310: 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  ;.      switch( 
8320: 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pE->iColumn ){. 
8330: 20 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 4d         case FN_M
8340: 69 6e 3a 20 20 6f 70 20 3d 20 4f 50 5f 4d 69 6e  in:  op = OP_Min
8350: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
8360: 20 20 20 63 61 73 65 20 46 4e 5f 4d 61 78 3a 20     case FN_Max: 
8370: 20 6f 70 20 3d 20 4f 50 5f 4d 61 78 3b 20 20 20   op = OP_Max;   
8380: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
8390: 61 73 65 20 46 4e 5f 41 76 67 3a 20 20 6f 70 20  ase FN_Avg:  op 
83a0: 3d 20 4f 50 5f 41 64 64 3b 20 20 20 62 72 65 61  = OP_Add;   brea
83b0: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
83c0: 46 4e 5f 53 75 6d 3a 20 20 6f 70 20 3d 20 4f 50  FN_Sum:  op = OP
83d0: 5f 41 64 64 3b 20 20 20 62 72 65 61 6b 3b 0a 20  _Add;   break;. 
83e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
83f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8400: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
8410: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8420: 28 76 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20 30  (v, OP_AggSet, 0
8430: 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
8440: 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64  ..  /* End the d
8450: 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
8460: 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  p..  */.  sqlite
8470: 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
8480: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  ;..  /* If we ar
8490: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  e processing agg
84a0: 72 65 67 61 74 65 73 2c 20 77 65 20 6e 65 65 64  regates, we need
84b0: 20 74 6f 20 73 65 74 20 75 70 20 61 20 73 65 63   to set up a sec
84c0: 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76  ond loop.  ** ov
84d0: 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 67  er all of the ag
84e0: 67 72 65 67 61 74 65 20 76 61 6c 75 65 73 20 61  gregate values a
84f0: 6e 64 20 70 72 6f 63 65 73 73 20 74 68 65 6d 2e  nd process them.
8500: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67  .  */.  if( isAg
8510: 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64  g ){.    int end
8520: 61 67 67 20 3d 20 73 71 6c 69 74 65 56 64 62 65  agg = sqliteVdbe
8530: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
8540: 20 20 69 6e 74 20 73 74 61 72 74 61 67 67 3b 0a    int startagg;.
8550: 20 20 20 20 73 74 61 72 74 61 67 67 20 3d 20 73      startagg = s
8560: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8570: 2c 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c  , OP_AggNext, 0,
8580: 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 70 50   endagg);.    pP
8590: 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 31  arse->useAgg = 1
85a0: 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
85b0: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
85c0: 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  eExprIfFalse(pPa
85d0: 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73 74  rse, pHaving, st
85e0: 61 72 74 61 67 67 29 3b 0a 20 20 20 20 7d 0a 20  artagg);.    }. 
85f0: 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e     if( selectInn
8600: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
8610: 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
8620: 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c  derBy, distinct,
8630: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 0a 20   eDest, iParm,. 
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8650: 20 20 20 73 74 61 72 74 61 67 67 2c 20 65 6e 64     startagg, end
8660: 61 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  agg) ){.      go
8670: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
8680: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
8690: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
86a0: 6f 74 6f 2c 20 30 2c 20 73 74 61 72 74 61 67 67  oto, 0, startagg
86b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
86c0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
86d0: 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 73 71   endagg);.    sq
86e0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
86f0: 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b   OP_Noop, 0, 0);
8700: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65  .    pParse->use
8710: 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Agg = 0;.  }..  
8720: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
8730: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
8740: 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20  e, then we need 
8750: 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75  to sort the resu
8760: 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e  lts.  ** and sen
8770: 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61  d them to the ca
8780: 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e  llback one by on
8790: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  e..  */.  if( pO
87a0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65  rderBy ){.    ge
87b0: 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 76  nerateSortTail(v
87c0: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
87d0: 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
87e0: 6e 54 61 62 20 3d 20 62 61 73 65 3b 0a 0a 0a 20  nTab = base;... 
87f0: 20 2f 2a 20 49 73 73 75 65 20 61 20 6e 75 6c 6c   /* Issue a null
8800: 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 61   callback if tha
8810: 74 20 69 73 20 77 68 61 74 20 74 68 65 20 75 73  t is what the us
8820: 65 72 20 77 61 6e 74 73 2e 0a 20 20 2a 2f 0a 20  er wants..  */. 
8830: 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62   if( (pParse->db
8840: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
8850: 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 29 21 3d  _NullCallback)!=
8860: 30 20 26 26 20 65 44 65 73 74 3d 3d 53 52 54 5f  0 && eDest==SRT_
8870: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
8880: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8890: 76 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c 6c 62 61  v, OP_NullCallba
88a0: 63 6b 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ck, pEList->nExp
88b0: 72 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r, 0);.  }..  /*
88c0: 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20   The SELECT was 
88d0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64  successfully cod
88e0: 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65  ed.   Set the re
88f0: 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20  turn code to 0. 
8900: 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
8910: 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  no errors..  */.
8920: 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20    rc = 0;..  /* 
8930: 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f  Control jumps to
8940: 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f   here if an erro
8950: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
8960: 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a   above, or upon.
8970: 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
8980: 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45  coding of the SE
8990: 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63  LECT..  */.selec
89a0: 74 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 41  t_end:.  sqliteA
89b0: 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65  ggregateInfoRese
89c0: 74 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74  t(pParse);.  ret
89d0: 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.