/ Hex Artifact Content
Login

Artifact 9323800e2937e84b52c198fffc51995d822b1779:


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 37 37 20  select.c,v 1.77 
0200: 32 30 30 32 2f 30 33 2f 32 33 20 30 30 3a 33 31  2002/03/23 00:31
0210: 3a 32 39 20 64 72 68 20 45 78 70 20 24 0a 2a 2f  :29 drh Exp $.*/
0220: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0230: 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 41  eInt.h"../*.** A
0240: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65  llocate a new Se
0250: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61  lect structure a
0260: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
0270: 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73  ter to that.** s
0280: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c  tructure..*/.Sel
0290: 65 63 74 20 2a 73 71 6c 69 74 65 53 65 6c 65 63  ect *sqliteSelec
02a0: 74 4e 65 77 28 0a 20 20 45 78 70 72 4c 69 73 74  tNew(.  ExprList
02b0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f 2a   *pEList,     /*
02c0: 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 74   which columns t
02d0: 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 65  o include in the
02e0: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 49 64 4c   result */.  IdL
02f0: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
0300: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
0310: 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20 74  lause -- which t
0320: 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f  ables to scan */
0330: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
0340: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
0350: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
0360: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
0370: 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 47  upBy,   /* the G
0380: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
0390: 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
03a0: 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  g,        /* the
03b0: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 2a   HAVING clause *
03c0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
03d0: 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68 65  rderBy,   /* the
03e0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
03f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74   */.  int isDist
0400: 69 6e 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 74  inct,       /* t
0410: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
0420: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
0430: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
0440: 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20  nLimit,         
0450: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
0460: 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 74 20  .  -1 means not 
0470: 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  used */.  int nO
0480: 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20  ffset           
0490: 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75 65 2e  /* OFFSET value.
04a0: 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 74 20 75    -1 means not u
04b0: 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  sed */.){.  Sele
04c0: 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  ct *pNew;.  pNew
04d0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
04e0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
04f0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
0500: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  ){.    sqliteExp
0510: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69  rListDelete(pELi
0520: 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 49  st);.    sqliteI
0530: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 53 72 63  dListDelete(pSrc
0540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  );.    sqliteExp
0550: 72 44 65 6c 65 74 65 28 70 57 68 65 72 65 29 3b  rDelete(pWhere);
0560: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 4c  .    sqliteExprL
0570: 69 73 74 44 65 6c 65 74 65 28 70 47 72 6f 75 70  istDelete(pGroup
0580: 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45  By);.    sqliteE
0590: 78 70 72 44 65 6c 65 74 65 28 70 48 61 76 69 6e  xprDelete(pHavin
05a0: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78  g);.    sqliteEx
05b0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4f 72  prListDelete(pOr
05c0: 64 65 72 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  derBy);.  }else{
05d0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  .    pNew->pELis
05e0: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20  t = pEList;.    
05f0: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72  pNew->pSrc = pSr
0600: 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 68  c;.    pNew->pWh
0610: 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
0620: 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
0630: 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20   = pGroupBy;.   
0640: 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
0650: 20 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 70 4e   pHaving;.    pN
0660: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  ew->pOrderBy = p
0670: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 4e 65  OrderBy;.    pNe
0680: 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  w->isDistinct = 
0690: 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20  isDistinct;.    
06a0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  pNew->op = TK_SE
06b0: 4c 45 43 54 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  LECT;.    pNew->
06c0: 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d 69 74 3b  nLimit = nLimit;
06d0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 66 66 73  .    pNew->nOffs
06e0: 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b 0a 20 20  et = nOffset;.  
06f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
0700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
0710: 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63   the given Selec
0720: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0730: 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74  all of its subst
0740: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
0750: 64 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65  d sqliteSelectDe
0760: 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70 29 7b  lete(Select *p){
0770: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
0780: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 45 78  turn;.  sqliteEx
0790: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
07a0: 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  pEList);.  sqlit
07b0: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  eIdListDelete(p-
07c0: 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  >pSrc);.  sqlite
07d0: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 57  ExprDelete(p->pW
07e0: 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 45  here);.  sqliteE
07f0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  xprListDelete(p-
0800: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 73 71  >pGroupBy);.  sq
0810: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
0820: 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 73 71  ->pHaving);.  sq
0830: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
0840: 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  te(p->pOrderBy);
0850: 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44  .  sqliteSelectD
0860: 65 6c 65 74 65 28 70 2d 3e 70 50 72 69 6f 72 29  elete(p->pPrior)
0870: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
0880: 2d 3e 7a 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  ->zSelect);.  sq
0890: 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a  liteFree(p);.}..
08a0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
08b0: 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72   aggregate infor
08c0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
08d0: 70 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  parse structure.
08e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
08f0: 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49  sqliteAggregateI
0900: 6e 66 6f 52 65 73 65 74 28 50 61 72 73 65 20 2a  nfoReset(Parse *
0910: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
0920: 65 46 72 65 65 28 70 50 61 72 73 65 2d 3e 61 41  eFree(pParse->aA
0930: 67 67 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61  gg);.  pParse->a
0940: 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Agg = 0;.  pPars
0950: 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20 20 70  e->nAgg = 0;.  p
0960: 50 61 72 73 65 2d 3e 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 7c 7c 20 65 44  =SRT_Table || eD
14a0: 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62  est==SRT_TempTab
14b0: 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
14c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14d0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c  MakeRecord, nCol
14e0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  umn, 0);.    sql
14f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
1500: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61  OP_NewRecno, iPa
1510: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rm, 0);.    sqli
1520: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1530: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
1540: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
1550: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
1560: 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  ey, iParm, 0);. 
1570: 20 7d 65 6c 73 65 20 0a 0a 20 20 2f 2a 20 43 6f   }else ..  /* Co
1580: 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64  nstruct a record
1590: 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20   from the query 
15a0: 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74  result, but inst
15b0: 65 61 64 20 6f 66 0a 20 20 2a 2a 20 73 61 76 69  ead of.  ** savi
15c0: 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20  ng that record, 
15d0: 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20  use it as a key 
15e0: 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e  to delete elemen
15f0: 74 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  ts from.  ** the
1600: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1610: 20 69 50 61 72 6d 2e 0a 20 20 2a 2f 0a 20 20 69   iParm..  */.  i
1620: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  f( eDest==SRT_Ex
1630: 63 65 70 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  cept ){.    int 
1640: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
1650: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
1660: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
1670: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1680: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1690: 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c  NotFound, iParm,
16a0: 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 73 71   addr+3);.    sq
16b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
16c0: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61 72   OP_Delete, iPar
16d0: 6d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 0a  m, 0);.  }else .
16e0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
16f0: 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
1700: 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
1710: 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e  SELECT ...)" con
1720: 73 74 72 75 63 74 2c 0a 20 20 2a 2a 20 74 68 65  struct,.  ** the
1730: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
1740: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
1750: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
1760: 72 69 74 65 20 74 68 69 73 0a 20 20 2a 2a 20 69  rite this.  ** i
1770: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
1780: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
1790: 73 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69  s data..  */.  i
17a0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65  f( eDest==SRT_Se
17b0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
17c0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
17d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
17e0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
17f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1800: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1810: 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 69 50 61  P_PutStrKey, iPa
1820: 72 6d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20  rm, 0);.  }else 
1830: 0a 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ...  /* If this 
1840: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
1850: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
1860: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
1870: 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 74 6f 72  , then.  ** stor
1880: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
1890: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
18a0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
18b0: 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 2a 2a 20   break out.  ** 
18c0: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
18d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
18e0: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20  st==SRT_Mem ){. 
18f0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
1900: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c  mn==1 );.    sql
1910: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
1920: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61  OP_MemStore, iPa
1930: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  rm, 1);.    sqli
1940: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1950: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61  P_Goto, 0, iBrea
1960: 6b 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f  k);.  }else..  /
1970: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
1980: 20 61 62 6f 76 65 2c 20 73 65 6e 64 20 74 68 65   above, send the
1990: 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c   data to the cal
19a0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a  lback function..
19b0: 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 73 71 6c    */.  {.    sql
19c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
19d0: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f  OP_Callback, nCo
19e0: 6c 75 6d 6e 2c 20 69 42 72 65 61 6b 29 3b 0a 20  lumn, iBreak);. 
19f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1a00: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
1a10: 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65  nner loop was ge
1a20: 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20  nerated using a 
1a30: 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42  non-null pOrderB
1a40: 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74  y argument,.** t
1a50: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
1a60: 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61  were placed in a
1a70: 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20   sorter.  After 
1a80: 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d  the loop is term
1a90: 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65  inated.** we nee
1aa0: 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72  d to run the sor
1ab0: 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74  ter and output t
1ac0: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65  he results.  The
1ad0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f   following.** ro
1ae0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
1af0: 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20  the code needed 
1b00: 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73  to do that..*/.s
1b10: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
1b20: 61 74 65 53 6f 72 74 54 61 69 6c 28 56 64 62 65  ateSortTail(Vdbe
1b30: 20 2a 76 2c 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e   *v, int nColumn
1b40: 29 7b 0a 20 20 69 6e 74 20 65 6e 64 20 3d 20 73  ){.  int end = s
1b50: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
1b60: 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64  el(v);.  int add
1b70: 72 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  r;.  sqliteVdbeA
1b80: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c  ddOp(v, OP_Sort,
1b90: 20 30 2c 20 30 29 3b 0a 20 20 61 64 64 72 20 3d   0, 0);.  addr =
1ba0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1bb0: 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c  (v, OP_SortNext,
1bc0: 20 30 2c 20 65 6e 64 29 3b 0a 20 20 73 71 6c 69   0, end);.  sqli
1bd0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1be0: 50 5f 53 6f 72 74 43 61 6c 6c 62 61 63 6b 2c 20  P_SortCallback, 
1bf0: 6e 43 6f 6c 75 6d 6e 2c 20 65 6e 64 29 3b 0a 20  nColumn, end);. 
1c00: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1c10: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1c20: 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 56  addr);.  sqliteV
1c30: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1c40: 76 2c 20 65 6e 64 29 3b 0a 20 20 73 71 6c 69 74  v, end);.  sqlit
1c50: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
1c60: 5f 53 6f 72 74 52 65 73 65 74 2c 20 30 2c 20 30  _SortReset, 0, 0
1c70: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
1c80: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
1c90: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
1ca0: 45 20 68 6f 77 20 6d 61 6e 79 20 63 6f 6c 75 6d  E how many colum
1cb0: 6e 73 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  ns there.** are 
1cc0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e  in the result an
1cd0: 64 20 74 68 65 20 6e 61 6d 65 20 66 6f 72 20 65  d the name for e
1ce0: 61 63 68 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69  ach column.  Thi
1cf0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  s information.**
1d00: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76   is used to prov
1d10: 69 64 65 20 22 61 72 67 63 22 20 61 6e 64 20 22  ide "argc" and "
1d20: 61 7a 43 6f 6c 5b 5d 22 20 76 61 6c 75 65 73 20  azCol[]" values 
1d30: 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  in the callback.
1d40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d50: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
1d60: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
1d70: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
1d80: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
1d90: 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20    int base,     
1da0: 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75        /* VDBE cu
1db0: 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64 69  rsor correspondi
1dc0: 6e 67 20 74 6f 20 66 69 72 73 74 20 65 6e 74 72  ng to first entr
1dd0: 79 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f  y in pTabList */
1de0: 0a 20 20 49 64 4c 69 73 74 20 2a 70 54 61 62 4c  .  IdList *pTabL
1df0: 69 73 74 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ist,   /* List o
1e00: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
1e10: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
1e20: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
1e30: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
1e40: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20  sult set */.){. 
1e50: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1e60: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1e70: 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  i;.  if( pParse-
1e80: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
1e90: 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  v==0 || sqlite_m
1ea0: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
1eb0: 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d  eturn;.  pParse-
1ec0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
1ed0: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64  ;.  sqliteVdbeAd
1ee0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
1ef0: 43 6f 75 6e 74 2c 20 70 45 4c 69 73 74 2d 3e 6e  Count, pEList->n
1f00: 45 78 70 72 2c 20 30 29 3b 0a 20 20 66 6f 72 28  Expr, 0);.  for(
1f10: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
1f20: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1f30: 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 69 6e 74  Expr *p;.    int
1f40: 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 3b 0a   showFullNames;.
1f50: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
1f60: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20  a[i].zName ){.  
1f70: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
1f80: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
1f90: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Name;.      sqli
1fa0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1fb0: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c  P_ColumnName, i,
1fc0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
1fd0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
1fe0: 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c   -1, zName, strl
1ff0: 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  en(zName));.    
2000: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2010: 7d 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74  }.    p = pEList
2020: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
2030: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e    if( p==0 ) con
2040: 74 69 6e 75 65 3b 0a 20 20 20 20 73 68 6f 77 46  tinue;.    showF
2050: 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 70 50 61 72  ullNames = (pPar
2060: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
2070: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
2080: 6d 65 73 29 21 3d 30 3b 0a 20 20 20 20 69 66 28  mes)!=0;.    if(
2090: 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d   p->span.z && p-
20a0: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 26 26 20 21 73  >span.z[0] && !s
20b0: 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a  howFullNames ){.
20c0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
20d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
20e0: 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  (v,OP_ColumnName
20f0: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , i, 0);.      s
2100: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
2110: 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 73 70 61 6e  3(v, -1, p->span
2120: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  .z, p->span.n);.
2130: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
2140: 43 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c  CompressSpace(v,
2150: 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73   addr);.    }els
2160: 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  e if( p->op==TK_
2170: 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69  COLUMN && pTabLi
2180: 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  st ){.      Tabl
2190: 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69  e *pTab = pTabLi
21a0: 73 74 2d 3e 61 5b 70 2d 3e 69 54 61 62 6c 65 20  st->a[p->iTable 
21b0: 2d 20 62 61 73 65 5d 2e 70 54 61 62 3b 0a 20 20  - base].pTab;.  
21c0: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
21d0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
21e0: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
21f0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
2200: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
2210: 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
2220: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
2230: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
2240: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
2250: 20 20 20 20 7a 43 6f 6c 20 3d 20 69 43 6f 6c 3c      zCol = iCol<
2260: 30 20 3f 20 22 5f 52 4f 57 49 44 5f 22 20 3a 20  0 ? "_ROWID_" : 
2270: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
2280: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66  .zName;.      if
2290: 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3e  ( pTabList->nId>
22a0: 31 20 7c 7c 20 73 68 6f 77 46 75 6c 6c 4e 61 6d  1 || showFullNam
22b0: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  es ){.        ch
22c0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
22d0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
22e0: 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61  b;. .        zTa
22f0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
2300: 70 2d 3e 69 54 61 62 6c 65 20 2d 20 62 61 73 65  p->iTable - base
2310: 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ].zAlias;.      
2320: 20 20 69 66 28 20 73 68 6f 77 46 75 6c 6c 4e 61    if( showFullNa
2330: 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29  mes || zTab==0 )
2340: 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e   zTab = pTab->zN
2350: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ame;.        sql
2360: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  iteSetString(&zN
2370: 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  ame, zTab, ".", 
2380: 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  zCol, 0);.      
2390: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
23a0: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61  p(v, OP_ColumnNa
23b0: 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  me, i, 0);.     
23c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
23d0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61  ngeP3(v, -1, zNa
23e0: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  me, strlen(zName
23f0: 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
2400: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
2410: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2420: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
2430: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
2440: 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20  Name, i, 0);.   
2450: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
2460: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a  hangeP3(v, -1, z
2470: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Col, 0);.      }
2480: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
2490: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
24a0: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
24b0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
24c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 4f  iteVdbeAddOp(v,O
24d0: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c  P_ColumnName, i,
24e0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
24f0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
2500: 20 2d 31 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20   -1, p->span.z, 
2510: 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  p->span.n);.    
2520: 20 20 73 71 6c 69 74 65 56 64 62 65 43 6f 6d 70    sqliteVdbeComp
2530: 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64  ressSpace(v, add
2540: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
2550: 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b       char zName[
2560: 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  30];.      asser
2570: 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  t( p->op!=TK_COL
2580: 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d  UMN || pTabList=
2590: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 70 72 69  =0 );.      spri
25a0: 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75  ntf(zName, "colu
25b0: 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20  mn%d", i+1);.   
25c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
25d0: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e  Op(v, OP_ColumnN
25e0: 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ame, i, 0);.    
25f0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
2600: 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d  geP3(v, -1, zNam
2610: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
2620: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
2630: 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68  /*.** Name of th
2640: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65  e connection ope
2650: 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20  rator, used for 
2660: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
2670: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
2680: 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61  char *selectOpNa
2690: 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68  me(int id){.  ch
26a0: 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28  ar *z;.  switch(
26b0: 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20   id ){.    case 
26c0: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20  TK_ALL:       z 
26d0: 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20  = "UNION ALL";  
26e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
26f0: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a   TK_INTERSECT: z
2700: 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20   = "INTERSECT"; 
2710: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
2720: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20  e TK_EXCEPT:    
2730: 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20  z = "EXCEPT";   
2740: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
2750: 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20  fault:          
2760: 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20   z = "UNION";   
2770: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
2780: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
2790: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45  .** Given a SELE
27a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65  CT statement, ge
27b0: 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73  nerate a Table s
27c0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
27d0: 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72  scribes.** the r
27e0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61  esult set of tha
27f0: 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62  t SELECT..*/.Tab
2800: 6c 65 20 2a 73 71 6c 69 74 65 52 65 73 75 6c 74  le *sqliteResult
2810: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
2820: 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20  e *pParse, char 
2830: 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63  *zTabName, Selec
2840: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
2850: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e  able *pTab;.  in
2860: 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  t i;.  ExprList 
2870: 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 61 74 69  *pEList;.  stati
2880: 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75  c int fillInColu
2890: 6d 6e 4c 69 73 74 28 50 61 72 73 65 2a 2c 20 53  mnList(Parse*, S
28a0: 65 6c 65 63 74 2a 29 3b 0a 0a 20 20 69 66 28 20  elect*);..  if( 
28b0: 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74  fillInColumnList
28c0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
28d0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
28e0: 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20  0;.  }.  pTab = 
28f0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
2900: 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
2910: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
2920: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2930: 7d 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  }.  pTab->zName 
2940: 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c  = zTabName ? sql
2950: 69 74 65 53 74 72 44 75 70 28 7a 54 61 62 4e 61  iteStrDup(zTabNa
2960: 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73  me) : 0;.  pELis
2970: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
2980: 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f  ist;.  pTab->nCo
2990: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
29a0: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
29b0: 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70  b->nCol>0 );.  p
29c0: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69  Tab->aCol = sqli
29d0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
29e0: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a  (pTab->aCol[0])*
29f0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
2a00: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
2a10: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
2a20: 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 69 66   Expr *p;.    if
2a30: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
2a40: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 70 54  Name ){.      pT
2a50: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
2a60: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
2a70: 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  (pEList->a[i].zN
2a80: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ame);.    }else 
2a90: 69 66 28 20 28 70 3d 70 45 4c 69 73 74 2d 3e 61  if( (p=pEList->a
2aa0: 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e  [i].pExpr)->span
2ab0: 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b  .z && p->span.z[
2ac0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0] ){.      sqli
2ad0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 54  teSetNString(&pT
2ae0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
2af0: 65 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d  e, p->span.z, p-
2b00: 3e 73 70 61 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20  >span.n, 0);.   
2b10: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70   }else if( p->op
2b20: 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 2d 3e 70  ==TK_DOT && p->p
2b30: 52 69 67 68 74 20 26 26 20 70 2d 3e 70 52 69 67  Right && p->pRig
2b40: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 0a 20  ht->token.z &&. 
2b50: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69            p->pRi
2b60: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20  ght->token.z[0] 
2b70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
2b80: 65 74 4e 53 74 72 69 6e 67 28 26 70 54 61 62 2d  etNString(&pTab-
2b90: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[i].zName, 
2ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  .           p->p
2bb0: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  Right->token.z, 
2bc0: 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  p->pRight->token
2bd0: 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  .n, 0);.    }els
2be0: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42  e{.      char zB
2bf0: 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73 70  uf[30];.      sp
2c00: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 63 6f 6c  rintf(zBuf, "col
2c10: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20  umn%d", i+1);.  
2c20: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
2c30: 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
2c40: 53 74 72 44 75 70 28 7a 42 75 66 29 3b 0a 20 20  StrDup(zBuf);.  
2c50: 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e    }.  }.  pTab->
2c60: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65  iPKey = -1;.  re
2c70: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
2c80: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 67 69 76 65  .** For the give
2c90: 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
2ca0: 6e 74 2c 20 64 6f 20 74 77 6f 20 74 68 69 6e 67  nt, do two thing
2cb0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s..**.**    (1) 
2cc0: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61   Fill in the pTa
2cd0: 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20  bList->a[].pTab 
2ce0: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 49 64  fields in the Id
2cf0: 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
2d00: 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 74 68        defines th
2d10: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
2d20: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 73  that should be s
2d30: 63 61 6e 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20  canned. .**.**  
2d40: 20 20 28 32 29 20 20 49 66 20 74 68 65 20 63 6f    (2)  If the co
2d50: 6c 75 6d 6e 73 20 74 6f 20 62 65 20 65 78 74 72  lumns to be extr
2d60: 61 63 74 65 64 20 76 61 72 69 61 62 6c 65 20 28  acted variable (
2d70: 70 45 4c 69 73 74 29 20 69 73 20 4e 55 4c 4c 0a  pEList) is NULL.
2d80: 2a 2a 20 20 20 20 20 20 20 20 20 28 6d 65 61 6e  **         (mean
2d90: 69 6e 67 20 74 68 61 74 20 61 20 22 2a 22 20 77  ing that a "*" w
2da0: 61 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 53  as used in the S
2db0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 29 20 74 68  QL statement) th
2dc0: 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 72  en.**         cr
2dd0: 65 61 74 65 20 61 20 66 61 6b 65 20 70 45 4c 69  eate a fake pELi
2de0: 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  st containing th
2df0: 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63  e names of all c
2e00: 6f 6c 75 6d 6e 73 0a 2a 2a 20 20 20 20 20 20 20  olumns.**       
2e10: 20 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 2e    of all tables.
2e20: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
2e30: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
2e40: 74 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65  there are proble
2e50: 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ms, leave an err
2e60: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e  or message.** in
2e70: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
2e80: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  rn non-zero..*/.
2e90: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
2ea0: 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73  nColumnList(Pars
2eb0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
2ec0: 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  t *p){.  int i, 
2ed0: 6a 2c 20 6b 3b 0a 20 20 49 64 4c 69 73 74 20 2a  j, k;.  IdList *
2ee0: 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
2ef0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
2f00: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20  Table *pTab;..  
2f10: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
2f20: 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
2f30: 31 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  1;.  pTabList = 
2f40: 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
2f50: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a  t = p->pEList;..
2f60: 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
2f70: 72 79 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ry table in the 
2f80: 74 61 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a 2f  table list..  */
2f90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
2fa0: 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  abList->nId; i++
2fb0: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c  ){.    if( pTabL
2fc0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 29  ist->a[i].pTab )
2fd0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
2fe0: 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20  routine has run 
2ff0: 62 65 66 6f 72 65 21 20 20 4e 6f 20 6e 65 65 64  before!  No need
3000: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a   to continue */.
3010: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
3020: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
3030: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  abList->a[i].zNa
3040: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  me==0 ){.      /
3050: 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
3060: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
3070: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
3080: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
3090: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  abList->a[i].pSe
30a0: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  lect!=0 );.     
30b0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
30c0: 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
30d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 52 65 73         sqliteRes
30e0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
30f0: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d  Parse, pTabList-
3100: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 0a 20 20  >a[i].zAlias,.  
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3130: 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e        pTabList->
3140: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
3150: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
3160: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
3170: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
3180: 20 20 20 20 70 54 61 62 2d 3e 69 73 54 72 61 6e      pTab->isTran
3190: 73 69 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d  sient = 1;.    }
31a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
31b0: 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
31c0: 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e   or view name in
31d0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
31e0: 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 4c 69   */.      pTabLi
31f0: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20  st->a[i].pTab = 
3200: 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20  pTab = .        
3210: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
3220: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
3230: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
3240: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
3250: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
3260: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
3270: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
3280: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
3290: 3a 20 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  : ", .          
32a0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
32b0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
32c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
32d0: 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  +;.        retur
32e0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
32f0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
3300: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
3310: 69 66 28 20 73 71 6c 69 74 65 56 69 65 77 47 65  if( sqliteViewGe
3320: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
3330: 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20  rse, pTab) ){.  
3340: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
3350: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3360: 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b      pTabList->a[
3370: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  i].pSelect = sql
3380: 69 74 65 53 65 6c 65 63 74 44 75 70 28 70 54 61  iteSelectDup(pTa
3390: 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b->pSelect);.   
33a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
33b0: 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22    /* For every "
33c0: 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  *" that occurs i
33d0: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
33e0: 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  t, insert the na
33f0: 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20  mes of.  ** all 
3400: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
3410: 61 62 6c 65 73 2e 20 20 54 68 65 20 70 61 72 73  ables.  The pars
3420: 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
3430: 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
3440: 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
3450: 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66  K_ALL operator f
3460: 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
3470: 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
3480: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20   column list..  
3490: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
34a0: 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74   code just has t
34b0: 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f  o locate the TK_
34c0: 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ALL expressions 
34d0: 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20  and expand.  ** 
34e0: 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
34f0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
3500: 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
3510: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  s..  */.  for(k=
3520: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
3530: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66  pr; k++){.    if
3540: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70  ( pEList->a[k].p
3550: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  Expr->op==TK_ALL
3560: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
3570: 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
3580: 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63  xpr ){.    struc
3590: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
35a0: 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
35b0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
35c0: 65 77 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ew = 0;.    for(
35d0: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
35e0: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
35f0: 20 20 69 66 28 20 61 5b 6b 5d 2e 70 45 78 70 72    if( a[k].pExpr
3600: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ->op!=TK_ALL ){.
3610: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
3620: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70  qliteExprListApp
3630: 65 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  end(pNew, a[k].p
3640: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
3650: 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
3660: 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
3670: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
3680: 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
3690: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b  = 0;.        a[k
36a0: 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
36b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
36d0: 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  bList->nId; i++)
36e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
36f0: 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69  e *pTab = pTabLi
3700: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a 20  st->a[i].pTab;. 
3710: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
3720: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
3730: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
3740: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a    Expr *pExpr, *
3750: 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a  pLeft, *pRight;.
3760: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
3770: 68 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  ht = sqliteExpr(
3780: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b  TK_ID, 0, 0, 0);
3790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
37a0: 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65   pRight==0 ) bre
37b0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
37c0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20  pRight->token.z 
37d0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
37e0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
37f0: 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e     pRight->token
3800: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 61 62  .n = strlen(pTab
3810: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
3820: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
3830: 28 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 29 7b  ( pTab->zName ){
3840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
3850: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45 78 70  Left = sqliteExp
3860: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30  r(TK_ID, 0, 0, 0
3870: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3880: 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 20   if( pLeft==0 ) 
3890: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
38a0: 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73       if( pTabLis
38b0: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 20 26  t->a[i].zAlias &
38c0: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  & pTabList->a[i]
38d0: 2e 7a 41 6c 69 61 73 5b 30 5d 20 29 7b 0a 20 20  .zAlias[0] ){.  
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
38f0: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 70  eft->token.z = p
3900: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  TabList->a[i].zA
3910: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
3920: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b        pLeft->tok
3930: 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54  en.n = strlen(pT
3940: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
3950: 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ias);.          
3960: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3970: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
3980: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 70 54 61 62  ->token.z = pTab
3990: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
39a0: 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e           pLeft->
39b0: 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e  token.n = strlen
39c0: 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pTab->zName);. 
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
39f0: 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  pr = sqliteExpr(
3a00: 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
3a10: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
3a20: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
3a30: 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  pr==0 ) break;. 
3a40: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
3a50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3a60: 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
3a80: 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70  xpr->span = pExp
3a90: 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  r->token;.      
3aa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3ab0: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
3ac0: 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  eExprListAppend(
3ad0: 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 30 29 3b  pNew, pExpr, 0);
3ae0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3af0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3b00: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45     }.    sqliteE
3b10: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
3b20: 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45  List);.    p->pE
3b30: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
3b40: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3b50: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3b60: 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79 20 75  ne recursively u
3b70: 6e 6c 69 6e 6b 73 20 74 68 65 20 53 65 6c 65 63  nlinks the Selec
3b80: 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 54 61 62 20  t.pSrc.a[].pTab 
3b90: 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 69 6e 20 61  pointers.** in a
3ba0: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
3bb0: 65 2e 20 20 49 74 20 6a 75 73 74 20 73 65 74 73  e.  It just sets
3bc0: 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f   the pointers to
3bd0: 20 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 2a 2a 20   NULL.  This.** 
3be0: 72 6f 75 74 69 6e 65 20 69 73 20 72 65 63 75 72  routine is recur
3bf0: 73 69 76 65 20 69 6e 20 74 68 65 20 73 65 6e 73  sive in the sens
3c00: 65 20 74 68 61 74 20 69 66 20 74 68 65 20 53 65  e that if the Se
3c10: 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 53  lect.pSrc.a[].pS
3c20: 65 6c 65 63 74 0a 2a 2a 20 70 6f 69 6e 74 65 72  elect.** pointer
3c30: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
3c40: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
3c50: 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
3c60: 20 6f 6e 20 74 68 61 74 20 70 6f 69 6e 74 65 72   on that pointer
3c70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3c80: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f  tine is called o
3c90: 6e 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  n the Select str
3ca0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69  ucture that defi
3cb0: 6e 65 73 20 61 0a 2a 2a 20 56 49 45 57 20 69 6e  nes a.** VIEW in
3cc0: 20 6f 72 64 65 72 20 74 6f 20 75 6e 64 6f 20 61   order to undo a
3cd0: 6e 79 20 62 69 6e 64 69 6e 67 73 20 74 6f 20 74  ny bindings to t
3ce0: 61 62 6c 65 73 2e 20 20 54 68 69 73 20 69 73 20  ables.  This is 
3cf0: 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 62 65 63  necessary.** bec
3d00: 61 75 73 65 20 74 68 6f 73 65 20 74 61 62 6c 65  ause those table
3d10: 73 20 6d 69 67 68 74 20 62 65 20 44 52 4f 50 65  s might be DROPe
3d20: 64 20 62 79 20 61 20 73 75 62 73 65 71 75 65 6e  d by a subsequen
3d30: 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  t SQL command..*
3d40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 65 6c  /.void sqliteSel
3d50: 65 63 74 55 6e 62 69 6e 64 28 53 65 6c 65 63 74  ectUnbind(Select
3d60: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
3d70: 20 49 64 4c 69 73 74 20 2a 70 53 72 63 20 3d 20   IdList *pSrc = 
3d80: 70 2d 3e 70 53 72 63 3b 0a 20 20 54 61 62 6c 65  p->pSrc;.  Table
3d90: 20 2a 70 54 61 62 3b 0a 20 20 69 66 28 20 70 3d   *pTab;.  if( p=
3da0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
3db0: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
3dc0: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
3dd0: 66 28 20 28 70 54 61 62 20 3d 20 70 53 72 63 2d  f( (pTab = pSrc-
3de0: 3e 61 5b 69 5d 2e 70 54 61 62 29 21 3d 30 20 29  >a[i].pTab)!=0 )
3df0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  {.      if( pTab
3e00: 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b  ->isTransient ){
3e10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 44  .        sqliteD
3e20: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 54  eleteTable(0, pT
3e30: 61 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ab);.        sql
3e40: 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28  iteSelectDelete(
3e50: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  pSrc->a[i].pSele
3e60: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 53 72  ct);.        pSr
3e70: 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20  c->a[i].pSelect 
3e80: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
3e90: 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54     pSrc->a[i].pT
3ea0: 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  ab = 0;.      if
3eb0: 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  ( pSrc->a[i].pSe
3ec0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
3ed0: 73 71 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69  sqliteSelectUnbi
3ee0: 6e 64 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  nd(pSrc->a[i].pS
3ef0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a  elect);.      }.
3f00: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
3f10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3f20: 61 73 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69  associates entri
3f30: 65 73 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  es in an ORDER B
3f40: 59 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  Y expression lis
3f50: 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e  t with.** column
3f60: 73 20 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20  s in a result.  
3f70: 46 6f 72 20 65 61 63 68 20 4f 52 44 45 52 20 42  For each ORDER B
3f80: 59 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  Y expression, th
3f90: 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74  e opcode of.** t
3fa0: 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64  he top-level nod
3fb0: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
3fc0: 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68  TK_COLUMN and th
3fd0: 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  e iColumn value 
3fe0: 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65  of.** the top-le
3ff0: 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c  vel node is fill
4000: 65 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d  ed in with colum
4010: 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  n number and the
4020: 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65   iTable.** value
4030: 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65   of the top-leve
4040: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
4050: 20 77 69 74 68 20 69 54 61 62 6c 65 20 70 61 72   with iTable par
4060: 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ameter..**.** If
4070: 20 74 68 65 72 65 20 61 72 65 20 70 72 69 6f 72   there are prior
4080: 20 53 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c   SELECT clauses,
4090: 20 74 68 65 79 20 61 72 65 20 70 72 6f 63 65 73   they are proces
40a0: 73 65 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61  sed first.  A ma
40b0: 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72  tch.** in an ear
40c0: 6c 69 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65  lier SELECT take
40d0: 73 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  s precedence ove
40e0: 72 20 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54  r a later SELECT
40f0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72  ..**.** Any entr
4100: 79 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  y that does not 
4110: 6d 61 74 63 68 20 69 73 20 66 6c 61 67 67 65 64  match is flagged
4120: 20 61 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54   as an error.  T
4130: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
4140: 65 72 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e  errors is return
4150: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
4160: 74 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  t matchOrderbyTo
4170: 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
4180: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
4190: 20 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20    /* A place to 
41a0: 6c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  leave error mess
41b0: 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ages */.  Select
41c0: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
41d0: 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65    /* Match to re
41e0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  sult columns of 
41f0: 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  this SELECT */. 
4200: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
4210: 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rBy,     /* The 
4220: 4f 52 44 45 52 20 42 59 20 76 61 6c 75 65 73 20  ORDER BY values 
4230: 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  to match against
4240: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
4250: 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
4260: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
4270: 74 68 69 73 20 74 68 69 73 20 76 61 6c 75 65 20  this this value 
4280: 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69  in iTable */.  i
4290: 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  nt mustComplete 
42a0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55         /* If TRU
42b0: 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20  E all ORDER BYs 
42c0: 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b  must match */.){
42d0: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
42e0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45  .  int i, j;.  E
42f0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
4300: 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d  ..  if( pSelect=
4310: 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d  =0 || pOrderBy==
4320: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
4330: 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65  if( mustComplete
4340: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
4350: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
4360: 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72  pr; i++){ pOrder
4370: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20  By->a[i].done = 
4380: 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66  0; }.  }.  if( f
4390: 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28  illInColumnList(
43a0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
43b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
43c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c  ;.  }.  if( pSel
43d0: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ect->pPrior ){. 
43e0: 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65     if( matchOrde
43f0: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
4400: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  se, pSelect->pPr
4410: 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69  ior, pOrderBy, i
4420: 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20  Table, 0) ){.   
4430: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
4440: 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
4450: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
4460: 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
4470: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
4480: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
4490: 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  *pE = pOrderBy->
44a0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
44b0: 69 6e 74 20 6d 61 74 63 68 20 3d 20 30 3b 0a 20  int match = 0;. 
44c0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d     if( pOrderBy-
44d0: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e  >a[i].done ) con
44e0: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a  tinue;.    for(j
44f0: 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; j<pEList->nE
4500: 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
4510: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a   if( pEList->a[j
4520: 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e  ].zName && (pE->
4530: 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d  op==TK_ID || pE-
4540: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20  >op==TK_STRING) 
4550: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
4560: 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b  *zName, *zLabel;
4570: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
4580: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e   pEList->a[j].zN
4590: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ame;.        ass
45a0: 65 72 74 28 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a  ert( pE->token.z
45b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61 62   );.        zLab
45c0: 65 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  el = sqliteStrND
45d0: 75 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  up(pE->token.z, 
45e0: 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pE->token.n);.  
45f0: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75        sqliteDequ
4600: 6f 74 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20  ote(zLabel);.   
4610: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53       if( sqliteS
4620: 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c  trICmp(zName, zL
4630: 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20  abel)==0 ){ .   
4640: 20 20 20 20 20 20 20 6d 61 74 63 68 20 3d 20 31         match = 1
4650: 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
4660: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
4670: 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d  zLabel);.      }
4680: 0a 20 20 20 20 20 20 69 66 28 20 6d 61 74 63 68  .      if( match
4690: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 45 78 70  ==0 && sqliteExp
46a0: 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c  rCompare(pE, pEL
46b0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29  ist->a[j].pExpr)
46c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63   ){.        matc
46d0: 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  h = 1;.      }. 
46e0: 20 20 20 20 20 69 66 28 20 6d 61 74 63 68 20 29       if( match )
46f0: 7b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 6f 70  {.        pE->op
4700: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
4710: 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
4720: 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 70  n = j;.        p
4730: 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  E->iTable = iTab
4740: 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  le;.        pOrd
4750: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
4760: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
4770: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4780: 7d 0a 20 20 20 20 69 66 28 20 21 6d 61 74 63 68  }.    if( !match
4790: 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65   && mustComplete
47a0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a   ){.      char z
47b0: 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73  Buf[30];.      s
47c0: 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 22  printf(zBuf,"%d"
47d0: 2c 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ,i+1);.      sql
47e0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
47f0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
4800: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75  ORDER BY term nu
4810: 6d 62 65 72 20 22 2c 20 7a 42 75 66 2c 20 0a 20  mber ", zBuf, . 
4820: 20 20 20 20 20 20 20 22 20 64 6f 65 73 20 6e 6f         " does no
4830: 74 20 6d 61 74 63 68 20 61 6e 79 20 72 65 73 75  t match any resu
4840: 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  lt column", 0);.
4850: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
4860: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 6e 45 72 72  rr++;.      nErr
4870: 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ++;.      break;
4880: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4890: 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f  urn nErr;  .}../
48a0: 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20  *.** Get a VDBE 
48b0: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
48c0: 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43  rser context.  C
48d0: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
48e0: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
48f0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
4900: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
4910: 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73   and leave a mes
4920: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
4930: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 47  */.Vdbe *sqliteG
4940: 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
4950: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
4960: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
4970: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
4980: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
4990: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 56 64  pVdbe = sqliteVd
49a0: 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d  beCreate(pParse-
49b0: 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >db);.  }.  retu
49c0: 72 6e 20 76 3b 0a 7d 0a 20 20 20 20 0a 0a 2f 2a  rn v;.}.    ../*
49d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
49e0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
49f0: 6f 63 65 73 73 20 61 20 71 75 65 72 79 20 74 68  ocess a query th
4a00: 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65  at is really the
4a10: 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74   union.** or int
4a20: 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f  ersection of two
4a30: 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
4a40: 65 20 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74  e queries..*/.st
4a50: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
4a60: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
4a70: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
4a80: 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50  nt eDest, int iP
4a90: 61 72 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  arm){.  int rc; 
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4ab0: 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
4ac0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
4ad0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
4ae0: 72 3b 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65  r;     /* Anothe
4af0: 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
4b00: 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
4b10: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
4b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
4b30: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
4b40: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
4b50: 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20   base;          
4b60: 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20 76 61 6c   /* Baseline val
4b70: 75 65 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 6e  ue for pParse->n
4b80: 54 61 62 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b  Tab */..  /* Mak
4b90: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
4ba0: 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
4bb0: 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
4bc0: 43 54 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 0a  CTs.  Only the .
4bd0: 20 20 2a 2a 20 6c 61 73 74 20 53 45 4c 45 43 54    ** last SELECT
4be0: 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
4bf0: 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
4c00: 20 42 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   BY..  */.  if( 
4c10: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f  p==0 || p->pPrio
4c20: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  r==0 ) return 1;
4c30: 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
4c40: 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 50 72  Prior;.  if( pPr
4c50: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ior->pOrderBy ){
4c60: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
4c70: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
4c80: 72 72 4d 73 67 2c 22 4f 52 44 45 52 20 42 59 20  rrMsg,"ORDER BY 
4c90: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
4ca0: 6d 65 20 61 66 74 65 72 20 22 2c 0a 20 20 20 20  me after ",.    
4cb0: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
4cc0: 2d 3e 6f 70 29 2c 20 22 20 6e 6f 74 20 62 65 66  ->op), " not bef
4cd0: 6f 72 65 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  ore", 0);.    pP
4ce0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
4cf0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
4d00: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
4d10: 77 65 20 68 61 76 65 20 61 20 76 61 6c 69 64 20  we have a valid 
4d20: 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49  query engine.  I
4d30: 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20  f not, create a 
4d40: 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  new one..  */.  
4d50: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
4d60: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
4d70: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31   v==0 ) return 1
4d80: 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  ;..  /* Create t
4d90: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
4da0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
4db0: 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
4dc0: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
4dd0: 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  T_TempTable ){. 
4de0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4df0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
4e00: 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  p, iParm, 0);.  
4e10: 20 20 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61    eDest = SRT_Ta
4e20: 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ble;.  }..  /* P
4e30: 72 6f 63 65 73 73 20 74 68 65 20 55 4e 49 4f 4e  rocess the UNION
4e40: 20 6f 72 20 49 4e 54 45 52 53 45 43 54 49 4f 4e   or INTERSECTION
4e50: 0a 20 20 2a 2f 0a 20 20 62 61 73 65 20 3d 20 70  .  */.  base = p
4e60: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 73  Parse->nTab;.  s
4e70: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
4e80: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
4e90: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
4ea0: 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
4eb0: 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
4ec0: 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
4ed0: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
4ee0: 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
4ef0: 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
4f00: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
4f10: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
4f20: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
4f30: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
4f40: 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
4f50: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
4f60: 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
4f70: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
4f80: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
4f90: 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 0a 20  or selects */.. 
4fa0: 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 70       priorOp = p
4fb0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53  ->op==TK_ALL ? S
4fc0: 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f 55  RT_Table : SRT_U
4fd0: 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nion;.      if( 
4fe0: 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29  eDest==priorOp )
4ff0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
5000: 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70  can reuse a temp
5010: 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65  orary table gene
5020: 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43  rated by a SELEC
5030: 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20  T to our.       
5040: 20 2a 2a 20 72 69 67 68 74 2e 20 20 54 68 69 73   ** right.  This
5050: 20 61 6c 73 6f 20 6d 65 61 6e 73 20 77 65 20 61   also means we a
5060: 72 65 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  re not the right
5070: 2d 6d 6f 73 74 20 73 65 6c 65 63 74 20 61 6e 64  -most select and
5080: 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   so.        ** w
5090: 65 20 63 61 6e 6e 6f 74 20 68 61 76 65 20 61 6e  e cannot have an
50a0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
50b0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
50c0: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69      unionTab = i
50d0: 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 61 73  Parm;.        as
50e0: 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
50f0: 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 65  y==0 );.      }e
5100: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
5110: 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
5120: 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
5130: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
5140: 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
5150: 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61     ** intermedia
5160: 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20  te results..    
5170: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
5180: 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65  nionTab = pParse
5190: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
51a0: 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
51b0: 79 20 0a 20 20 20 20 20 20 20 20 26 26 20 6d 61  y .        && ma
51c0: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
51d0: 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  mn(pParse, p, p-
51e0: 3e 70 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e  >pOrderBy, union
51f0: 54 61 62 2c 20 31 29 20 29 7b 0a 20 20 20 20 20  Tab, 1) ){.     
5200: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
5210: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5220: 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41   if( p->op!=TK_A
5230: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
5240: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5250: 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
5260: 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20  unionTab, 1);.  
5270: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
5280: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65  beAddOp(v, OP_Ke
5290: 79 41 73 44 61 74 61 2c 20 75 6e 69 6f 6e 54 61  yAsData, unionTa
52a0: 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, 1);.        }
52b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
52c0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
52d0: 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
52e0: 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
52f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
5300: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
5310: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
5320: 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
5330: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5340: 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63  rc = sqliteSelec
5350: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
5360: 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
5370: 54 61 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  Tab, 0, 0, 0);. 
5380: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
5390: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
53a0: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
53b0: 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
53c0: 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
53d0: 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f      switch( p->o
53e0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61  p ){.         ca
53f0: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f  se TK_EXCEPT:  o
5400: 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20  p = SRT_Except; 
5410: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5420: 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
5430: 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f     op = SRT_Unio
5440: 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  n;    break;.   
5450: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c        case TK_AL
5460: 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f  L:     op = SRT_
5470: 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b  Table;    break;
5480: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
5490: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
54a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53      rc = sqliteS
54b0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
54c0: 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30   op, unionTab, 0
54d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 0, 0);.      p
54e0: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
54f0: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  r;.      if( rc 
5500: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5510: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
5520: 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
5530: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
5540: 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
5550: 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  m.      ** it is
5560: 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74   that we current
5570: 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ly need..      *
5580: 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  /      .      if
5590: 28 20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  ( eDest!=priorOp
55a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
55b0: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
55c0: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
55d0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
55e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65   );.        gene
55f0: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
5600: 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c  pParse, p->base,
5610: 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a   0, p->pEList);.
5620: 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
5630: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
5640: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
5650: 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56   iCont = sqliteV
5660: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
5670: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
5680: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
5690: 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
56a0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
56b0: 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
56c0: 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  eVdbeCurrentAddr
56d0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  (v);.        rc 
56e0: 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  = selectInnerLoo
56f0: 70 28 70 50 61 72 73 65 2c 20 30 2c 20 75 6e 69  p(pParse, 0, uni
5700: 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74  onTab, p->pEList
5710: 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
5720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5730: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
5740: 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  y, -1, eDest, iP
5750: 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  arm, .          
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b     iCont, iBreak
5780: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
5790: 63 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  c ) return 1;.  
57a0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
57b0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
57c0: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
57d0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
57e0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
57f0: 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20  nTab, iStart);. 
5800: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
5810: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
5820: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
5830: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5840: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  p(v, OP_Close, u
5850: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
5860: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
5870: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
5880: 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
5890: 69 6c 28 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  il(v, p->pEList-
58a0: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >nExpr);.       
58b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
58c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
58d0: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
58e0: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ECT: {.      int
58f0: 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20   tab1, tab2;.   
5900: 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
5910: 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 0a 20  reak, iStart;.. 
5920: 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
5930: 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
5940: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
5950: 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
5960: 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
5970: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
5980: 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
5990: 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
59a0: 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
59b0: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
59c0: 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
59d0: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
59e0: 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
59f0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
5a00: 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
5a10: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
5a20: 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 6d  p->pOrderBy && m
5a30: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
5a40: 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e  umn(pParse,p,p->
5a50: 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29  pOrderBy,tab1,1)
5a60: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
5a70: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
5a80: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5a90: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
5aa0: 6d 70 2c 20 74 61 62 31 2c 20 31 29 3b 0a 20 20  mp, tab1, 1);.  
5ab0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5ac0: 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44  dOp(v, OP_KeyAsD
5ad0: 61 74 61 2c 20 74 61 62 31 2c 20 31 29 3b 0a 0a  ata, tab1, 1);..
5ae0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
5af0: 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
5b00: 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
5b10: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
5b20: 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
5b30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c    rc = sqliteSel
5b40: 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
5b50: 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  or, SRT_Union, t
5b60: 61 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ab1, 0, 0, 0);. 
5b70: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
5b80: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
5b90: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
5ba0: 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20  ent SELECT into 
5bb0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
5bc0: 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a  "tab2".      */.
5bd0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
5be0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
5bf0: 54 65 6d 70 2c 20 74 61 62 32 2c 20 31 29 3b 0a  Temp, tab2, 1);.
5c00: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
5c10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41  AddOp(v, OP_KeyA
5c20: 73 44 61 74 61 2c 20 74 61 62 32 2c 20 31 29 3b  sData, tab2, 1);
5c30: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
5c40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
5c50: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
5c60: 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69  arse, p, SRT_Uni
5c70: 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c 20  on, tab2, 0, 0, 
5c80: 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  0);.      p->pPr
5c90: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
5ca0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
5cb0: 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f  urn rc;..      /
5cc0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
5cd0: 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
5ce0: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
5cf0: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
5d00: 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
5d10: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
5d20: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
5d30: 29 3b 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74  );.      generat
5d40: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
5d50: 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 30 2c  rse, p->base, 0,
5d60: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
5d70: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
5d80: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
5d90: 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20  v);.      iCont 
5da0: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
5db0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
5dc0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5dd0: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
5de0: 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  b1, iBreak);.   
5df0: 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
5e00: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5e10: 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61 62 31 2c  P_FullKey, tab1,
5e20: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
5e30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5e40: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
5e50: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72   iCont);.      r
5e60: 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  c = selectInnerL
5e70: 6f 6f 70 28 70 50 61 72 73 65 2c 20 30 2c 20 74  oop(pParse, 0, t
5e80: 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ab1, p->pEList->
5e90: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5eb0: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c      p->pOrderBy,
5ec0: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
5ed0: 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ef0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
5f00: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
5f10: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
5f20: 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76  sqliteVdbeResolv
5f30: 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
5f40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
5f50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
5f60: 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
5f70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
5f80: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
5f90: 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
5fa0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5fb0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  p(v, OP_Close, t
5fc0: 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab2, 0);.      s
5fd0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5fe0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31  , OP_Close, tab1
5ff0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
6000: 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
6010: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53         generateS
6020: 6f 72 74 54 61 69 6c 28 76 2c 20 70 2d 3e 70 45  ortTail(v, p->pE
6030: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
6040: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6050: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  k;.    }.  }.  a
6060: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
6070: 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
6080: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  st );.  if( p->p
6090: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50  EList->nExpr!=pP
60a0: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
60b0: 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
60c0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
60d0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 53 45  se->zErrMsg, "SE
60e0: 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
60f0: 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 22  t and right of "
6100: 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
6110: 4e 61 6d 65 28 70 2d 3e 6f 70 29 2c 20 22 20 64  Name(p->op), " d
6120: 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
6130: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
6140: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 30  sult columns", 0
6150: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
6160: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
6170: 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  n 1;.  }.  pPars
6180: 65 2d 3e 6e 54 61 62 20 3d 20 62 61 73 65 3b 0a  e->nTab = base;.
6190: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
61a0: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
61b0: 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 61 6e   scan through an
61c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
61d0: 2e 20 20 46 6f 72 20 65 76 65 72 79 20 72 65 66  .  For every ref
61e0: 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 61 20 63  erence.** to a c
61f0: 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
6200: 75 6d 62 65 72 20 69 46 72 6f 6d 2c 20 63 68 61  umber iFrom, cha
6210: 6e 67 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  nge that referen
6220: 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20 73 61 6d  ce to the.** sam
6230: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  e column in tabl
6240: 65 20 6e 75 6d 62 65 72 20 69 54 6f 2e 0a 2a 2f  e number iTo..*/
6250: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61  .static void cha
6260: 6e 67 65 54 61 62 6c 65 73 28 45 78 70 72 20 2a  ngeTables(Expr *
6270: 70 45 78 70 72 2c 20 69 6e 74 20 69 46 72 6f 6d  pExpr, int iFrom
6280: 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 66  , int iTo){.  if
6290: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
62a0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  urn;.  if( pExpr
62b0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
62c0: 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
62d0: 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 70  ==iFrom ){.    p
62e0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Expr->iTable = i
62f0: 54 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  To;.  }else{.   
6300: 20 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61   static void cha
6310: 6e 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74 28  ngeTablesInList(
6320: 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20  ExprList*, int, 
6330: 69 6e 74 29 3b 0a 20 20 20 20 63 68 61 6e 67 65  int);.    change
6340: 54 61 62 6c 65 73 28 70 45 78 70 72 2d 3e 70 4c  Tables(pExpr->pL
6350: 65 66 74 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 29  eft, iFrom, iTo)
6360: 3b 0a 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c  ;.    changeTabl
6370: 65 73 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  es(pExpr->pRight
6380: 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20  , iFrom, iTo);. 
6390: 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 49     changeTablesI
63a0: 6e 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69  nList(pExpr->pLi
63b0: 73 74 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 29 3b  st, iFrom, iTo);
63c0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
63d0: 69 64 20 63 68 61 6e 67 65 54 61 62 6c 65 73 49  id changeTablesI
63e0: 6e 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  nList(ExprList *
63f0: 70 4c 69 73 74 2c 20 69 6e 74 20 69 46 72 6f 6d  pList, int iFrom
6400: 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 66  , int iTo){.  if
6410: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69  ( pList ){.    i
6420: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
6430: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
6440: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  r; i++){.      c
6450: 68 61 6e 67 65 54 61 62 6c 65 73 28 70 4c 69 73  hangeTables(pLis
6460: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
6470: 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  From, iTo);.    
6480: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  }.  }.}../*.** S
6490: 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
64a0: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
64b0: 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79  .  Replace every
64c0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a   reference to.**
64d0: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
64e0: 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65  le number iTable
64f0: 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
6500: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
6510: 67 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  g.** entry in pE
6520: 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
6530: 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
6540: 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
6550: 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
6560: 20 20 57 68 65 6e 20 6d 61 6b 69 6e 67 20 61 20    When making a 
6570: 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65  copy of an expre
6580: 73 73 69 6f 6e 20 69 6e 20 70 45 4c 69 73 74 2c  ssion in pEList,
6590: 20 63 68 61 6e 67 65 0a 2a 2a 20 72 65 66 65 72   change.** refer
65a0: 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
65b0: 20 69 6e 20 74 61 62 6c 65 20 69 53 75 62 20 69   in table iSub i
65c0: 6e 74 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74  nto references t
65d0: 6f 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2e 0a  o table iTable..
65e0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
65f0: 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ne is part of th
6600: 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f  e flattening pro
6610: 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75  cedure.  A subqu
6620: 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73  ery.** whose res
6630: 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e  ult set is defin
6640: 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70  ed by pEList app
6650: 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e  ears as entry in
6660: 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   the.** FROM cla
6670: 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
6680: 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44  such that the VD
6690: 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e  BE cursor assign
66a0: 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f  ed to that.** FO
66b0: 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  RM clause entry 
66c0: 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73  is iTable.  This
66d0: 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68   routine make th
66e0: 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20  e necessary .** 
66f0: 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72  changes to pExpr
6700: 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65   so that it refe
6710: 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  rs directly to t
6720: 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a  he source table.
6730: 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
6740: 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65  ry rather the re
6750: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
6760: 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
6770: 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
6780: 70 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  pr(Expr *pExpr, 
6790: 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72  int iTable, Expr
67a0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 69 6e  List *pEList, in
67b0: 74 20 69 53 75 62 29 7b 0a 20 20 69 66 28 20 70  t iSub){.  if( p
67c0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
67d0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
67e0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
67f0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
6800: 54 61 62 6c 65 20 26 26 20 70 45 78 70 72 2d 3e  Table && pExpr->
6810: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
6820: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
6830: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
6840: 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43  !=0 && pExpr->iC
6850: 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45  olumn<pEList->nE
6860: 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  xpr );.    asser
6870: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
6880: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
6890: 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  ght==0 && pExpr-
68a0: 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20  >pList==0 );.   
68b0: 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e   pNew = pEList->
68c0: 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
68d0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ].pExpr;.    ass
68e0: 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a  ert( pNew!=0 );.
68f0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
6900: 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 70 45  pNew->op;.    pE
6910: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  xpr->pLeft = sql
6920: 69 74 65 45 78 70 72 44 75 70 28 70 4e 65 77 2d  iteExprDup(pNew-
6930: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78  >pLeft);.    pEx
6940: 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  pr->pRight = sql
6950: 69 74 65 45 78 70 72 44 75 70 28 70 4e 65 77 2d  iteExprDup(pNew-
6960: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70 45  >pRight);.    pE
6970: 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c  xpr->pList = sql
6980: 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70  iteExprListDup(p
6990: 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  New->pList);.   
69a0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
69b0: 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20   pNew->iTable;. 
69c0: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
69d0: 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d  n = pNew->iColum
69e0: 6e 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 41  n;.    pExpr->iA
69f0: 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b  gg = pNew->iAgg;
6a00: 0a 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65  .    pExpr->toke
6a10: 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b  n = pNew->token;
6a20: 0a 20 20 20 20 69 66 28 20 69 53 75 62 21 3d 69  .    if( iSub!=i
6a30: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 63  Table ){.      c
6a40: 68 61 6e 67 65 54 61 62 6c 65 73 28 70 45 78 70  hangeTables(pExp
6a50: 72 2c 20 69 53 75 62 2c 20 69 54 61 62 6c 65 29  r, iSub, iTable)
6a60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
6a70: 0a 20 20 20 20 73 74 61 74 69 63 20 76 6f 69 64  .    static void
6a80: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45   substExprList(E
6a90: 78 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70  xprList*,int,Exp
6aa0: 72 4c 69 73 74 2a 2c 69 6e 74 29 3b 0a 20 20 20  rList*,int);.   
6ab0: 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70 72   substExpr(pExpr
6ac0: 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c  ->pLeft, iTable,
6ad0: 20 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a   pEList, iSub);.
6ae0: 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 45      substExpr(pE
6af0: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61  xpr->pRight, iTa
6b00: 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 69 53 75  ble, pEList, iSu
6b10: 62 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  b);.    substExp
6b20: 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69  rList(pExpr->pLi
6b30: 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
6b40: 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 7d 0a 7d  st, iSub);.  }.}
6b50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 0a 73 75  .static void .su
6b60: 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70 72  bstExprList(Expr
6b70: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74  List *pList, int
6b80: 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73   iTable, ExprLis
6b90: 74 20 2a 70 45 4c 69 73 74 2c 20 69 6e 74 20 69  t *pEList, int i
6ba0: 53 75 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Sub){.  int i;. 
6bb0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
6bc0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
6bd0: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
6be0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62  r; i++){.    sub
6bf0: 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b  stExpr(pList->a[
6c00: 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
6c10: 2c 20 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b  , pEList, iSub);
6c20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
6c30: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
6c40: 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73  pts to flatten s
6c50: 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64  ubqueries in ord
6c60: 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65  er to speed.** e
6c70: 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65  xecution.  It re
6c80: 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61  turns 1 if it ma
6c90: 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20  kes changes and 
6ca0: 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69  0 if no flatteni
6cb0: 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a  ng.** occurs..**
6cc0: 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e  .** To understan
6cd0: 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66  d the concept of
6ce0: 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e   flattening, con
6cf0: 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
6d00: 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a  ing.** query:.**
6d10: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
6d20: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b   FROM (SELECT x+
6d30: 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
6d40: 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52  HERE z<100) WHER
6d50: 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E a>5.**.** The 
6d60: 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69  default way of i
6d70: 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73  mplementing this
6d80: 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65   query is to exe
6d90: 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71  cute the.** subq
6da0: 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73  uery first and s
6db0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
6dc0: 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
6dd0: 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72  table, then.** r
6de0: 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  un the outer que
6df0: 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  ry on that tempo
6e00: 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69  rary table.  Thi
6e10: 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a  s requires two.*
6e20: 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68  * passes over th
6e30: 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72  e data.  Further
6e40: 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68  more, because th
6e50: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
6e60: 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69  e.** has no indi
6e70: 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63  ces, the WHERE c
6e80: 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74  lause on the out
6e90: 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  er query cannot 
6ea0: 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e  be.** optimized.
6eb0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6ec0: 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
6ed0: 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20  rewrite queries 
6ee0: 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76  such as the abov
6ef0: 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  e into.** a sing
6f00: 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20  le flat select, 
6f10: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
6f20: 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20       SELECT x+y 
6f30: 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
6f40: 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35  RE z<100 AND a>5
6f50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
6f60: 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
6f70: 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e  is simpification
6f80: 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20   gives the same 
6f90: 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e  result.** but on
6fa0: 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74  ly has to scan t
6fb0: 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41  he data once.  A
6fc0: 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63  nd because indic
6fd0: 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69  es might .** exi
6fe0: 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  st on the table 
6ff0: 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73  t1, a complete s
7000: 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20  can of the data 
7010: 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69  might be.** avoi
7020: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74  ded..**.** Flatt
7030: 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74  ening is only at
7040: 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f  tempted if all o
7050: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
7060: 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
7070: 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75    (1)  The subqu
7080: 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
7090: 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
70a0: 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74  oth use aggregat
70b0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  es..**.**   (2) 
70c0: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
70d0: 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
70e0: 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  e or the outer q
70f0: 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
7100: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20  in..**.**   (3) 
7110: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
7120: 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
7130: 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75  **   (4)  The su
7140: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
7150: 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75  STINCT or the ou
7160: 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
7170: 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
7180: 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75 65   (5)  The subque
7190: 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
71a0: 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
71b0: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
71c0: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
71d0: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
71e0: 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65   (6)  The subque
71f0: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
7200: 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
7210: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
7220: 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
7230: 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 49  ISTINCT..**.** I
7240: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
7250: 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
7260: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
7270: 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
7280: 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
7290: 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
72a0: 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
72b0: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
72c0: 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
72d0: 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
72e0: 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
72f0: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
7300: 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
7310: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
7320: 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
7330: 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
7340: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
7350: 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
7360: 6e 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  n 0..** If flatt
7370: 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
7380: 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
7390: 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
73a0: 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
73b0: 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
73c0: 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
73d0: 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
73e0: 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
73f0: 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
7400: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
7410: 0a 2a 2f 0a 69 6e 74 20 66 6c 61 74 74 65 6e 53  .*/.int flattenS
7420: 75 62 71 75 65 72 79 28 53 65 6c 65 63 74 20 2a  ubquery(Select *
7430: 70 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  p, int iFrom, in
7440: 74 20 69 73 41 67 67 2c 20 69 6e 74 20 73 75 62  t isAgg, int sub
7450: 71 75 65 72 79 49 73 41 67 67 29 7b 0a 20 20 53  queryIsAgg){.  S
7460: 65 6c 65 63 74 20 2a 70 53 75 62 3b 0a 20 20 49  elect *pSub;.  I
7470: 64 4c 69 73 74 20 2a 70 53 72 63 2c 20 2a 70 53  dList *pSrc, *pS
7480: 75 62 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73  ubSrc;.  ExprLis
7490: 74 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  t *pList;.  int 
74a0: 69 3b 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74  i;.  int iParent
74b0: 2c 20 69 53 75 62 3b 0a 20 20 45 78 70 72 20 2a  , iSub;.  Expr *
74c0: 70 57 68 65 72 65 3b 0a 0a 20 20 2f 2a 20 43 68  pWhere;..  /* Ch
74d0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c  eck to see if fl
74e0: 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
74f0: 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30  itted.  Return 0
7500: 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20   if not..  */.  
7510: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
7520: 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
7530: 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
7540: 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d   pSrc && iFrom>=
7550: 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d  0 && iFrom<pSrc-
7560: 3e 6e 49 64 20 29 3b 0a 20 20 70 53 75 62 20 3d  >nId );.  pSub =
7570: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
7580: 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72  pSelect;.  asser
7590: 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20  t( pSub!=0 );.  
75a0: 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62  if( isAgg && sub
75b0: 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74  queryIsAgg ) ret
75c0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 75 62  urn 0;.  if( sub
75d0: 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53  queryIsAgg && pS
75e0: 72 63 2d 3e 6e 49 64 3e 31 20 29 20 72 65 74 75  rc->nId>1 ) retu
75f0: 72 6e 20 30 3b 0a 20 20 70 53 75 62 53 72 63 20  rn 0;.  pSubSrc 
7600: 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20  = pSub->pSrc;.  
7610: 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20  assert( pSubSrc 
7620: 29 3b 0a 20 20 69 66 28 20 70 53 75 62 53 72 63  );.  if( pSubSrc
7630: 2d 3e 6e 49 64 3e 31 20 29 20 72 65 74 75 72 6e  ->nId>1 ) return
7640: 20 30 3b 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   0;.  if( pSub->
7650: 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 70 53  isDistinct && pS
7660: 72 63 2d 3e 6e 49 64 3e 31 20 29 20 72 65 74 75  rc->nId>1 ) retu
7670: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 75 62  rn 0;.  if( pSub
7680: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20  ->isDistinct && 
7690: 69 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  isAgg ) return 0
76a0: 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73  ;.  if( p->isDis
76b0: 74 69 6e 63 74 20 26 26 20 73 75 62 71 75 65 72  tinct && subquer
76c0: 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  yIsAgg ) return 
76d0: 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72  0;..  /* If we r
76e0: 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
76f0: 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 69   it means flatti
7700: 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 20  ng is permitted 
7710: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 2d 74  for the.  ** i-t
7720: 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  h entry of the F
7730: 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68  ROM clause in th
7740: 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
7750: 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d 20   */.  iParent = 
7760: 70 2d 3e 62 61 73 65 20 2b 20 69 46 72 6f 6d 3b  p->base + iFrom;
7770: 0a 20 20 69 53 75 62 20 3d 20 70 53 75 62 2d 3e  .  iSub = pSub->
7780: 62 61 73 65 3b 0a 20 20 73 75 62 73 74 45 78 70  base;.  substExp
7790: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
77a0: 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
77b0: 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20  pEList, iSub);. 
77c0: 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69   pList = p->pELi
77d0: 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
77e0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
77f0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69  ++){.    if( pLi
7800: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
7810: 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
7820: 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  *pExpr = pList->
7830: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
7840: 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e    pList->a[i].zN
7850: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ame = sqliteStrN
7860: 44 75 70 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e  Dup(pExpr->span.
7870: 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e  z, pExpr->span.n
7880: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
7890: 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
78a0: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
78b0: 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65  >pGroupBy, iPare
78c0: 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
78d0: 2c 20 69 53 75 62 29 3b 0a 20 20 20 20 73 75 62  , iSub);.    sub
78e0: 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  stExpr(p->pHavin
78f0: 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
7900: 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b  ->pEList, iSub);
7910: 0a 20 20 7d 0a 20 20 73 75 62 73 74 45 78 70 72  .  }.  substExpr
7920: 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
7930: 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
7940: 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a  >pEList, iSub);.
7950: 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
7960: 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65  re ){.    pWhere
7970: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70   = sqliteExprDup
7980: 28 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a  (pSub->pWhere);.
7990: 20 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 21      if( iParent!
79a0: 3d 69 53 75 62 20 29 7b 0a 20 20 20 20 20 20 63  =iSub ){.      c
79b0: 68 61 6e 67 65 54 61 62 6c 65 73 28 70 57 68 65  hangeTables(pWhe
79c0: 72 65 2c 20 69 53 75 62 2c 20 69 50 61 72 65 6e  re, iSub, iParen
79d0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  t);.    }.  }els
79e0: 65 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  e{.    pWhere = 
79f0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62  0;.  }.  if( sub
7a00: 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
7a10: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
7a20: 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ving==0 );.    p
7a30: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70  ->pHaving = p->p
7a40: 57 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57  Where;.    p->pW
7a50: 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
7a60: 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e     substExpr(p->
7a70: 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
7a80: 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20  , pSub->pEList, 
7a90: 69 53 75 62 29 3b 0a 20 20 20 20 69 66 28 20 70  iSub);.    if( p
7aa0: 53 75 62 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a  Sub->pHaving ){.
7ab0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 48 61 76        Expr *pHav
7ac0: 69 6e 67 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ing = sqliteExpr
7ad0: 44 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e  Dup(pSub->pHavin
7ae0: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50  g);.      if( iP
7af0: 61 72 65 6e 74 21 3d 69 53 75 62 20 29 7b 0a 20  arent!=iSub ){. 
7b00: 20 20 20 20 20 20 20 63 68 61 6e 67 65 54 61 62         changeTab
7b10: 6c 65 73 28 70 48 61 76 69 6e 67 2c 20 69 53 75  les(pHaving, iSu
7b20: 62 2c 20 69 50 61 72 65 6e 74 29 3b 0a 20 20 20  b, iParent);.   
7b30: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
7b40: 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ->pHaving ){.   
7b50: 20 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20       p->pHaving 
7b60: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
7b70: 41 4e 44 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  AND, p->pHaving,
7b80: 20 70 48 61 76 69 6e 67 2c 20 30 29 3b 0a 20 20   pHaving, 0);.  
7b90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7ba0: 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
7bb0: 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 20 20 7d  pHaving;.      }
7bc0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
7bd0: 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  t( p->pGroupBy==
7be0: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f  0 );.    p->pGro
7bf0: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 45 78 70  upBy = sqliteExp
7c00: 72 4c 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70  rListDup(pSub->p
7c10: 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 69 66  GroupBy);.    if
7c20: 28 20 69 50 61 72 65 6e 74 21 3d 69 53 75 62 20  ( iParent!=iSub 
7c30: 29 7b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 54  ){.      changeT
7c40: 61 62 6c 65 73 49 6e 4c 69 73 74 28 70 2d 3e 70  ablesInList(p->p
7c50: 47 72 6f 75 70 42 79 2c 20 69 53 75 62 2c 20 69  GroupBy, iSub, i
7c60: 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  Parent);.    }. 
7c70: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 57   }else if( p->pW
7c80: 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  here==0 ){.    p
7c90: 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
7ca0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
7cb0: 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68  substExpr(p->pWh
7cc0: 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ere, iParent, pS
7cd0: 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62  ub->pEList, iSub
7ce0: 29 3b 0a 20 20 20 20 69 66 28 20 70 57 68 65 72  );.    if( pWher
7cf0: 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 57  e ){.      p->pW
7d00: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70  here = sqliteExp
7d10: 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68  r(TK_AND, p->pWh
7d20: 65 72 65 2c 20 70 57 68 65 72 65 2c 20 30 29 3b  ere, pWhere, 0);
7d30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
7d40: 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
7d50: 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53  isDistinct || pS
7d60: 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a  ub->isDistinct;.
7d70: 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 46    if( pSrc->a[iF
7d80: 72 6f 6d 5d 2e 70 54 61 62 20 26 26 20 70 53 72  rom].pTab && pSr
7d90: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62  c->a[iFrom].pTab
7da0: 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b  ->isTransient ){
7db0: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74  .    sqliteDelet
7dc0: 65 54 61 62 6c 65 28 30 2c 20 70 53 72 63 2d 3e  eTable(0, pSrc->
7dd0: 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 29 3b 0a  a[iFrom].pTab);.
7de0: 20 20 7d 0a 20 20 70 53 72 63 2d 3e 61 5b 69 46    }.  pSrc->a[iF
7df0: 72 6f 6d 5d 2e 70 54 61 62 20 3d 20 70 53 75 62  rom].pTab = pSub
7e00: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
7e10: 20 20 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e    pSubSrc->a[0].
7e20: 70 54 61 62 20 3d 20 30 3b 0a 20 20 70 53 72 63  pTab = 0;.  pSrc
7e30: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53 65 6c 65  ->a[iFrom].pSele
7e40: 63 74 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  ct = pSubSrc->a[
7e50: 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 70 53  0].pSelect;.  pS
7e60: 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  ubSrc->a[0].pSel
7e70: 65 63 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ect = 0;.  sqlit
7e80: 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  eSelectDelete(pS
7e90: 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  ub);.  return 1;
7ea0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
7eb0: 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
7ec0: 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e  tement passed in
7ed0: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
7ee0: 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20  to see if it.** 
7ef0: 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28  is a simple min(
7f00: 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
7f10: 2e 20 20 49 66 20 69 74 20 69 73 20 61 6e 64 20  .  If it is and 
7f20: 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62  this query can b
7f30: 65 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75  e.** satisfied u
7f40: 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65  sing a single se
7f50: 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ek to the beginn
7f60: 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e  ing or end of an
7f70: 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20   index,.** then 
7f80: 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
7f90: 65 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  e for this SELEC
7fa0: 54 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20  T return 1.  If 
7fb0: 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a  this is not a .*
7fc0: 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f  * simple min() o
7fd0: 72 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20 74  r max() query, t
7fe0: 68 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a  hen return 0;.**
7ff0: 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e  .** A simply min
8000: 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
8010: 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69  y looks like thi
8020: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  s:.**.**    SELE
8030: 43 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74  CT min(a) FROM t
8040: 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45  able;.**    SELE
8050: 43 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74  CT max(a) FROM t
8060: 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able;.**.** The 
8070: 71 75 65 72 79 20 6d 61 79 20 68 61 76 65 20 6f  query may have o
8080: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
8090: 6c 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 61  le in its FROM a
80a0: 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a  rgument.  There.
80b0: 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f  ** can be no GRO
80c0: 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20  UP BY or HAVING 
80d0: 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  or WHERE clauses
80e0: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  .  The result se
80f0: 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65  t must.** be the
8100: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
8110: 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  of a single colu
8120: 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  mn of the table.
8130: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20    The column.** 
8140: 69 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  in the min() or 
8150: 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  max() function m
8160: 75 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e 0a  ust be indexed..
8170: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65  **.** The parame
8180: 74 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f 75  ters to this rou
8190: 74 69 6e 65 20 61 72 65 20 74 68 65 20 73 61 6d  tine are the sam
81a0: 65 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65 53  e as for sqliteS
81b0: 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20  elect()..** See 
81c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
81d0: 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69  nt on that routi
81e0: 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
81f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
8200: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d  /.static int sim
8210: 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50  pleMinMaxQuery(P
8220: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
8230: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65  lect *p, int eDe
8240: 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a  st, int iParm){.
8250: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
8260: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62   int iCol;.  Tab
8270: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
8280: 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62  x *pIdx;.  int b
8290: 61 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ase;.  Vdbe *v;.
82a0: 20 20 69 6e 74 20 6f 70 65 6e 4f 70 3b 0a 20 20    int openOp;.  
82b0: 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20 69 6e  int seekOp;.  in
82c0: 74 20 63 6f 6e 74 3b 0a 20 20 45 78 70 72 4c 69  t cont;.  ExprLi
82d0: 73 74 20 65 4c 69 73 74 3b 0a 20 20 73 74 72 75  st eList;.  stru
82e0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
82f0: 20 65 4c 69 73 74 49 74 65 6d 3b 0a 0a 20 20 2f   eListItem;..  /
8300: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
8310: 66 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  f this query is 
8320: 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f  a simple min() o
8330: 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20  r max() query.  
8340: 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f  Return.  ** zero
8350: 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a   if it is  not..
8360: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47    */.  if( p->pG
8370: 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61  roupBy || p->pHa
8380: 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72  ving || p->pWher
8390: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  e ) return 0;.  
83a0: 69 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 49 64  if( p->pSrc->nId
83b0: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
83c0: 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
83d0: 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
83e0: 72 6e 20 30 3b 0a 20 20 70 45 78 70 72 20 3d 20  rn 0;.  pExpr = 
83f0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
8400: 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
8410: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
8420: 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
8430: 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
8440: 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 78  >pList==0 || pEx
8450: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
8460: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
8470: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
8480: 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e  en.n!=3 ) return
8490: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
84a0: 53 74 72 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e  StrNICmp(pExpr->
84b0: 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29  token.z,"min",3)
84c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f  ==0 ){.    seekO
84d0: 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20  p = OP_Rewind;. 
84e0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
84f0: 65 53 74 72 4e 49 43 6d 70 28 70 45 78 70 72 2d  eStrNICmp(pExpr-
8500: 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33  >token.z,"max",3
8510: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b  )==0 ){.    seek
8520: 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20  Op = OP_Last;.  
8530: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
8540: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72  n 0;.  }.  pExpr
8550: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
8560: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
8570: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
8580: 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
8590: 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78   0;.  iCol = pEx
85a0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70  pr->iColumn;.  p
85b0: 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
85c0: 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20  [0].pTab;..  /* 
85d0: 49 66 20 77 65 20 67 65 74 20 74 6f 20 68 65 72  If we get to her
85e0: 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  e, it means the 
85f0: 71 75 65 72 79 20 69 73 20 6f 66 20 74 68 65 20  query is of the 
8600: 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20  correct form..  
8610: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ** Check to make
8620: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61 6e   sure we have an
8630: 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65 20   index and make 
8640: 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20 74 68  pIdx point to th
8650: 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61  e.  ** appropria
8660: 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68  te index.  If th
8670: 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
8680: 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45   is on an INTEGE
8690: 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b  R PRIMARY.  ** k
86a0: 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e  ey column, no in
86b0: 64 65 78 20 69 73 20 6e 65 63 65 73 73 61 72 79  dex is necessary
86c0: 20 73 6f 20 73 65 74 20 70 49 64 78 20 74 6f 20   so set pIdx to 
86d0: 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a  NULL.  If no.  *
86e0: 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78 20 69  * usable index i
86f0: 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  s found, return 
8700: 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 43  0..  */.  if( iC
8710: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49 64 78  ol<0 ){.    pIdx
8720: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8730: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
8740: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
8750: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
8760: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
8770: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
8780: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
8790: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
87a0: 3d 3d 69 43 6f 6c 20 29 20 62 72 65 61 6b 3b 0a  ==iCol ) break;.
87b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
87c0: 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  dx==0 ) return 0
87d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e  ;.  }..  /* Iden
87e0: 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
87f0: 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20  s if we will be 
8800: 75 73 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61  using the callba
8810: 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73  ck.  This.  ** s
8820: 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69  tep is skipped i
8830: 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
8840: 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65  going to a table
8850: 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   or a memory cel
8860: 6c 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  l..  */.  v = sq
8870: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
8880: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
8890: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
88a0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
88b0: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e  lback ){.    gen
88c0: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
88d0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65  (pParse, p->base
88e0: 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45  , p->pSrc, p->pE
88f0: 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
8900: 20 47 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   Generating code
8910: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e   to find the min
8920: 20 6f 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61   or the max.  Ba
8930: 73 69 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68  sically all we h
8940: 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69  ave.  ** to do i
8950: 73 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  s find the first
8960: 20 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74   or the last ent
8970: 72 79 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e  ry in the chosen
8980: 20 69 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a   index.  If.  **
8990: 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
89a0: 78 28 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e  x() is on the IN
89b0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
89c0: 59 2c 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65  Y, then find the
89d0: 20 66 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c   first.  ** or l
89e0: 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
89f0: 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a   main table..  *
8a00: 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  /.  if( !pParse-
8a10: 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65 64 20  >schemaVerified 
8a20: 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  && (pParse->db->
8a30: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
8a40: 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20  nTrans)==0 ){.  
8a50: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8a60: 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f  p(v, OP_VerifyCo
8a70: 6f 6b 69 65 2c 20 70 50 61 72 73 65 2d 3e 64 62  okie, pParse->db
8a80: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c  ->schema_cookie,
8a90: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
8aa0: 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65 64 20  >schemaVerified 
8ab0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 6f 70 65 6e 4f  = 1;.  }.  openO
8ac0: 70 20 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d 70  p = pTab->isTemp
8ad0: 20 3f 20 4f 50 5f 4f 70 65 6e 41 75 78 20 3a 20   ? OP_OpenAux : 
8ae0: 4f 50 5f 4f 70 65 6e 3b 0a 20 20 62 61 73 65 20  OP_Open;.  base 
8af0: 3d 20 70 2d 3e 62 61 73 65 3b 0a 20 20 73 71 6c  = p->base;.  sql
8b00: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8b10: 6f 70 65 6e 4f 70 2c 20 62 61 73 65 2c 20 70 54  openOp, base, pT
8b20: 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 73 71 6c  ab->tnum);.  sql
8b30: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
8b40: 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  v, -1, pTab->zNa
8b50: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
8b60: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b    if( pIdx==0 ){
8b70: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
8b80: 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20  ddOp(v, seekOp, 
8b90: 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  base, 0);.  }els
8ba0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  e{.    sqliteVdb
8bb0: 65 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70  eAddOp(v, openOp
8bc0: 2c 20 62 61 73 65 2b 31 2c 20 70 49 64 78 2d 3e  , base+1, pIdx->
8bd0: 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  tnum);.    sqlit
8be0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
8bf0: 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65   -1, pIdx->zName
8c00: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
8c10: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8c20: 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73  p(v, seekOp, bas
8c30: 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  e+1, 0);.    sql
8c40: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8c50: 4f 50 5f 49 64 78 52 65 63 6e 6f 2c 20 62 61 73  OP_IdxRecno, bas
8c60: 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  e+1, 0);.    sql
8c70: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8c80: 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2b 31  OP_Close, base+1
8c90: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
8ca0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8cb0: 4d 6f 76 65 54 6f 2c 20 62 61 73 65 2c 20 30 29  MoveTo, base, 0)
8cc0: 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45  ;.  }.  eList.nE
8cd0: 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65  xpr = 1;.  memse
8ce0: 74 28 26 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c  t(&eListItem, 0,
8cf0: 20 73 69 7a 65 6f 66 28 65 4c 69 73 74 49 74 65   sizeof(eListIte
8d00: 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d  m));.  eList.a =
8d10: 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65   &eListItem;.  e
8d20: 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20  List.a[0].pExpr 
8d30: 3d 20 70 45 78 70 72 3b 0a 20 20 63 6f 6e 74 20  = pExpr;.  cont 
8d40: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
8d50: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73 65 6c 65  Label(v);.  sele
8d60: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
8d70: 73 65 2c 20 26 65 4c 69 73 74 2c 20 62 61 73 65  se, &eList, base
8d80: 2c 20 31 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73  , 1, 0, -1, eDes
8d90: 74 2c 20 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20  t, iParm, cont, 
8da0: 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 56  cont);.  sqliteV
8db0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
8dc0: 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69  v, cont);.  sqli
8dd0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8de0: 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30  P_Close, base, 0
8df0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
8e00: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
8e10: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69   code for the gi
8e20: 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65  ven SELECT state
8e30: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
8e40: 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74  results are dist
8e50: 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f  ributed in vario
8e60: 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e  us ways dependin
8e70: 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75  g on the.** valu
8e80: 65 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 69  e of eDest and i
8e90: 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
8ea0: 65 44 65 73 74 20 56 61 6c 75 65 20 20 20 20 20  eDest Value     
8eb0: 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20    Result.**     
8ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
8ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
8f00: 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20     SRT_Callback 
8f10: 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61     Invoke the ca
8f20: 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20  llback for each 
8f30: 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
8f40: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  t..**.**     SRT
8f50: 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f  _Mem         Sto
8f60: 72 65 20 66 69 72 73 74 20 72 65 73 75 6c 74 20  re first result 
8f70: 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  in memory cell i
8f80: 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
8f90: 52 54 5f 53 65 74 20 20 20 20 20 20 20 20 20 53  RT_Set         S
8fa0: 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20  tore results as 
8fb0: 6b 65 79 73 20 6f 66 20 61 20 74 61 62 6c 65 20  keys of a table 
8fc0: 77 69 74 68 20 63 75 72 73 6f 72 20 69 50 61 72  with cursor iPar
8fd0: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
8fe0: 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72  Union       Stor
8ff0: 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b  e results as a k
9000: 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ey in a temporar
9010: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a  y table iParm.**
9020: 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65  .**     SRT_Exce
9030: 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72  pt      Remove r
9040: 65 73 75 6c 74 73 20 66 6f 72 6d 20 74 68 65 20  esults form the 
9050: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
9060: 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
9070: 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20   SRT_Table      
9080: 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
9090: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
90a0: 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68  e iParm.**.** Th
90b0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
90c0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
90d0: 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
90e0: 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
90f0: 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
9100: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
9110: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
9120: 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
9130: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
9140: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9150: 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
9160: 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
9170: 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
9180: 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
9190: 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
91a0: 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54  do that..**.** T
91b0: 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65  he pParent, pare
91c0: 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72  ntTab, and *pPar
91d0: 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61 72  entAgg fields ar
91e0: 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74  e filled in if t
91f0: 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73  his.** SELECT is
9200: 20 61 20 73 75 62 71 75 65 72 79 2e 20 20 54 68   a subquery.  Th
9210: 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74  is routine may t
9220: 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  ry to combine th
9230: 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74  is SELECT.** wit
9240: 68 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20  h its parent to 
9250: 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c  form a single fl
9260: 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f  at query.  In so
9270: 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74   doing, it might
9280: 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70  .** change the p
9290: 61 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d  arent query from
92a0: 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65   a non-aggregate
92b0: 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65   to an aggregate
92c0: 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74   query..** For t
92d0: 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  hat reason, the 
92e0: 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20  pParentAgg flag 
92f0: 69 73 20 70 61 73 73 65 64 20 61 73 20 61 20 70  is passed as a p
9300: 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a  ointer, so it.**
9310: 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e   can be changed.
9320: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 53 65  .*/.int sqliteSe
9330: 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
9340: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
9350: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
9360: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
9370: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
9380: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
9390: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
93a0: 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65  oded. */.  int e
93b0: 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Dest,           
93c0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 3a 20 53 52 54    /* One of: SRT
93d0: 5f 43 61 6c 6c 62 61 63 6b 20 4d 65 6d 20 53 65  _Callback Mem Se
93e0: 74 20 55 6e 69 6f 6e 20 45 78 63 65 70 74 20 2a  t Union Except *
93f0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20  /.  int iParm,  
9400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61             /* Sa
9410: 76 65 20 72 65 73 75 6c 74 20 69 6e 20 74 68 69  ve result in thi
9420: 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
9430: 6e 2c 20 69 66 20 3e 3d 30 20 2a 2f 0a 20 20 53  n, if >=0 */.  S
9440: 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20  elect *pParent, 
9450: 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
9460: 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63   SELECT for whic
9470: 68 20 74 68 69 73 20 69 73 20 61 20 73 75 62 2d  h this is a sub-
9480: 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70  query */.  int p
9490: 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20  arentTab,       
94a0: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50    /* Index in pP
94b0: 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74  arent->pSrc of t
94c0: 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  his query */.  i
94d0: 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67 20 20  nt *pParentAgg  
94e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
94f0: 20 70 50 61 72 65 6e 74 20 75 73 65 73 20 61 67   pParent uses ag
9500: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
9510: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
9520: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
9530: 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b  Info;.  Vdbe *v;
9540: 0a 20 20 69 6e 74 20 69 73 41 67 67 20 3d 20 30  .  int isAgg = 0
9550: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
9560: 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73  e for select lis
9570: 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a  ts like "count(*
9580: 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  )" */.  ExprList
9590: 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f   *pEList;      /
95a0: 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
95b0: 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f  s to extract. */
95c0: 0a 20 20 49 64 4c 69 73 74 20 2a 70 54 61 62 4c  .  IdList *pTabL
95d0: 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist;      /* Lis
95e0: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  t of tables to s
95f0: 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  elect from */.  
9600: 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
9610: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
9620: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
9630: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
9640: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
9650: 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  ;    /* The ORDE
9660: 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  R BY clause.  Ma
9670: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
9680: 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
9690: 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
96a0: 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
96b0: 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
96c0: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
96d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
96e0: 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
96f0: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
9700: 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20  nt isDistinct;  
9710: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
9720: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
9730: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
9740: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
9750: 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ct;          /* 
9760: 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72  Table to use for
9770: 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
9780: 74 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 3b  t */.  int base;
9790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
97a0: 20 46 69 72 73 74 20 63 75 72 73 6f 72 20 61 76   First cursor av
97b0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
97c0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
97e0: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
97f0: 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
9800: 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69  n */..  if( sqli
9810: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
9820: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
9830: 20 7c 7c 20 70 3d 3d 30 20 29 20 72 65 74 75 72   || p==0 ) retur
9840: 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  n 1;..  /* If th
9850: 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71  ere is are a seq
9860: 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73  uence of queries
9870: 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72  , do the earlier
9880: 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a   ones first..  *
9890: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
98a0: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
98b0: 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72  multiSelect(pPar
98c0: 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50  se, p, eDest, iP
98d0: 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  arm);.  }..  /* 
98e0: 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65  Make local copie
98f0: 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  s of the paramet
9900: 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75 65  ers for this que
9910: 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c  ry..  */.  pTabL
9920: 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
9930: 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
9940: 65 72 65 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  ere;.  pOrderBy 
9950: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
9960: 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
9970: 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69  GroupBy;.  pHavi
9980: 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
9990: 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20  .  isDistinct = 
99a0: 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a  p->isDistinct;..
99b0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
99c0: 62 6c 6f 63 6b 20 6f 66 20 56 44 42 45 20 63 75  block of VDBE cu
99d0: 72 73 6f 72 73 2c 20 6f 6e 65 20 66 6f 72 20 65  rsors, one for e
99e0: 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ach table in the
99f0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20   FROM clause..  
9a00: 2a 2a 20 54 68 65 20 57 48 45 52 45 20 70 72 6f  ** The WHERE pro
9a10: 63 65 73 73 69 6e 67 20 72 65 71 75 69 72 65 73  cessing requires
9a20: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
9a30: 73 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 73  s for the tables
9a40: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 46 52 4f   in the.  ** FRO
9a50: 4d 20 63 6c 61 75 73 65 20 62 65 20 63 6f 6e 73  M clause be cons
9a60: 65 63 75 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20  ecutive..  */.  
9a70: 62 61 73 65 20 3d 20 70 2d 3e 62 61 73 65 20 3d  base = p->base =
9a80: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
9a90: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d   pParse->nTab +=
9aa0: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 0a   pTabList->nId;.
9ab0: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e  .  /* .  ** Do n
9ac0: 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20  ot even attempt 
9ad0: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20  to generate any 
9ae0: 63 6f 64 65 20 69 66 20 77 65 20 68 61 76 65 20  code if we have 
9af0: 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a  already seen.  *
9b00: 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20  * errors before 
9b10: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61  this routine sta
9b20: 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rts..  */.  if( 
9b30: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
9b40: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
9b50: 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
9b60: 65 76 65 72 79 20 74 61 62 6c 65 20 69 6e 20 74  every table in t
9b70: 68 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e  he table list an
9b80: 64 20 63 72 65 61 74 65 20 61 6e 20 61 70 70 72  d create an appr
9b90: 6f 70 72 69 61 74 65 0a 20 20 2a 2a 20 63 6f 6c  opriate.  ** col
9ba0: 75 6d 6e 6c 69 73 74 20 69 6e 20 70 45 4c 69 73  umnlist in pELis
9bb0: 74 20 69 66 20 74 68 65 72 65 20 69 73 6e 27 74  t if there isn't
9bc0: 20 6f 6e 65 20 61 6c 72 65 61 64 79 2e 20 20 28   one already.  (
9bd0: 54 68 65 20 70 61 72 73 65 72 20 6c 65 61 76 65  The parser leave
9be0: 73 0a 20 20 2a 2a 20 61 20 4e 55 4c 4c 20 69 6e  s.  ** a NULL in
9bf0: 20 74 68 65 20 70 2d 3e 70 45 4c 69 73 74 20 69   the p->pEList i
9c00: 66 20 74 68 65 20 53 51 4c 20 73 61 69 64 20 22  f the SQL said "
9c10: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 2e 2e  SELECT * FROM ..
9c20: 2e 22 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66  .").  */.  if( f
9c30: 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28  illInColumnList(
9c40: 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
9c50: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
9c60: 64 3b 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20  d;.  }.  pEList 
9c70: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
9c80: 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67  f( pEList==0 ) g
9c90: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
9ca0: 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
9cb0: 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
9cc0: 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
9cd0: 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
9ce0: 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
9cf0: 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69  output..  */.  i
9d00: 66 28 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d  f( (eDest==SRT_M
9d10: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
9d20: 5f 53 65 74 29 20 26 26 20 70 45 4c 69 73 74 2d  _Set) && pEList-
9d30: 3e 6e 45 78 70 72 3e 31 20 29 7b 0a 20 20 20 20  >nExpr>1 ){.    
9d40: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
9d50: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
9d60: 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  , "only a single
9d70: 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20   result allowed 
9d80: 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20  for ".       "a 
9d90: 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70  SELECT that is p
9da0: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
9db0: 73 69 6f 6e 22 2c 20 30 29 3b 0a 20 20 20 20 70  sion", 0);.    p
9dc0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
9dd0: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
9de0: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 52  nd;.  }..  /* OR
9df0: 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65  DER BY is ignore
9e00: 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  d if we are not 
9e10: 73 65 6e 64 69 6e 67 20 74 68 65 20 72 65 73 75  sending the resu
9e20: 6c 74 20 74 6f 20 61 20 63 61 6c 6c 62 61 63 6b  lt to a callback
9e30: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
9e40: 73 74 21 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st!=SRT_Callback
9e50: 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79   ){.    pOrderBy
9e60: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
9e70: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77  At this point, w
9e80: 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  e should have al
9e90: 6c 6f 63 61 74 65 64 20 61 6c 6c 20 74 68 65 20  located all the 
9ea0: 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 0a  cursors that we.
9eb0: 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 68 61 6e    ** need to han
9ec0: 64 6c 65 20 73 75 62 71 75 65 72 79 73 20 61 6e  dle subquerys an
9ed0: 64 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  d temporary tabl
9ee0: 65 73 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  es.  .  **.  ** 
9ef0: 52 65 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75  Resolve the colu
9f00: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 64 6f 20  mn names and do 
9f10: 61 20 73 65 6d 61 6e 74 69 63 73 20 63 68 65 63  a semantics chec
9f20: 6b 20 6f 6e 20 61 6c 6c 20 74 68 65 20 65 78 70  k on all the exp
9f30: 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
9f40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
9f50: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
9f60: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
9f70: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
9f80: 61 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62  arse, base, pTab
9f90: 4c 69 73 74 2c 20 30 2c 20 70 45 4c 69 73 74 2d  List, 0, pEList-
9fa0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
9fb0: 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
9fc0: 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
9fd0: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43   if( sqliteExprC
9fe0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 4c  heck(pParse, pEL
9ff0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
a000: 20 31 2c 20 26 69 73 41 67 67 29 20 29 7b 0a 20   1, &isAgg) ){. 
a010: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
a020: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _end;.    }.  }.
a030: 20 20 69 66 28 20 70 57 68 65 72 65 20 29 7b 0a    if( pWhere ){.
a040: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
a050: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
a060: 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c  rse, base, pTabL
a070: 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 57 68  ist, pEList, pWh
a080: 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ere) ){.      go
a090: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
a0a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
a0b0: 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61  iteExprCheck(pPa
a0c0: 72 73 65 2c 20 70 57 68 65 72 65 2c 20 30 2c 20  rse, pWhere, 0, 
a0d0: 30 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  0) ){.      goto
a0e0: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
a0f0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 72   }.  }.  if( pOr
a100: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 66 6f 72  derBy ){.    for
a110: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
a120: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
a130: 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
a140: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
a150: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
a160: 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73  sqliteExprIsCons
a170: 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20  tant(pE) ){.    
a180: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
a190: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
a1a0: 72 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20  rMsg, .         
a1b0: 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 65 78      "ORDER BY ex
a1c0: 70 72 65 73 73 69 6f 6e 73 20 73 68 6f 75 6c 64  pressions should
a1d0: 20 6e 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e 74   not be constant
a1e0: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ", 0);.        p
a1f0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
a200: 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
a210: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
a220: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
a230: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
a240: 50 61 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61  Parse, base, pTa
a250: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70  bList, pEList, p
a260: 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  E) ){.        go
a270: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
a280: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a290: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
a2a0: 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73 41  (pParse, pE, isA
a2b0: 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  gg, 0) ){.      
a2c0: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
a2d0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
a2e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 47 72 6f 75  .  }.  if( pGrou
a2f0: 70 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  pBy ){.    for(i
a300: 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; i<pGroupBy->
a310: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
a320: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 47     Expr *pE = pG
a330: 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
a340: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  pr;.      if( sq
a350: 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61  liteExprIsConsta
a360: 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20  nt(pE) ){.      
a370: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
a380: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
a390: 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sg, .           
a3a0: 20 20 22 47 52 4f 55 50 20 42 59 20 65 78 70 72    "GROUP BY expr
a3b0: 65 73 73 69 6f 6e 73 20 73 68 6f 75 6c 64 20 6e  essions should n
a3c0: 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 22 2c  ot be constant",
a3d0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
a3e0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
a3f0: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
a400: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
a410: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
a420: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
a430: 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c  rse, base, pTabL
a440: 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 29  ist, pEList, pE)
a450: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
a460: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
a470: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
a480: 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70  qliteExprCheck(p
a490: 50 61 72 73 65 2c 20 70 45 2c 20 69 73 41 67 67  Parse, pE, isAgg
a4a0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
a4b0: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
a4c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a4d0: 20 7d 0a 20 20 69 66 28 20 70 48 61 76 69 6e 67   }.  if( pHaving
a4e0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 47 72 6f   ){.    if( pGro
a4f0: 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  upBy==0 ){.     
a500: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
a510: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
a520: 67 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63  g, "a GROUP BY c
a530: 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65  lause is require
a540: 64 20 22 0a 20 20 20 20 20 20 20 20 20 22 62 65  d ".         "be
a550: 66 6f 72 65 20 48 41 56 49 4e 47 22 2c 20 30 29  fore HAVING", 0)
a560: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
a570: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f  nErr++;.      go
a580: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
a590: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
a5a0: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
a5b0: 73 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20  s(pParse, base, 
a5c0: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
a5d0: 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  , pHaving) ){.  
a5e0: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
a5f0: 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
a600: 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
a610: 63 6b 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  ck(pParse, pHavi
a620: 6e 67 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b  ng, isAgg, 0) ){
a630: 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
a640: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
a650: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
a660: 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  r the special ca
a670: 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72  se of a min() or
a680: 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20   max() function 
a690: 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  by itself.  ** i
a6a0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
a6b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d  ..  */.  if( sim
a6c0: 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70  pleMinMaxQuery(p
a6d0: 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
a6e0: 20 69 50 61 72 6d 29 20 29 7b 0a 20 20 20 20 72   iParm) ){.    r
a6f0: 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 0;.    goto 
a700: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
a710: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
a720: 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
a730: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  /.  v = sqliteGe
a740: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
a750: 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
a760: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
a770: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
a780: 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
a790: 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
a7a0: 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 66   clause.  */.  f
a7b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
a7c0: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
a7d0: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
a7e0: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30  >a[i].pSelect==0
a7f0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
a800: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
a810: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e  arse, pTabList->
a820: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53 52  a[i].pSelect, SR
a830: 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20 62 61 73  T_TempTable, bas
a840: 65 2b 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20  e+i,.           
a850: 20 20 20 20 20 20 70 2c 20 69 2c 20 26 69 73 41        p, i, &isA
a860: 67 67 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  gg);.    pTabLis
a870: 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
a880: 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
a890: 65 72 65 3b 0a 20 20 20 20 69 66 28 20 65 44 65  ere;.    if( eDe
a8a0: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
a8b0: 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72   ){.      pOrder
a8c0: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
a8d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f  ;.    }.    pGro
a8e0: 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
a8f0: 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20  By;.    pHaving 
a900: 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
a910: 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70    isDistinct = p
a920: 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
a930: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
a940: 20 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20   see if this is 
a950: 61 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20  a subquery that 
a960: 63 61 6e 20 62 65 20 22 66 6c 61 74 74 65 6e 65  can be "flattene
a970: 64 22 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65  d" into its pare
a980: 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74  nt..  ** If flat
a990: 74 65 6e 69 6e 67 20 69 73 20 61 20 70 6f 73 73  tening is a poss
a9a0: 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e  iblity, do so an
a9b0: 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  d return immedia
a9c0: 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 20 20 69  tely.  .  */.  i
a9d0: 66 28 20 70 50 61 72 65 6e 74 20 26 26 20 70 50  f( pParent && pP
a9e0: 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20  arentAgg &&.    
a9f0: 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72    flattenSubquer
aa00: 79 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e  y(pParent, paren
aa10: 74 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41 67  tTab, *pParentAg
aa20: 67 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20  g, isAgg) ){.   
aa30: 20 69 66 28 20 69 73 41 67 67 20 29 20 2a 70 50   if( isAgg ) *pP
aa40: 61 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20  arentAgg = 1;.  
aa50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
aa60: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
aa70: 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
aa80: 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
aa90: 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
aaa0: 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
aab0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  if( eDest==SRT_T
aac0: 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  empTable ){.    
aad0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
aae0: 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
aaf0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 7d 0a 0a  iParm, 0);.  }..
ab00: 20 20 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79    /* Do an analy
ab10: 73 69 73 20 6f 66 20 61 67 67 72 65 67 61 74 65  sis of aggregate
ab20: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
ab30: 2a 2f 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65  */.  sqliteAggre
ab40: 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50  gateInfoReset(pP
ab50: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 69 73 41  arse);.  if( isA
ab60: 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  gg ){.    assert
ab70: 28 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 3d 3d  ( pParse->nAgg==
ab80: 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 );.    for(i=0
ab90: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
aba0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
abb0: 66 28 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61  f( sqliteExprAna
abc0: 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
abd0: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
abe0: 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
abf0: 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
ac00: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
ac10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72     }.    if( pGr
ac20: 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 66  oupBy ){.      f
ac30: 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70  or(i=0; i<pGroup
ac40: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
ac50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
ac60: 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  iteExprAnalyzeAg
ac70: 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
ac80: 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e   pGroupBy->a[i].
ac90: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
aca0: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
acb0: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
acc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
acd0: 20 69 66 28 20 70 48 61 76 69 6e 67 20 26 26 20   if( pHaving && 
ace0: 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a  sqliteExprAnalyz
acf0: 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
ad00: 73 65 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a  se, pHaving) ){.
ad10: 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
ad20: 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
ad30: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
ad40: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
ad50: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
ad60: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
ad70: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 41   if( sqliteExprA
ad80: 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
ad90: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
ada0: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  y->a[i].pExpr) )
adb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
adc0: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
add0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ade0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
adf0: 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 0a 20  et the limiter. 
ae00: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 69   */.  if( p->nLi
ae10: 6d 69 74 3c 3d 30 20 29 7b 0a 20 20 20 20 70 2d  mit<=0 ){.    p-
ae20: 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >nOffset = 0;.  
ae30: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
ae40: 2d 3e 6e 4f 66 66 73 65 74 3c 30 20 29 20 70 2d  ->nOffset<0 ) p-
ae50: 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >nOffset = 0;.  
ae60: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
ae70: 70 28 76 2c 20 4f 50 5f 4c 69 6d 69 74 2c 20 70  p(v, OP_Limit, p
ae80: 2d 3e 6e 4c 69 6d 69 74 2c 20 70 2d 3e 6e 4f 66  ->nLimit, p->nOf
ae90: 66 73 65 74 29 3b 0a 20 20 7d 0a 20 20 20 20 0a  fset);.  }.    .
aea0: 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
aeb0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77  olumn names if w
aec0: 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
aed0: 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  in the callback.
aee0: 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70    This.  ** step
aef0: 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
af00: 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69  he output is goi
af10: 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 72  ng to a table or
af20: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a   a memory cell..
af30: 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
af40: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
af50: 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  {.    generateCo
af60: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
af70: 2c 20 70 2d 3e 62 61 73 65 2c 20 70 54 61 62 4c  , p->base, pTabL
af80: 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ist, pEList);.  
af90: 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68  }..  /* Reset th
afa0: 65 20 61 67 67 72 65 67 61 74 6f 72 0a 20 20 2a  e aggregator.  *
afb0: 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  /.  if( isAgg ){
afc0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
afd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 52 65  ddOp(v, OP_AggRe
afe0: 73 65 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  set, 0, pParse->
aff0: 6e 41 67 67 29 3b 0a 20 20 20 20 66 6f 72 28 69  nAgg);.    for(i
b000: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  =0; i<pParse->nA
b010: 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gg; i++){.      
b020: 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b 0a  FuncDef *pFunc;.
b030: 20 20 20 20 20 20 69 66 28 20 28 70 46 75 6e 63        if( (pFunc
b040: 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b   = pParse->aAgg[
b050: 69 5d 2e 70 46 75 6e 63 29 21 3d 30 20 26 26 20  i].pFunc)!=0 && 
b060: 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65  pFunc->xFinalize
b070: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
b080: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b090: 2c 20 4f 50 5f 41 67 67 49 6e 69 74 2c 20 30 2c  , OP_AggInit, 0,
b0a0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   i);.        sql
b0b0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
b0c0: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 46  v, -1, (char*)pF
b0d0: 75 6e 63 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  unc, P3_POINTER)
b0e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b0f0: 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
b100: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
b110: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b120: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
b130: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
b140: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
b150: 67 46 6f 63 75 73 2c 20 30 2c 20 30 29 3b 0a 20  gFocus, 0, 0);. 
b160: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
b170: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
b180: 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c  mory cell to NUL
b190: 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  L.  */.  if( eDe
b1a0: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20  st==SRT_Mem ){. 
b1b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b1c0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
b1d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
b1e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b1f0: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
b200: 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  m, 1);.  }..  /*
b210: 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
b220: 79 20 74 61 62 6c 65 20 74 6f 20 75 73 65 20 66  y table to use f
b230: 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
b240: 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
b250: 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  isDistinct ){.  
b260: 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61    distinct = pPa
b270: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
b280: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b290: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
b2a0: 20 64 69 73 74 69 6e 63 74 2c 20 31 29 3b 0a 20   distinct, 1);. 
b2b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74   }else{.    dist
b2c0: 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  inct = -1;.  }..
b2d0: 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64    /* Begin the d
b2e0: 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 2a  atabase scan.  *
b2f0: 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  /.  pWInfo = sql
b300: 69 74 65 57 68 65 72 65 42 65 67 69 6e 28 70 50  iteWhereBegin(pP
b310: 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 70  arse, p->base, p
b320: 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
b330: 20 30 29 3b 0a 20 20 69 66 28 20 70 57 49 6e 66   0);.  if( pWInf
b340: 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
b350: 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73  ct_end;..  /* Us
b360: 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
b370: 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20 77 65 20  nner loop if we 
b380: 61 72 65 20 6e 6f 74 20 64 65 61 6c 69 6e 67 20  are not dealing 
b390: 77 69 74 68 0a 20 20 2a 2a 20 61 67 67 72 65 67  with.  ** aggreg
b3a0: 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ates.  */.  if( 
b3b0: 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66  !isAgg ){.    if
b3c0: 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  ( selectInnerLoo
b3d0: 70 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  p(pParse, pEList
b3e0: 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
b3f0: 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73  , distinct, eDes
b400: 74 2c 20 69 50 61 72 6d 2c 0a 20 20 20 20 20 20  t, iParm,.      
b410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
b420: 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c  Info->iContinue,
b430: 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29   pWInfo->iBreak)
b440: 20 29 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f 20   ){.       goto 
b450: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
b460: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  }.  }..  /* If w
b470: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
b480: 74 68 20 61 67 67 72 65 67 61 74 65 73 2c 20 74  th aggregates, t
b490: 68 65 6e 20 74 6f 20 74 68 65 20 73 70 65 63 69  hen to the speci
b4a0: 61 6c 20 61 67 67 72 65 67 61 74 65 0a 20 20 2a  al aggregate.  *
b4b0: 2a 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 0a  * processing.  .
b4c0: 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20    */.  else{.   
b4d0: 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
b4e0: 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 31 3b  .      int lbl1;
b4f0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b500: 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  i<pGroupBy->nExp
b510: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
b520: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
b530: 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
b540: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
b550: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
b560: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b570: 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 47 72 6f  OP_MakeKey, pGro
b580: 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b  upBy->nExpr, 0);
b590: 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71  .      lbl1 = sq
b5a0: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
b5b0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
b5c0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b5d0: 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 6c  P_AggFocus, 0, l
b5e0: 62 6c 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  bl1);.      for(
b5f0: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
b600: 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Agg; i++){.     
b610: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
b620: 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63  Agg[i].isAgg ) c
b630: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
b640: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
b650: 70 50 61 72 73 65 2c 20 70 50 61 72 73 65 2d 3e  pParse, pParse->
b660: 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  aAgg[i].pExpr);.
b670: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
b680: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
b690: 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20  gSet, 0, i);.   
b6a0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
b6b0: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
b6c0: 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20  l(v, lbl1);.    
b6d0: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
b6e0: 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69  <pParse->nAgg; i
b6f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
b700: 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  *pE;.      int j
b710: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
b720: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41  rse->aAgg[i].isA
b730: 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  gg ) continue;. 
b740: 20 20 20 20 20 70 45 20 3d 20 70 50 61 72 73 65       pE = pParse
b750: 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 3b  ->aAgg[i].pExpr;
b760: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b770: 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  E->op==TK_AGG_FU
b780: 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  NCTION );.      
b790: 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 20 29 7b  if( pE->pList ){
b7a0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
b7b0: 3b 20 6a 3c 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e  ; j<pE->pList->n
b7c0: 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
b7d0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
b7e0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 2d  Code(pParse, pE-
b7f0: 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  >pList->a[j].pEx
b800: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
b810: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
b820: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b830: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
b840: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
b850: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
b860: 67 67 46 75 6e 63 2c 20 30 2c 20 70 45 2d 3e 70  ggFunc, 0, pE->p
b870: 4c 69 73 74 20 3f 20 70 45 2d 3e 70 4c 69 73 74  List ? pE->pList
b880: 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20  ->nExpr : 0);.  
b890: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
b8a0: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e  se->aAgg[i].pFun
b8b0: 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  c!=0 );.      as
b8c0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61 41  sert( pParse->aA
b8d0: 67 67 5b 69 5d 2e 70 46 75 6e 63 2d 3e 78 53 74  gg[i].pFunc->xSt
b8e0: 65 70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ep!=0 );.      s
b8f0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
b900: 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29  3(v, -1, (char*)
b910: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
b920: 70 46 75 6e 63 2c 20 50 33 5f 50 4f 49 4e 54 45  pFunc, P3_POINTE
b930: 52 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  R);.    }.  }.. 
b940: 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
b950: 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a  base scan loop..
b960: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 57 68 65    */.  sqliteWhe
b970: 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a  reEnd(pWInfo);..
b980: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 70    /* If we are p
b990: 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
b9a0: 61 74 65 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  ates, we need to
b9b0: 20 73 65 74 20 75 70 20 61 20 73 65 63 6f 6e 64   set up a second
b9c0: 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72 20   loop.  ** over 
b9d0: 61 6c 6c 20 6f 66 20 74 68 65 20 61 67 67 72 65  all of the aggre
b9e0: 67 61 74 65 20 76 61 6c 75 65 73 20 61 6e 64 20  gate values and 
b9f0: 70 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20 20  process them..  
ba00: 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29  */.  if( isAgg )
ba10: 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64 61 67 67  {.    int endagg
ba20: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
ba30: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
ba40: 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20 20 20  nt startagg;.   
ba50: 20 73 74 61 72 74 61 67 67 20 3d 20 73 71 6c 69   startagg = sqli
ba60: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ba70: 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20 65 6e  P_AggNext, 0, en
ba80: 64 61 67 67 29 3b 0a 20 20 20 20 70 50 61 72 73  dagg);.    pPars
ba90: 65 2d 3e 75 73 65 41 67 67 20 3d 20 31 3b 0a 20  e->useAgg = 1;. 
baa0: 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
bab0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
bac0: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
bad0: 2c 20 70 48 61 76 69 6e 67 2c 20 73 74 61 72 74  , pHaving, start
bae0: 61 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  agg);.    }.    
baf0: 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  if( selectInnerL
bb00: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 45 4c 69  oop(pParse, pELi
bb10: 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72  st, 0, 0, pOrder
bb20: 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44  By, distinct, eD
bb30: 65 73 74 2c 20 69 50 61 72 6d 2c 0a 20 20 20 20  est, iParm,.    
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb50: 73 74 61 72 74 61 67 67 2c 20 65 6e 64 61 67 67  startagg, endagg
bb60: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
bb70: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
bb80: 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
bb90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
bba0: 2c 20 30 2c 20 73 74 61 72 74 61 67 67 29 3b 0a  , 0, startagg);.
bbb0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
bbc0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
bbd0: 64 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  dagg);.    sqlit
bbe0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
bbf0: 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  _Noop, 0, 0);.  
bc00: 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67    pParse->useAgg
bc10: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
bc20: 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
bc30: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
bc40: 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  then we need to 
bc50: 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73  sort the results
bc60: 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74  .  ** and send t
bc70: 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  hem to the callb
bc80: 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  ack one by one..
bc90: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
bca0: 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  rBy ){.    gener
bcb0: 61 74 65 53 6f 72 74 54 61 69 6c 28 76 2c 20 70  ateSortTail(v, p
bcc0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
bcd0: 20 7d 0a 0a 0a 20 20 2f 2a 20 49 73 73 75 65 20   }...  /* Issue 
bce0: 61 20 6e 75 6c 6c 20 63 61 6c 6c 62 61 63 6b 20  a null callback 
bcf0: 69 66 20 74 68 61 74 20 69 73 20 77 68 61 74 20  if that is what 
bd00: 74 68 65 20 75 73 65 72 20 77 61 6e 74 73 2e 0a  the user wants..
bd10: 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 61 72    */.  if( (pPar
bd20: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
bd30: 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62  SQLITE_NullCallb
bd40: 61 63 6b 29 21 3d 30 20 26 26 20 65 44 65 73 74  ack)!=0 && eDest
bd50: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
bd60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
bd70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
bd80: 43 61 6c 6c 62 61 63 6b 2c 20 70 45 4c 69 73 74  Callback, pEList
bd90: 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  ->nExpr, 0);.  }
bda0: 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43  ..  /* The SELEC
bdb0: 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  T was successful
bdc0: 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20  ly coded.   Set 
bdd0: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
bde0: 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  to 0.  ** to ind
bdf0: 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e  icate no errors.
be00: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a  .  */.  rc = 0;.
be10: 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
be20: 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
be30: 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
be40: 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
be50: 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
be60: 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
be70: 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
be80: 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70  .select_end:.  p
be90: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 62 61  Parse->nTab = ba
bea0: 73 65 3b 0a 20 20 73 71 6c 69 74 65 41 67 67 72  se;.  sqliteAggr
beb0: 65 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28 70  egateInfoReset(p
bec0: 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  Parse);.  return
bed0: 20 72 63 3b 0a 7d 0a                              rc;.}.