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

Artifact 92aef3f69e90dc065d680d88b1f075409e9249bb:


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 38 20  select.c,v 1.78 
0200: 32 30 30 32 2f 30 34 2f 30 34 20 30 32 3a 31 30  2002/04/04 02:10
0210: 3a 35 37 20 64 72 68 20 45 78 70 20 24 0a 2a 2f  :57 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 53 63 61 6e 20 74 68 65 20    (2)  Scan the 
2d50: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
2d60: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
2d70: 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
2d80: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
2d90: 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
2da0: 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
2db0: 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
2dc0: 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
2dd0: 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
2de0: 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
2df0: 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
2e00: 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
2e10: 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
2e20: 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
2e30: 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
2e40: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  LE..**.** Return
2e50: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20   0 on success.  
2e60: 49 66 20 74 68 65 72 65 20 61 72 65 20 70 72 6f  If there are pro
2e70: 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20  blems, leave an 
2e80: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
2e90: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
2ea0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
2eb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
2ec0: 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50  llInColumnList(P
2ed0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
2ee0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
2ef0: 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 49  i, j, k, rc;.  I
2f00: 64 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  dList *pTabList;
2f10: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
2f20: 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ist;.  Table *pT
2f30: 61 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20  ab;..  if( p==0 
2f40: 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20 29 20  || p->pSrc==0 ) 
2f50: 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 54 61 62  return 1;.  pTab
2f60: 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
2f70: 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
2f80: 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  List;..  /* Look
2f90: 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20   up every table 
2fa0: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69 73  in the table lis
2fb0: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  t..  */.  for(i=
2fc0: 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
2fd0: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Id; i++){.    if
2fe0: 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  ( pTabList->a[i]
2ff0: 2e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f  .pTab ){.      /
3000: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
3010: 61 73 20 72 75 6e 20 62 65 66 6f 72 65 21 20 20  as run before!  
3020: 4e 6f 20 6e 65 65 64 20 74 6f 20 63 6f 6e 74 69  No need to conti
3030: 6e 75 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  nue */.      ret
3040: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
3050: 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61   if( pTabList->a
3060: 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  [i].zName==0 ){.
3070: 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
3080: 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
3090: 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
30a0: 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ECT */.      ass
30b0: 65 72 74 28 20 70 54 61 62 4c 69 73 74 2d 3e 61  ert( pTabList->a
30c0: 5b 69 5d 2e 70 53 65 6c 65 63 74 21 3d 30 20 29  [i].pSelect!=0 )
30d0: 3b 0a 20 20 20 20 20 20 70 54 61 62 4c 69 73 74  ;.      pTabList
30e0: 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 70 54  ->a[i].pTab = pT
30f0: 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71  ab = .        sq
3100: 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53  liteResultSetOfS
3110: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54  elect(pParse, pT
3120: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
3130: 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ias,.           
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
3160: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
3170: 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ect);.      if( 
3180: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
3190: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
31a0: 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d     }.      pTab-
31b0: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20 31  >isTransient = 1
31c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31d0: 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
31e0: 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
31f0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
3200: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
3210: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
3220: 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
3230: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 69 6e         sqliteFin
3240: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  dTable(pParse->d
3250: 62 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  b, pTabList->a[i
3260: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
3270: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
3280: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
3290: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
32a0: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
32b0: 68 20 74 61 62 6c 65 3a 20 22 2c 20 0a 20 20 20  h table: ", .   
32c0: 20 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74          pTabList
32d0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29  ->a[i].zName, 0)
32e0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
32f0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
3300: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3310: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54    }.      if( pT
3320: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
3330: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
3340: 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  eViewGetColumnNa
3350: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
3360: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
3370: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
3380: 20 7d 0a 20 20 20 20 20 20 20 20 70 54 61 62 4c   }.        pTabL
3390: 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
33a0: 74 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74  t = sqliteSelect
33b0: 44 75 70 28 70 54 61 62 2d 3e 70 53 65 6c 65 63  Dup(pTab->pSelec
33c0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
33d0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  }.  }..  /* For 
33e0: 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
33f0: 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
3400: 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
3410: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
3420: 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
3430: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
3440: 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
3450: 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
3460: 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
3470: 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
3480: 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
3490: 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
34a0: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
34b0: 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
34c0: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  LL operator for 
34d0: 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74  each "*" that it
34e0: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
34f0: 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20  lumn list..  ** 
3500: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
3510: 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c  de just has to l
3520: 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c  ocate the TK_ALL
3530: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
3540: 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63   expand.  ** eac
3550: 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
3560: 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
3570: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   in all tables..
3580: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
3590: 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
35a0: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
35b0: 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
35c0: 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
35d0: 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
35e0: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
35f0: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
3600: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
3610: 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73  Expr *pE = pELis
3620: 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
3630: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
3640: 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
3650: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
3660: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69  K_DOT && pE->pRi
3670: 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68  ght && pE->pRigh
3680: 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20  t->op==TK_ALL.  
3690: 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c         && pE->pL
36a0: 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  eft && pE->pLeft
36b0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72  ->op==TK_ID ) br
36c0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  eak;.  }.  rc = 
36d0: 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73  0;.  if( k<pELis
36e0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
36f0: 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
3700: 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
3710: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
3720: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
3730: 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
3740: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
3750: 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
3760: 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
3770: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
3780: 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
3790: 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
37a0: 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
37b0: 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
37c0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
37d0: 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
37e0: 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
37f0: 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
3800: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
3810: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
3820: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
3830: 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b  pE = a[k].pExpr;
3840: 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
3850: 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20  p!=TK_ALL &&.   
3860: 20 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21          (pE->op!
3870: 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
3880: 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  Right==0 || pE->
3890: 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41  pRight->op!=TK_A
38a0: 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  LL) ){.        /
38b0: 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
38c0: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
38d0: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
38e0: 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
38f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
3900: 65 77 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c  ew = sqliteExprL
3910: 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20  istAppend(pNew, 
3920: 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  a[k].pExpr, 0);.
3930: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
3940: 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
3950: 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
3960: 65 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  e;.        a[k].
3970: 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20  pExpr = 0;.     
3980: 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
3990: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
39a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
39b0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
39c0: 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e  "*" or a "TABLE.
39d0: 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  *" and needs to 
39e0: 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  be.        ** ex
39f0: 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20  panded. */.     
3a00: 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e     int tableSeen
3a10: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65   = 0;      /* Se
3a20: 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c  t to 1 when TABL
3a30: 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20  E matches */.   
3a40: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d       Token *pNam
3a50: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3a60: 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20  text of name of 
3a70: 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20  TABLE */.       
3a80: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
3a90: 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  DOT && pE->pLeft
3aa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
3ab0: 61 6d 65 20 3d 20 26 70 45 2d 3e 70 4c 65 66 74  ame = &pE->pLeft
3ac0: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
3ad0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3ae0: 20 20 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20    pName = 0;.   
3af0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
3b00: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
3b10: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
3b20: 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
3b30: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
3b40: 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[i].pTab;.    
3b50: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
3b60: 4e 61 6d 65 20 3d 20 70 54 61 62 4c 69 73 74 2d  Name = pTabList-
3b70: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20  >a[i].zAlias;.  
3b80: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
3b90: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e  Name==0 || zTabN
3ba0: 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20  ame[0]==0 ){ .  
3bb0: 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
3bc0: 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
3bd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3be0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d          if( pNam
3bf0: 65 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d  e && (zTabName==
3c00: 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  0 || zTabName[0]
3c10: 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ==0 ||.         
3c20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 74 72         sqliteStr
3c30: 4e 49 43 6d 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20  NICmp(pName->z, 
3c40: 7a 54 61 62 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  zTabName, pName-
3c50: 3e 6e 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  >n)!=0) ){.     
3c60: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
3c70: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3c80: 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e         tableSeen
3c90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
3ca0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
3cb0: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
3cc0: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
3cd0: 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c 20 2a 70  Expr, *pLeft, *p
3ce0: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
3cf0: 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69     pRight = sqli
3d00: 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c  teExpr(TK_ID, 0,
3d10: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
3d20: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 3d 3d      if( pRight==
3d30: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
3d40: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74         pRight->t
3d50: 6f 6b 65 6e 2e 7a 20 3d 20 70 54 61 62 2d 3e 61  oken.z = pTab->a
3d60: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col[j].zName;.  
3d70: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
3d80: 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c  ->token.n = strl
3d90: 65 6e 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  en(pTab->aCol[j]
3da0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
3db0: 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
3dc0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
3dd0: 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
3de0: 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  eExpr(TK_ID, 0, 
3df0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
3e00: 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 3d 3d       if( pLeft==
3e10: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
3e20: 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e           pLeft->
3e30: 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 54 61 62 4e 61  token.z = zTabNa
3e40: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
3e50: 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e    pLeft->token.n
3e60: 20 3d 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61   = strlen(zTabNa
3e70: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
3e80: 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
3e90: 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c  eExpr(TK_DOT, pL
3ea0: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b  eft, pRight, 0);
3eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
3ec0: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72  f( pExpr==0 ) br
3ed0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
3ee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3ef0: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
3f00: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
3f10: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20      pExpr->span 
3f20: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a  = pExpr->token;.
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
3f40: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
3f50: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41   sqliteExprListA
3f60: 70 70 65 6e 64 28 70 4e 65 77 2c 20 70 45 78 70  ppend(pNew, pExp
3f70: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
3f80: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
3f90: 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
3fa0: 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
3fb0: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 21 3d   assert( pName!=
3fc0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  0 );.          s
3fd0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
3fe0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
3ff0: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
4000: 3a 20 22 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  : ", -1, .      
4010: 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 2c 20        pName->z, 
4020: 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20  pName->n, 0);.  
4030: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
4040: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4050: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
4060: 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  teExprListDelete
4070: 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  (pEList);.    p-
4080: 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
4090: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
40a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
40b0: 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76 65  outine recursive
40c0: 6c 79 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 53  ly unlinks the S
40d0: 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70  elect.pSrc.a[].p
40e0: 54 61 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  Tab pointers.** 
40f0: 69 6e 20 61 20 73 65 6c 65 63 74 20 73 74 72 75  in a select stru
4100: 63 74 75 72 65 2e 20 20 49 74 20 6a 75 73 74 20  cture.  It just 
4110: 73 65 74 73 20 74 68 65 20 70 6f 69 6e 74 65 72  sets the pointer
4120: 73 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73  s to NULL.  This
4130: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 72  .** routine is r
4140: 65 63 75 72 73 69 76 65 20 69 6e 20 74 68 65 20  ecursive in the 
4150: 73 65 6e 73 65 20 74 68 61 74 20 69 66 20 74 68  sense that if th
4160: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b  e Select.pSrc.a[
4170: 5d 2e 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f 69  ].pSelect.** poi
4180: 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  nter is not NULL
4190: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
41a0: 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  s called recursi
41b0: 76 65 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f 69  vely on that poi
41c0: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
41d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
41e0: 65 64 20 6f 6e 20 74 68 65 20 53 65 6c 65 63 74  ed on the Select
41f0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
4200: 64 65 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49 45  defines a.** VIE
4210: 57 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 6e  W in order to un
4220: 64 6f 20 61 6e 79 20 62 69 6e 64 69 6e 67 73 20  do any bindings 
4230: 74 6f 20 74 61 62 6c 65 73 2e 20 20 54 68 69 73  to tables.  This
4240: 20 69 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a   is necessary.**
4250: 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 74   because those t
4260: 61 62 6c 65 73 20 6d 69 67 68 74 20 62 65 20 44  ables might be D
4270: 52 4f 50 65 64 20 62 79 20 61 20 73 75 62 73 65  ROPed by a subse
4280: 71 75 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61 6e  quent SQL comman
4290: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
42a0: 65 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 53 65  eSelectUnbind(Se
42b0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
42c0: 69 3b 0a 20 20 49 64 4c 69 73 74 20 2a 70 53 72  i;.  IdList *pSr
42d0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 54  c = p->pSrc;.  T
42e0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66  able *pTab;.  if
42f0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
4300: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
4310: 72 63 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  rc->nId; i++){. 
4320: 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70     if( (pTab = p
4330: 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 21  Src->a[i].pTab)!
4340: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
4350: 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e  pTab->isTransien
4360: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
4370: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30  iteDeleteTable(0
4380: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  , pTab);.       
4390: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c   sqliteSelectDel
43a0: 65 74 65 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  ete(pSrc->a[i].p
43b0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
43c0: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c   pSrc->a[i].pSel
43d0: 65 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ect = 0;.      }
43e0: 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  .      pSrc->a[i
43f0: 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ].pTab = 0;.    
4400: 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d    if( pSrc->a[i]
4410: 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  .pSelect ){.    
4420: 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74      sqliteSelect
4430: 55 6e 62 69 6e 64 28 70 53 72 63 2d 3e 61 5b 69  Unbind(pSrc->a[i
4440: 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ].pSelect);.    
4450: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
4460: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4470: 69 6e 65 20 61 73 73 6f 63 69 61 74 65 73 20 65  ine associates e
4480: 6e 74 72 69 65 73 20 69 6e 20 61 6e 20 4f 52 44  ntries in an ORD
4490: 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
44a0: 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f   list with.** co
44b0: 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65 73 75 6c  lumns in a resul
44c0: 74 2e 20 20 46 6f 72 20 65 61 63 68 20 4f 52 44  t.  For each ORD
44d0: 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
44e0: 2c 20 74 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a  , the opcode of.
44f0: 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  ** the top-level
4500: 20 6e 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64   node is changed
4510: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e   to TK_COLUMN an
4520: 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 76 61  d the iColumn va
4530: 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f  lue of.** the to
4540: 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20  p-level node is 
4550: 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 63  filled in with c
4560: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64  olumn number and
4570: 20 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a 20 76   the iTable.** v
4580: 61 6c 75 65 20 6f 66 20 74 68 65 20 74 6f 70 2d  alue of the top-
4590: 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69  level node is fi
45a0: 6c 6c 65 64 20 77 69 74 68 20 69 54 61 62 6c 65  lled with iTable
45b0: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
45c0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70  * If there are p
45d0: 72 69 6f 72 20 53 45 4c 45 43 54 20 63 6c 61 75  rior SELECT clau
45e0: 73 65 73 2c 20 74 68 65 79 20 61 72 65 20 70 72  ses, they are pr
45f0: 6f 63 65 73 73 65 64 20 66 69 72 73 74 2e 20 20  ocessed first.  
4600: 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20 61 6e  A match.** in an
4610: 20 65 61 72 6c 69 65 72 20 53 45 4c 45 43 54 20   earlier SELECT 
4620: 74 61 6b 65 73 20 70 72 65 63 65 64 65 6e 63 65  takes precedence
4630: 20 6f 76 65 72 20 61 20 6c 61 74 65 72 20 53 45   over a later SE
4640: 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  LECT..**.** Any 
4650: 65 6e 74 72 79 20 74 68 61 74 20 64 6f 65 73 20  entry that does 
4660: 6e 6f 74 20 6d 61 74 63 68 20 69 73 20 66 6c 61  not match is fla
4670: 67 67 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72  gged as an error
4680: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  .  The number.**
4690: 20 6f 66 20 65 72 72 6f 72 73 20 69 73 20 72 65   of errors is re
46a0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
46b0: 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65 72  c int matchOrder
46c0: 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  byToColumn(.  Pa
46d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
46e0: 20 20 20 20 20 20 2f 2a 20 41 20 70 6c 61 63 65        /* A place
46f0: 20 74 6f 20 6c 65 61 76 65 20 65 72 72 6f 72 20   to leave error 
4700: 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65  messages */.  Se
4710: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
4720: 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74        /* Match t
4730: 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  o result columns
4740: 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20   of this SELECT 
4750: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
4760: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
4770: 54 68 65 20 4f 52 44 45 52 20 42 59 20 76 61 6c  The ORDER BY val
4780: 75 65 73 20 74 6f 20 6d 61 74 63 68 20 61 67 61  ues to match aga
4790: 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  inst columns */.
47a0: 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
47b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
47c0: 65 72 74 20 74 68 69 73 20 74 68 69 73 20 76 61  ert this this va
47d0: 6c 75 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f  lue in iTable */
47e0: 0a 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c  .  int mustCompl
47f0: 65 74 65 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ete        /* If
4800: 20 54 52 55 45 20 61 6c 6c 20 4f 52 44 45 52 20   TRUE all ORDER 
4810: 42 59 73 20 6d 75 73 74 20 6d 61 74 63 68 20 2a  BYs must match *
4820: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20  /.){.  int nErr 
4830: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  = 0;.  int i, j;
4840: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
4850: 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c  ist;..  if( pSel
4860: 65 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72  ect==0 || pOrder
4870: 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  By==0 ) return 1
4880: 3b 0a 20 20 69 66 28 20 6d 75 73 74 43 6f 6d 70  ;.  if( mustComp
4890: 6c 65 74 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  lete ){.    for(
48a0: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
48b0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f  >nExpr; i++){ pO
48c0: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
48d0: 65 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69  e = 0; }.  }.  i
48e0: 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  f( fillInColumnL
48f0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
4900: 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
4910: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
4920: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
4930: 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 74 63 68  ){.    if( match
4940: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
4950: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
4960: 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65 72 42  >pPrior, pOrderB
4970: 79 2c 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b  y, iTable, 0) ){
4980: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
4990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c  .    }.  }.  pEL
49a0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
49b0: 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  EList;.  for(i=0
49c0: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
49d0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
49e0: 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72  xpr *pE = pOrder
49f0: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
4a00: 20 20 20 20 69 6e 74 20 6d 61 74 63 68 20 3d 20      int match = 
4a10: 30 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  0;.    if( pOrde
4a20: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29  rBy->a[i].done )
4a30: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
4a40: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74  or(j=0; j<pEList
4a50: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
4a60: 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d       if( pEList-
4a70: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28  >a[j].zName && (
4a80: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c  pE->op==TK_ID ||
4a90: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49   pE->op==TK_STRI
4aa0: 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  NG) ){.        c
4ab0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61  har *zName, *zLa
4ac0: 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  bel;.        zNa
4ad0: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  me = pEList->a[j
4ae0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
4af0: 20 61 73 73 65 72 74 28 20 70 45 2d 3e 74 6f 6b   assert( pE->tok
4b00: 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 20 20  en.z );.        
4b10: 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 53  zLabel = sqliteS
4b20: 74 72 4e 44 75 70 28 70 45 2d 3e 74 6f 6b 65 6e  trNDup(pE->token
4b30: 2e 7a 2c 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 29  .z, pE->token.n)
4b40: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4b50: 44 65 71 75 6f 74 65 28 7a 4c 61 62 65 6c 29 3b  Dequote(zLabel);
4b60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
4b70: 69 74 65 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  iteStrICmp(zName
4b80: 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20  , zLabel)==0 ){ 
4b90: 0a 20 20 20 20 20 20 20 20 20 20 6d 61 74 63 68  .          match
4ba0: 20 3d 20 31 3b 20 0a 20 20 20 20 20 20 20 20 7d   = 1; .        }
4bb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
4bc0: 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20  ree(zLabel);.   
4bd0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d     }.      if( m
4be0: 61 74 63 68 3d 3d 30 20 26 26 20 73 71 6c 69 74  atch==0 && sqlit
4bf0: 65 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 2c  eExprCompare(pE,
4c00: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45   pEList->a[j].pE
4c10: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
4c20: 6d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20  match = 1;.     
4c30: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61 74   }.      if( mat
4c40: 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  ch ){.        pE
4c50: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
4c60: 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43  ;.        pE->iC
4c70: 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
4c80: 20 20 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20     pE->iTable = 
4c90: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
4ca0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
4cb0: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  one = 1;.       
4cc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4cd0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 6d      }.    if( !m
4ce0: 61 74 63 68 20 26 26 20 6d 75 73 74 43 6f 6d 70  atch && mustComp
4cf0: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 63 68  lete ){.      ch
4d00: 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20  ar zBuf[30];.   
4d10: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
4d20: 22 25 64 22 2c 69 2b 31 29 3b 0a 20 20 20 20 20  "%d",i+1);.     
4d30: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
4d40: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
4d50: 67 2c 20 22 4f 52 44 45 52 20 42 59 20 74 65 72  g, "ORDER BY ter
4d60: 6d 20 6e 75 6d 62 65 72 20 22 2c 20 7a 42 75 66  m number ", zBuf
4d70: 2c 20 0a 20 20 20 20 20 20 20 20 22 20 64 6f 65  , .        " doe
4d80: 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20  s not match any 
4d90: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20  result column", 
4da0: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
4db0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
4dc0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62 72  nErr++;.      br
4dd0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
4de0: 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a   return nErr;  .
4df0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
4e00: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
4e10: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
4e20: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
4e30: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
4e40: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
4e50: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
4e60: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
4e70: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
4e80: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
4e90: 69 74 65 47 65 74 56 64 62 65 28 50 61 72 73 65  iteGetVdbe(Parse
4ea0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
4eb0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
4ec0: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
4ed0: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
4ee0: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
4ef0: 74 65 56 64 62 65 43 72 65 61 74 65 28 70 50 61  teVdbeCreate(pPa
4f00: 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20  rse->db);.  }.  
4f10: 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 20 20 20 20  return v;.}.    
4f20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
4f30: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
4f40: 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75 65 72  o process a quer
4f50: 79 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79  y that is really
4f60: 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72   the union.** or
4f70: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
4f80: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
4f90: 61 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a  arate queries..*
4fa0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
4fb0: 74 69 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  tiSelect(Parse *
4fc0: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
4fd0: 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e  p, int eDest, in
4fe0: 74 20 69 50 61 72 6d 29 7b 0a 20 20 69 6e 74 20  t iParm){.  int 
4ff0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
5000: 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
5010: 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
5020: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
5030: 50 72 69 6f 72 3b 20 20 20 20 20 2f 2a 20 41 6e  Prior;     /* An
5040: 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
5050: 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
5060: 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
5070: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
5080: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5090: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
50a0: 20 69 6e 74 20 62 61 73 65 3b 20 20 20 20 20 20   int base;      
50b0: 20 20 20 20 20 2f 2a 20 42 61 73 65 6c 69 6e 65       /* Baseline
50c0: 20 76 61 6c 75 65 20 66 6f 72 20 70 50 61 72 73   value for pPars
50d0: 65 2d 3e 6e 54 61 62 20 2a 2f 0a 0a 20 20 2f 2a  e->nTab */..  /*
50e0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
50f0: 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
5100: 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
5110: 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 20 74  SELECTs.  Only t
5120: 68 65 20 0a 20 20 2a 2a 20 6c 61 73 74 20 53 45  he .  ** last SE
5130: 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69  LECT in the seri
5140: 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f  es may have an O
5150: 52 44 45 52 20 42 59 2e 0a 20 20 2a 2f 0a 20 20  RDER BY..  */.  
5160: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
5170: 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72  Prior==0 ) retur
5180: 6e 20 31 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  n 1;.  pPrior = 
5190: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28  p->pPrior;.  if(
51a0: 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
51b0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  y ){.    sqliteS
51c0: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
51d0: 2d 3e 7a 45 72 72 4d 73 67 2c 22 4f 52 44 45 52  ->zErrMsg,"ORDER
51e0: 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c   BY clause shoul
51f0: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 22 2c 0a  d come after ",.
5200: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
5210: 6d 65 28 70 2d 3e 6f 70 29 2c 20 22 20 6e 6f 74  me(p->op), " not
5220: 20 62 65 66 6f 72 65 22 2c 20 30 29 3b 0a 20 20   before", 0);.  
5230: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
5240: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
5250: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
5260: 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61  ure we have a va
5270: 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65  lid query engine
5280: 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74  .  If not, creat
5290: 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a  e a new one..  *
52a0: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  /.  v = sqliteGe
52b0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
52c0: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
52d0: 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  rn 1;..  /* Crea
52e0: 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
52f0: 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
5300: 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
5310: 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
5320: 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20  ==SRT_TempTable 
5330: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
5340: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
5350: 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29  nTemp, iParm, 0)
5360: 3b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 53 52  ;.    eDest = SR
5370: 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
5380: 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 55  /* Process the U
5390: 4e 49 4f 4e 20 6f 72 20 49 4e 54 45 52 53 45 43  NION or INTERSEC
53a0: 54 49 4f 4e 0a 20 20 2a 2f 0a 20 20 62 61 73 65  TION.  */.  base
53b0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
53c0: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
53d0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
53e0: 41 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ALL:.    case TK
53f0: 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73  _EXCEPT:.    cas
5400: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
5410: 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
5420: 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
5430: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
5440: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c  porary table hol
5450: 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
5460: 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20       int op;    
5470: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
5480: 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
5490: 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
54a0: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  self */.      in
54b0: 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
54c0: 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
54d0: 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
54e0: 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
54f0: 2f 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70  /..      priorOp
5500: 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c   = p->op==TK_ALL
5510: 20 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a 20 53   ? SRT_Table : S
5520: 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
5530: 69 66 28 20 65 44 65 73 74 3d 3d 70 72 69 6f 72  if( eDest==prior
5540: 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  Op ){.        /*
5550: 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20   We can reuse a 
5560: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
5570: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53  generated by a S
5580: 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20  ELECT to our.   
5590: 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 20 20       ** right.  
55a0: 54 68 69 73 20 61 6c 73 6f 20 6d 65 61 6e 73 20  This also means 
55b0: 77 65 20 61 72 65 20 6e 6f 74 20 74 68 65 20 72  we are not the r
55c0: 69 67 68 74 2d 6d 6f 73 74 20 73 65 6c 65 63 74  ight-most select
55d0: 20 61 6e 64 20 73 6f 0a 20 20 20 20 20 20 20 20   and so.        
55e0: 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 68 61 76  ** we cannot hav
55f0: 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
5600: 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ause.        */.
5610: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
5620: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20 20   = iParm;.      
5630: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
5640: 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
5650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5660: 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64   /* We will need
5670: 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f   to create our o
5680: 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wn temporary tab
5690: 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20  le to hold the. 
56a0: 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d         ** interm
56b0: 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a  ediate results..
56c0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
56d0: 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50     unionTab = pP
56e0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
56f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
5700: 64 65 72 42 79 20 0a 20 20 20 20 20 20 20 20 26  derBy .        &
5710: 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  & matchOrderbyTo
5720: 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
5730: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75  , p->pOrderBy, u
5740: 6e 69 6f 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20  nionTab, 1) ){. 
5750: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
5760: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
5770: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d       if( p->op!=
5780: 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20  TK_ALL ){.      
5790: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
57a0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
57b0: 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29  mp, unionTab, 1)
57c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
57d0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
57e0: 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 75 6e 69  P_KeyAsData, uni
57f0: 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 20  onTab, 1);.     
5800: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5810: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5820: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
5830: 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  mp, unionTab, 0)
5840: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5850: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
5860: 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
5870: 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
5880: 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  left.      */.  
5890: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53      rc = sqliteS
58a0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
58b0: 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75  rior, priorOp, u
58c0: 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30  nionTab, 0, 0, 0
58d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
58e0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
58f0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
5900: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73  current SELECT s
5910: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  tatement.      *
5920: 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  /.      switch( 
5930: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  p->op ){.       
5940: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
5950: 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65  :  op = SRT_Exce
5960: 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  pt;   break;.   
5970: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e        case TK_UN
5980: 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f  ION:   op = SRT_
5990: 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b  Union;    break;
59a0: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
59b0: 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20  K_ALL:     op = 
59c0: 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72  SRT_Table;    br
59d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
59e0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
59f0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
5a00: 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65  iteSelect(pParse
5a10: 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61  , p, op, unionTa
5a20: 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  b, 0, 0, 0);.   
5a30: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
5a40: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
5a50: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5a60: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
5a70: 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
5a80: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
5a90: 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
5aa0: 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
5ab0: 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
5ac0: 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
5ad0: 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20     */      .    
5ae0: 20 20 69 66 28 20 65 44 65 73 74 21 3d 70 72 69    if( eDest!=pri
5af0: 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  orOp ){.        
5b00: 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
5b10: 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
5b20: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
5b30: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
5b40: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
5b50: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 62  mes(pParse, p->b
5b60: 61 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73  ase, 0, p->pELis
5b70: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 42 72 65  t);.        iBre
5b80: 61 6b 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  ak = sqliteVdbeM
5b90: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
5ba0: 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
5bb0: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
5bc0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
5bd0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5be0: 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e  OP_Rewind, union
5bf0: 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  Tab, iBreak);.  
5c00: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
5c10: 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74  qliteVdbeCurrent
5c20: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
5c30: 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65   rc = selectInne
5c40: 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 30 2c  rLoop(pParse, 0,
5c50: 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45   unionTab, p->pE
5c60: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c80: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72            p->pOr
5c90: 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74  derBy, -1, eDest
5ca0: 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20  , iParm, .      
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cc0: 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42         iCont, iB
5cd0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69  reak);.        i
5ce0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 31  f( rc ) return 1
5cf0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5d00: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
5d10: 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
5d20: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5d30: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
5d40: 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
5d50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5d60: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
5d70: 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
5d80: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
5d90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
5da0: 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
5db0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
5dc0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
5dd0: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f        generateSo
5de0: 72 74 54 61 69 6c 28 76 2c 20 70 2d 3e 70 45 4c  rtTail(v, p->pEL
5df0: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
5e00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5e10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5e20: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
5e30: 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20  TERSECT: {.     
5e40: 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
5e50: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
5e60: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
5e70: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45  ;..      /* INTE
5e80: 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65  RSECT is differe
5e90: 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  nt from the othe
5ea0: 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75  rs since it requ
5eb0: 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77  ires.      ** tw
5ec0: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
5ed0: 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61  es.  Hence it ha
5ee0: 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20  s its own case. 
5ef0: 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20   Begin.      ** 
5f00: 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  by allocating th
5f10: 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c  e tables we will
5f20: 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
5f30: 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61        tab1 = pPa
5f40: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
5f50: 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65     tab2 = pParse
5f60: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
5f70: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
5f80: 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  && matchOrderbyT
5f90: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70  oColumn(pParse,p
5fa0: 2c 70 2d 3e 70 4f 72 64 65 72 42 79 2c 74 61 62  ,p->pOrderBy,tab
5fb0: 31 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  1,1) ){.        
5fc0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
5fd0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  }.      sqliteVd
5fe0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
5ff0: 65 6e 54 65 6d 70 2c 20 74 61 62 31 2c 20 31 29  enTemp, tab1, 1)
6000: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
6010: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65  beAddOp(v, OP_Ke
6020: 79 41 73 44 61 74 61 2c 20 74 61 62 31 2c 20 31  yAsData, tab1, 1
6030: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
6040: 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
6050: 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
6060: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
6070: 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  tab1"..      */.
6080: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6090: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
60a0: 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f  pPrior, SRT_Unio
60b0: 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c 20 30  n, tab1, 0, 0, 0
60c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
60d0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
60e0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
60f0: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
6100: 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
6110: 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20  ble "tab2".     
6120: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
6130: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6140: 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 32 2c 20  OpenTemp, tab2, 
6150: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
6160: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6170: 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62 32 2c  KeyAsData, tab2,
6180: 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50   1);.      p->pP
6190: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
61a0: 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63  rc = sqliteSelec
61b0: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54  t(pParse, p, SRT
61c0: 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c  _Union, tab2, 0,
61d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d   0, 0);.      p-
61e0: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
61f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
6200: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
6210: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
6220: 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  ode to take the 
6230: 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
6240: 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72  the two temporar
6250: 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  y.      ** table
6260: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
6270: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
6280: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 67 65 6e  ist );.      gen
6290: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
62a0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65  (pParse, p->base
62b0: 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  , 0, p->pEList);
62c0: 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20  .      iBreak = 
62d0: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
62e0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43  bel(v);.      iC
62f0: 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ont = sqliteVdbe
6300: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
6310: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6320: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
6330: 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b  , tab1, iBreak);
6340: 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
6350: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6360: 76 2c 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74  v, OP_FullKey, t
6370: 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab1, 0);.      s
6380: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6390: 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
63a0: 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  ab2, iCont);.   
63b0: 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e     rc = selectIn
63c0: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
63d0: 30 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69  0, tab1, p->pELi
63e0: 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6400: 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65          p->pOrde
6410: 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  rBy, -1, eDest, 
6420: 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20  iParm, .        
6430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6440: 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65       iCont, iBre
6450: 61 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ak);.      if( r
6460: 63 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  c ) return 1;.  
6470: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
6480: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
6490: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
64a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
64b0: 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
64c0: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  tart);.      sql
64d0: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
64e0: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
64f0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6500: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
6510: 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  e, tab2, 0);.   
6520: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6530: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
6540: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
6550: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
6560: 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72  ){.        gener
6570: 61 74 65 53 6f 72 74 54 61 69 6c 28 76 2c 20 70  ateSortTail(v, p
6580: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
6590: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
65a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
65b0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
65c0: 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e  List && pPrior->
65d0: 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20  pEList );.  if( 
65e0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
65f0: 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  !=pPrior->pEList
6600: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
6610: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
6620: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
6630: 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
6640: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
6650: 6f 66 20 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  of ",.      sele
6660: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 2c  ctOpName(p->op),
6670: 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
6680: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
6690: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
66a0: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
66b0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
66c0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70  eturn 1;.  }.  p
66d0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 62 61  Parse->nTab = ba
66e0: 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  se;.  return 0;.
66f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69  }../*.** Recursi
6700: 76 65 6c 79 20 73 63 61 6e 20 74 68 72 6f 75 67  vely scan throug
6710: 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  h an expression 
6720: 74 72 65 65 2e 20 20 46 6f 72 20 65 76 65 72 79  tree.  For every
6730: 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f   reference.** to
6740: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
6750: 6c 65 20 6e 75 6d 62 65 72 20 69 46 72 6f 6d 2c  le number iFrom,
6760: 20 63 68 61 6e 67 65 20 74 68 61 74 20 72 65 66   change that ref
6770: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a  erence to the.**
6780: 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 6e 20   same column in 
6790: 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 6f  table number iTo
67a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
67b0: 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28 45 78   changeTables(Ex
67c0: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 69  pr *pExpr, int i
67d0: 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
67e0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
67f0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
6800: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
6810: 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
6820: 61 62 6c 65 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  able==iFrom ){. 
6830: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
6840: 20 3d 20 69 54 6f 3b 0a 20 20 7d 65 6c 73 65 7b   = iTo;.  }else{
6850: 0a 20 20 20 20 73 74 61 74 69 63 20 76 6f 69 64  .    static void
6860: 20 63 68 61 6e 67 65 54 61 62 6c 65 73 49 6e 4c   changeTablesInL
6870: 69 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 20 69  ist(ExprList*, i
6880: 6e 74 2c 20 69 6e 74 29 3b 0a 20 20 20 20 63 68  nt, int);.    ch
6890: 61 6e 67 65 54 61 62 6c 65 73 28 70 45 78 70 72  angeTables(pExpr
68a0: 2d 3e 70 4c 65 66 74 2c 20 69 46 72 6f 6d 2c 20  ->pLeft, iFrom, 
68b0: 69 54 6f 29 3b 0a 20 20 20 20 63 68 61 6e 67 65  iTo);.    change
68c0: 54 61 62 6c 65 73 28 70 45 78 70 72 2d 3e 70 52  Tables(pExpr->pR
68d0: 69 67 68 74 2c 20 69 46 72 6f 6d 2c 20 69 54 6f  ight, iFrom, iTo
68e0: 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 54 61 62  );.    changeTab
68f0: 6c 65 73 49 6e 4c 69 73 74 28 70 45 78 70 72 2d  lesInList(pExpr-
6900: 3e 70 4c 69 73 74 2c 20 69 46 72 6f 6d 2c 20 69  >pList, iFrom, i
6910: 54 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  To);.  }.}.stati
6920: 63 20 76 6f 69 64 20 63 68 61 6e 67 65 54 61 62  c void changeTab
6930: 6c 65 73 49 6e 4c 69 73 74 28 45 78 70 72 4c 69  lesInList(ExprLi
6940: 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69  st *pList, int i
6950: 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
6960: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
6970: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
6980: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
6990: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
69a0: 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28     changeTables(
69b0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
69c0: 72 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a  r, iFrom, iTo);.
69d0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
69e0: 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
69f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
6a00: 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
6a10: 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
6a20: 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
6a30: 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
6a40: 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
6a50: 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   of the correspo
6a60: 6e 64 69 6e 67 0a 2a 2a 20 65 6e 74 72 79 20 69  nding.** entry i
6a70: 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20  n pEList.  (But 
6a80: 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73  leave references
6a90: 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f   to the ROWID co
6aa0: 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  lumn .** unchang
6ab0: 65 64 2e 29 20 20 57 68 65 6e 20 6d 61 6b 69 6e  ed.)  When makin
6ac0: 67 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65  g a copy of an e
6ad0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 70 45 4c  xpression in pEL
6ae0: 69 73 74 2c 20 63 68 61 6e 67 65 0a 2a 2a 20 72  ist, change.** r
6af0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
6b00: 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 69 53  umns in table iS
6b10: 75 62 20 69 6e 74 6f 20 72 65 66 65 72 65 6e 63  ub into referenc
6b20: 65 73 20 74 6f 20 74 61 62 6c 65 20 69 54 61 62  es to table iTab
6b30: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
6b40: 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
6b50: 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
6b60: 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
6b70: 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
6b80: 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
6b90: 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
6ba0: 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
6bb0: 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
6bc0: 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
6bd0: 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
6be0: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
6bf0: 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
6c00: 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
6c10: 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
6c20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
6c30: 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  e the necessary 
6c40: 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
6c50: 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
6c60: 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
6c70: 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
6c80: 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
6c90: 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
6ca0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
6cb0: 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
6cc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
6cd0: 73 74 45 78 70 72 28 45 78 70 72 20 2a 70 45 78  stExpr(Expr *pEx
6ce0: 70 72 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  pr, int iTable, 
6cf0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
6d00: 2c 20 69 6e 74 20 69 53 75 62 29 7b 0a 20 20 69  , int iSub){.  i
6d10: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
6d20: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
6d30: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
6d40: 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
6d50: 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 45 78  e==iTable && pEx
6d60: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  pr->iColumn>=0 )
6d70: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
6d80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
6d90: 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72  List!=0 && pExpr
6da0: 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74  ->iColumn<pEList
6db0: 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 61  ->nExpr );.    a
6dc0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
6dd0: 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
6de0: 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45  >pRight==0 && pE
6df0: 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b  xpr->pList==0 );
6e00: 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69  .    pNew = pELi
6e10: 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f  st->a[pExpr->iCo
6e20: 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20  lumn].pExpr;.   
6e30: 20 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30   assert( pNew!=0
6e40: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f   );.    pExpr->o
6e50: 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20  p = pNew->op;.  
6e60: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
6e70: 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70   sqliteExprDup(p
6e80: 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  New->pLeft);.   
6e90: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
6ea0: 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70   sqliteExprDup(p
6eb0: 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  New->pRight);.  
6ec0: 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d    pExpr->pList =
6ed0: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
6ee0: 75 70 28 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b  up(pNew->pList);
6ef0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
6f00: 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c  le = pNew->iTabl
6f10: 65 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43  e;.    pExpr->iC
6f20: 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43  olumn = pNew->iC
6f30: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 45 78 70 72  olumn;.    pExpr
6f40: 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69  ->iAgg = pNew->i
6f50: 41 67 67 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  Agg;.    pExpr->
6f60: 74 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f  token = pNew->to
6f70: 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20 69 53 75  ken;.    if( iSu
6f80: 62 21 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  b!=iTable ){.   
6f90: 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28     changeTables(
6fa0: 70 45 78 70 72 2c 20 69 53 75 62 2c 20 69 54 61  pExpr, iSub, iTa
6fb0: 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ble);.    }.  }e
6fc0: 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
6fd0: 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
6fe0: 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74  st(ExprList*,int
6ff0: 2c 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74 29 3b  ,ExprList*,int);
7000: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
7010: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61  Expr->pLeft, iTa
7020: 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 69 53 75  ble, pEList, iSu
7030: 62 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  b);.    substExp
7040: 72 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  r(pExpr->pRight,
7050: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c   iTable, pEList,
7060: 20 69 53 75 62 29 3b 0a 20 20 20 20 73 75 62 73   iSub);.    subs
7070: 74 45 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d  tExprList(pExpr-
7080: 3e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20  >pList, iTable, 
7090: 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20  pEList, iSub);. 
70a0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
70b0: 20 0a 73 75 62 73 74 45 78 70 72 4c 69 73 74 28   .substExprList(
70c0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
70d0: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70   int iTable, Exp
70e0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 69  rList *pEList, i
70f0: 6e 74 20 69 53 75 62 29 7b 0a 20 20 69 6e 74 20  nt iSub){.  int 
7100: 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
7110: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
7120: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
7130: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
7140: 20 73 75 62 73 74 45 78 70 72 28 70 4c 69 73 74   substExpr(pList
7150: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54  ->a[i].pExpr, iT
7160: 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 69 53  able, pEList, iS
7170: 75 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ub);.  }.}../*.*
7180: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
7190: 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
71a0: 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  en subqueries in
71b0: 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a   order to speed.
71c0: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49  ** execution.  I
71d0: 74 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69  t returns 1 if i
71e0: 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20  t makes changes 
71f0: 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74  and 0 if no flat
7200: 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73  tening.** occurs
7210: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72  ..**.** To under
7220: 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70  stand the concep
7230: 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c  t of flattening,
7240: 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   consider the fo
7250: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79  llowing.** query
7260: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
7270: 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT a FROM (SELEC
7280: 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
7290: 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20  t1 WHERE z<100) 
72a0: 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  WHERE a>5.**.** 
72b0: 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20  The default way 
72c0: 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  of implementing 
72d0: 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f  this query is to
72e0: 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20   execute the.** 
72f0: 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61  subquery first a
7300: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
7310: 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72  ults in a tempor
7320: 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a  ary table, then.
7330: 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72  ** run the outer
7340: 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74   query on that t
7350: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
7360: 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74   This requires t
7370: 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65  wo.** passes ove
7380: 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72  r the data.  Fur
7390: 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73  thermore, becaus
73a0: 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
73b0: 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20  table.** has no 
73c0: 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45  indices, the WHE
73d0: 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  RE clause on the
73e0: 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
73f0: 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69  not be.** optimi
7400: 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  zed..**.** This 
7410: 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
7420: 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72   to rewrite quer
7430: 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20  ies such as the 
7440: 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20  above into.** a 
7450: 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65  single flat sele
7460: 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ct, like this:.*
7470: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
7480: 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
7490: 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44   WHERE z<100 AND
74a0: 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   a>5.**.** The c
74b0: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f  ode generated fo
74c0: 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63 61  r this simpifica
74d0: 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73  tion gives the s
74e0: 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75  ame result.** bu
74f0: 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63  t only has to sc
7500: 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65  an the data once
7510: 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69  .  And because i
7520: 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a  ndices might .**
7530: 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61   exist on the ta
7540: 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65  ble t1, a comple
7550: 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64  te scan of the d
7560: 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ata might be.** 
7570: 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  avoided..**.** F
7580: 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c  lattening is onl
7590: 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61  y attempted if a
75a0: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
75b0: 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
75c0: 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73  .**   (1)  The s
75d0: 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
75e0: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
75f0: 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72  ot both use aggr
7600: 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  egates..**.**   
7610: 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (2)  The subquer
7620: 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
7630: 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74  egate or the out
7640: 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
7650: 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
7660: 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (3)  The subquer
7670: 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
7680: 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68  .**.**   (4)  Th
7690: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
76a0: 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68  t DISTINCT or th
76b0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
76c0: 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
76d0: 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20 73 75  **   (5)  The su
76e0: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
76f0: 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75  STINCT or the ou
7700: 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
7710: 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
7720: 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
7730: 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75  **   (6)  The su
7740: 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
7750: 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
7760: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
7770: 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
7780: 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a     DISTINCT..**.
7790: 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
77a0: 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
77b0: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
77c0: 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
77d0: 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
77e0: 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
77f0: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
7800: 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
7810: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
7820: 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
7830: 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
7840: 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
7850: 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
7860: 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
7870: 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
7880: 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
7890: 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
78a0: 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
78b0: 65 74 75 72 6e 20 30 2e 0a 2a 2a 20 49 66 20 66  eturn 0..** If f
78c0: 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74  lattening is att
78d0: 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74  empted this rout
78e0: 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a  ine returns 1..*
78f0: 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
7900: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79  expression analy
7910: 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f  sis must occur o
7920: 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72  n both the outer
7930: 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68   query and.** th
7940: 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72  e subquery befor
7950: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  e this routine r
7960: 75 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 66 6c 61 74  uns..*/.int flat
7970: 74 65 6e 53 75 62 71 75 65 72 79 28 53 65 6c 65  tenSubquery(Sele
7980: 63 74 20 2a 70 2c 20 69 6e 74 20 69 46 72 6f 6d  ct *p, int iFrom
7990: 2c 20 69 6e 74 20 69 73 41 67 67 2c 20 69 6e 74  , int isAgg, int
79a0: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 29 7b   subqueryIsAgg){
79b0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
79c0: 0a 20 20 49 64 4c 69 73 74 20 2a 70 53 72 63 2c  .  IdList *pSrc,
79d0: 20 2a 70 53 75 62 53 72 63 3b 0a 20 20 45 78 70   *pSubSrc;.  Exp
79e0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20  rList *pList;.  
79f0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 50 61  int i;.  int iPa
7a00: 72 65 6e 74 2c 20 69 53 75 62 3b 0a 20 20 45 78  rent, iSub;.  Ex
7a10: 70 72 20 2a 70 57 68 65 72 65 3b 0a 0a 20 20 2f  pr *pWhere;..  /
7a20: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
7a30: 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
7a40: 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
7a50: 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
7a60: 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  /.  if( p==0 ) r
7a70: 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
7a80: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
7a90: 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72  ert( pSrc && iFr
7aa0: 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70  om>=0 && iFrom<p
7ab0: 53 72 63 2d 3e 6e 49 64 20 29 3b 0a 20 20 70 53  Src->nId );.  pS
7ac0: 75 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72  ub = pSrc->a[iFr
7ad0: 6f 6d 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 61  om].pSelect;.  a
7ae0: 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
7af0: 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  ;.  if( isAgg &&
7b00: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
7b10: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
7b20: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26   subqueryIsAgg &
7b30: 26 20 70 53 72 63 2d 3e 6e 49 64 3e 31 20 29 20  & pSrc->nId>1 ) 
7b40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 75 62  return 0;.  pSub
7b50: 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
7b60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
7b70: 53 72 63 20 29 3b 0a 20 20 69 66 28 20 70 53 75  Src );.  if( pSu
7b80: 62 53 72 63 2d 3e 6e 49 64 3e 31 20 29 20 72 65  bSrc->nId>1 ) re
7b90: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53  turn 0;.  if( pS
7ba0: 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26  ub->isDistinct &
7bb0: 26 20 70 53 72 63 2d 3e 6e 49 64 3e 31 20 29 20  & pSrc->nId>1 ) 
7bc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
7bd0: 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74  pSub->isDistinct
7be0: 20 26 26 20 69 73 41 67 67 20 29 20 72 65 74 75   && isAgg ) retu
7bf0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 69  rn 0;.  if( p->i
7c00: 73 44 69 73 74 69 6e 63 74 20 26 26 20 73 75 62  sDistinct && sub
7c10: 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74  queryIsAgg ) ret
7c20: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  urn 0;..  /* If 
7c30: 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
7c40: 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c  int, it means fl
7c50: 61 74 74 69 6e 67 20 69 73 20 70 65 72 6d 69 74  atting is permit
7c60: 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ted for the.  **
7c70: 20 69 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74   i-th entry of t
7c80: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
7c90: 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
7ca0: 79 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e  y..  */.  iParen
7cb0: 74 20 3d 20 70 2d 3e 62 61 73 65 20 2b 20 69 46  t = p->base + iF
7cc0: 72 6f 6d 3b 0a 20 20 69 53 75 62 20 3d 20 70 53  rom;.  iSub = pS
7cd0: 75 62 2d 3e 62 61 73 65 3b 0a 20 20 73 75 62 73  ub->base;.  subs
7ce0: 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  tExprList(p->pEL
7cf0: 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ist, iParent, pS
7d00: 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62  ub->pEList, iSub
7d10: 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e  );.  pList = p->
7d20: 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d  pEList;.  for(i=
7d30: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
7d40: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
7d50: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
7d60: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  me==0 ){.      E
7d70: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69  xpr *pExpr = pLi
7d80: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
7d90: 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
7da0: 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
7db0: 53 74 72 4e 44 75 70 28 70 45 78 70 72 2d 3e 73  StrNDup(pExpr->s
7dc0: 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70  pan.z, pExpr->sp
7dd0: 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  an.n);.    }.  }
7de0: 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a  .  if( isAgg ){.
7df0: 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
7e00: 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  t(p->pGroupBy, i
7e10: 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
7e20: 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 20  List, iSub);.   
7e30: 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48   substExpr(p->pH
7e40: 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
7e50: 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53  pSub->pEList, iS
7e60: 75 62 29 3b 0a 20 20 7d 0a 20 20 73 75 62 73 74  ub);.  }.  subst
7e70: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
7e80: 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  erBy, iParent, p
7e90: 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75  Sub->pEList, iSu
7ea0: 62 29 3b 0a 20 20 69 66 28 20 70 53 75 62 2d 3e  b);.  if( pSub->
7eb0: 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57  pWhere ){.    pW
7ec0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70  here = sqliteExp
7ed0: 72 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65 72  rDup(pSub->pWher
7ee0: 65 29 3b 0a 20 20 20 20 69 66 28 20 69 50 61 72  e);.    if( iPar
7ef0: 65 6e 74 21 3d 69 53 75 62 20 29 7b 0a 20 20 20  ent!=iSub ){.   
7f00: 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28     changeTables(
7f10: 70 57 68 65 72 65 2c 20 69 53 75 62 2c 20 69 50  pWhere, iSub, iP
7f20: 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
7f30: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65 72  }else{.    pWher
7f40: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
7f50: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
7f60: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
7f70: 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20  >pHaving==0 );. 
7f80: 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
7f90: 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70  p->pWhere;.    p
7fa0: 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
7fb0: 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e;.    substExpr
7fc0: 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  (p->pHaving, iPa
7fd0: 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
7fe0: 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 20 20 69  st, iSub);.    i
7ff0: 66 28 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  f( pSub->pHaving
8000: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
8010: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
8020: 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70 48  ExprDup(pSub->pH
8030: 61 76 69 6e 67 29 3b 0a 20 20 20 20 20 20 69 66  aving);.      if
8040: 28 20 69 50 61 72 65 6e 74 21 3d 69 53 75 62 20  ( iParent!=iSub 
8050: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 6e 67  ){.        chang
8060: 65 54 61 62 6c 65 73 28 70 48 61 76 69 6e 67 2c  eTables(pHaving,
8070: 20 69 53 75 62 2c 20 69 50 61 72 65 6e 74 29 3b   iSub, iParent);
8080: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8090: 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b  f( p->pHaving ){
80a0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 48 61 76  .        p->pHav
80b0: 69 6e 67 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ing = sqliteExpr
80c0: 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 48 61 76  (TK_AND, p->pHav
80d0: 69 6e 67 2c 20 70 48 61 76 69 6e 67 2c 20 30 29  ing, pHaving, 0)
80e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
80f0: 20 20 20 20 20 20 20 70 2d 3e 70 48 61 76 69 6e         p->pHavin
8100: 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20  g = pHaving;.   
8110: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
8120: 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
8130: 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  By==0 );.    p->
8140: 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
8150: 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 53 75  eExprListDup(pSu
8160: 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  b->pGroupBy);.  
8170: 20 20 69 66 28 20 69 50 61 72 65 6e 74 21 3d 69    if( iParent!=i
8180: 53 75 62 20 29 7b 0a 20 20 20 20 20 20 63 68 61  Sub ){.      cha
8190: 6e 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74 28  ngeTablesInList(
81a0: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 53 75  p->pGroupBy, iSu
81b0: 62 2c 20 69 50 61 72 65 6e 74 29 3b 0a 20 20 20  b, iParent);.   
81c0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
81d0: 2d 3e 70 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20  ->pWhere==0 ){. 
81e0: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70     p->pWhere = p
81f0: 57 68 65 72 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Where;.  }else{.
8200: 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d      substExpr(p-
8210: 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74  >pWhere, iParent
8220: 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20  , pSub->pEList, 
8230: 69 53 75 62 29 3b 0a 20 20 20 20 69 66 28 20 70  iSub);.    if( p
8240: 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70  Where ){.      p
8250: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
8260: 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70 2d  eExpr(TK_AND, p-
8270: 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 2c  >pWhere, pWhere,
8280: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
8290: 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d   p->isDistinct =
82a0: 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c   p->isDistinct |
82b0: 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e  | pSub->isDistin
82c0: 63 74 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  ct;.  if( pSrc->
82d0: 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 20 26 26  a[iFrom].pTab &&
82e0: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
82f0: 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e  pTab->isTransien
8300: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 44  t ){.    sqliteD
8310: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53  eleteTable(0, pS
8320: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61  rc->a[iFrom].pTa
8330: 62 29 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e  b);.  }.  pSrc->
8340: 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 20 3d 20  a[iFrom].pTab = 
8350: 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  pSubSrc->a[0].pT
8360: 61 62 3b 0a 20 20 70 53 75 62 53 72 63 2d 3e 61  ab;.  pSubSrc->a
8370: 5b 30 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20  [0].pTab = 0;.  
8380: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70  pSrc->a[iFrom].p
8390: 53 65 6c 65 63 74 20 3d 20 70 53 75 62 53 72 63  Select = pSubSrc
83a0: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[0].pSelect;.
83b0: 20 20 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e    pSubSrc->a[0].
83c0: 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73  pSelect = 0;.  s
83d0: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
83e0: 65 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72  e(pSub);.  retur
83f0: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 1;.}../*.** An
8400: 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54  alyze the SELECT
8410: 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
8420: 64 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d  d in as an argum
8430: 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74  ent to see if it
8440: 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20  .** is a simple 
8450: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
8460: 75 65 72 79 2e 20 20 49 66 20 69 74 20 69 73 20  uery.  If it is 
8470: 61 6e 64 20 74 68 69 73 20 71 75 65 72 79 20 63  and this query c
8480: 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69  an be.** satisfi
8490: 65 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  ed using a singl
84a0: 65 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65  e seek to the be
84b0: 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f  ginning or end o
84c0: 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74  f an index,.** t
84d0: 68 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65  hen generate the
84e0: 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53   code for this S
84f0: 45 4c 45 43 54 20 72 65 74 75 72 6e 20 31 2e 20  ELECT return 1. 
8500: 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
8510: 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e  a .** simple min
8520: 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
8530: 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30  y, then return 0
8540: 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79  ;.**.** A simply
8550: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
8560: 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65  query looks like
8570: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
8580: 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52  SELECT min(a) FR
8590: 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20  OM table;.**    
85a0: 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52  SELECT max(a) FR
85b0: 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20  OM table;.**.** 
85c0: 54 68 65 20 71 75 65 72 79 20 6d 61 79 20 68 61  The query may ha
85d0: 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ve only a single
85e0: 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52   table in its FR
85f0: 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  OM argument.  Th
8600: 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f  ere.** can be no
8610: 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56   GROUP BY or HAV
8620: 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61  ING or WHERE cla
8630: 75 73 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c  uses.  The resul
8640: 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65  t set must.** be
8650: 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
8660: 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  x() of a single 
8670: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
8680: 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ble.  The column
8690: 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29  .** in the min()
86a0: 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
86b0: 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78  on must be index
86c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ed..**.** The pa
86d0: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73  rameters to this
86e0: 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65   routine are the
86f0: 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c   same as for sql
8700: 69 74 65 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20  iteSelect()..** 
8710: 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  See the header c
8720: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72  omment on that r
8730: 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
8740: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
8750: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
8760: 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65   simpleMinMaxQue
8770: 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ry(Parse *pParse
8780: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
8790: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
87a0: 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  m){.  Expr *pExp
87b0: 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  r;.  int iCol;. 
87c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
87d0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
87e0: 6e 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20  nt base;.  Vdbe 
87f0: 2a 76 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 4f 70  *v;.  int openOp
8800: 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a  ;.  int seekOp;.
8810: 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20 20 45 78    int cont;.  Ex
8820: 70 72 4c 69 73 74 20 65 4c 69 73 74 3b 0a 20 20  prList eList;.  
8830: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
8840: 69 74 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a  item eListItem;.
8850: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
8860: 65 65 20 69 66 20 74 68 69 73 20 71 75 65 72 79  ee if this query
8870: 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e   is a simple min
8880: 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
8890: 79 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20  y.  Return.  ** 
88a0: 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20 20 6e  zero if it is  n
88b0: 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ot..  */.  if( p
88c0: 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d  ->pGroupBy || p-
88d0: 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70  >pHaving || p->p
88e0: 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
88f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 2d  ;.  if( p->pSrc-
8900: 3e 6e 49 64 21 3d 31 20 29 20 72 65 74 75 72 6e  >nId!=1 ) return
8910: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   0;.  if( p->pEL
8920: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
8930: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70  return 0;.  pExp
8940: 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
8950: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
8960: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
8970: 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65  GG_FUNCTION ) re
8980: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
8990: 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c  xpr->pList==0 ||
89a0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e   pExpr->pList->n
89b0: 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
89c0: 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
89d0: 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65  >token.n!=3 ) re
89e0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71  turn 0;.  if( sq
89f0: 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70 45 78  liteStrNICmp(pEx
8a00: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e  pr->token.z,"min
8a10: 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ",3)==0 ){.    s
8a20: 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e  eekOp = OP_Rewin
8a30: 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  d;.  }else if( s
8a40: 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70 45  qliteStrNICmp(pE
8a50: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61  xpr->token.z,"ma
8a60: 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  x",3)==0 ){.    
8a70: 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74  seekOp = OP_Last
8a80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
8a90: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
8aa0: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Expr = pExpr->pL
8ab0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
8ac0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
8ad0: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
8ae0: 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d  turn 0;.  iCol =
8af0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
8b00: 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  .  pTab = p->pSr
8b10: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20  c->a[0].pTab;.. 
8b20: 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f   /* If we get to
8b30: 20 68 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20   here, it means 
8b40: 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20  the query is of 
8b50: 74 68 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d  the correct form
8b60: 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ..  ** Check to 
8b70: 6d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  make sure we hav
8b80: 65 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d  e an index and m
8b90: 61 6b 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74  ake pIdx point t
8ba0: 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f  o the.  ** appro
8bb0: 70 72 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49  priate index.  I
8bc0: 66 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d  f the min() or m
8bd0: 61 78 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e  ax() is on an IN
8be0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20  TEGER PRIMARY.  
8bf0: 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e  ** key column, n
8c00: 6f 20 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73  o index is neces
8c10: 73 61 72 79 20 73 6f 20 73 65 74 20 70 49 64 78  sary so set pIdx
8c20: 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f   to NULL.  If no
8c30: 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64  .  ** usable ind
8c40: 65 78 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74  ex is found, ret
8c50: 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  urn 0..  */.  if
8c60: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
8c70: 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  pIdx = 0;.  }els
8c80: 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  e{.    for(pIdx=
8c90: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
8ca0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
8cb0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
8cc0: 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
8cd0: 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  mn>=1 );.      i
8ce0: 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
8cf0: 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 29 20 62 72 65  n[0]==iCol ) bre
8d00: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
8d10: 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75  ( pIdx==0 ) retu
8d20: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
8d30: 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
8d40: 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c  names if we will
8d50: 20 62 65 20 75 73 69 6e 67 20 74 68 65 20 63 61   be using the ca
8d60: 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
8d70: 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
8d80: 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
8d90: 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74   is going to a t
8da0: 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79  able or a memory
8db0: 20 63 65 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 76 20   cell..  */.  v 
8dc0: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
8dd0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
8de0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8df0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
8e00: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
8e10: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
8e20: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e  ames(pParse, p->
8e30: 62 61 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20 70  base, p->pSrc, p
8e40: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  ->pEList);.  }..
8e50: 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20    /* Generating 
8e60: 63 6f 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65  code to find the
8e70: 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e   min or the max.
8e80: 20 20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20    Basically all 
8e90: 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20  we have.  ** to 
8ea0: 64 6f 20 69 73 20 66 69 6e 64 20 74 68 65 20 66  do is find the f
8eb0: 69 72 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74  irst or the last
8ec0: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68   entry in the ch
8ed0: 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a  osen index.  If.
8ee0: 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f    ** the min() o
8ef0: 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68  r max() is on th
8f00: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
8f10: 59 20 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64  Y KEY, then find
8f20: 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
8f30: 6f 72 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  or last entry in
8f40: 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
8f50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
8f60: 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66  rse->schemaVerif
8f70: 69 65 64 20 26 26 20 28 70 50 61 72 73 65 2d 3e  ied && (pParse->
8f80: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
8f90: 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29  TE_InTrans)==0 )
8fa0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
8fb0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69  AddOp(v, OP_Veri
8fc0: 66 79 43 6f 6f 6b 69 65 2c 20 70 50 61 72 73 65  fyCookie, pParse
8fd0: 2d 3e 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  ->db->schema_coo
8fe0: 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  kie, 0);.    pPa
8ff0: 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66  rse->schemaVerif
9000: 69 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6f  ied = 1;.  }.  o
9010: 70 65 6e 4f 70 20 3d 20 70 54 61 62 2d 3e 69 73  penOp = pTab->is
9020: 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 41 75  Temp ? OP_OpenAu
9030: 78 20 3a 20 4f 50 5f 4f 70 65 6e 3b 0a 20 20 62  x : OP_Open;.  b
9040: 61 73 65 20 3d 20 70 2d 3e 62 61 73 65 3b 0a 20  ase = p->base;. 
9050: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
9060: 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 62 61 73 65  (v, openOp, base
9070: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20  , pTab->tnum);. 
9080: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
9090: 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d  eP3(v, -1, pTab-
90a0: 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49  >zName, P3_STATI
90b0: 43 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d  C);.  if( pIdx==
90c0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  0 ){.    sqliteV
90d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b  dbeAddOp(v, seek
90e0: 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  Op, base, 0);.  
90f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
9100: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
9110: 65 6e 4f 70 2c 20 62 61 73 65 2b 31 2c 20 70 49  enOp, base+1, pI
9120: 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73  dx->tnum);.    s
9130: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
9140: 33 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a  3(v, -1, pIdx->z
9150: 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
9160: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
9170: 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c  AddOp(v, seekOp,
9180: 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20   base+1, 0);.   
9190: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
91a0: 28 76 2c 20 4f 50 5f 49 64 78 52 65 63 6e 6f 2c  (v, OP_IdxRecno,
91b0: 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20   base+1, 0);.   
91c0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
91d0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61  (v, OP_Close, ba
91e0: 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  se+1, 0);.    sq
91f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9200: 20 4f 50 5f 4d 6f 76 65 54 6f 2c 20 62 61 73 65   OP_MoveTo, base
9210: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73  , 0);.  }.  eLis
9220: 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d  t.nExpr = 1;.  m
9230: 65 6d 73 65 74 28 26 65 4c 69 73 74 49 74 65 6d  emset(&eListItem
9240: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73  , 0, sizeof(eLis
9250: 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74  tItem));.  eList
9260: 2e 61 20 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b  .a = &eListItem;
9270: 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45  .  eList.a[0].pE
9280: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 63  xpr = pExpr;.  c
9290: 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ont = sqliteVdbe
92a0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
92b0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
92c0: 70 50 61 72 73 65 2c 20 26 65 4c 69 73 74 2c 20  pParse, &eList, 
92d0: 62 61 73 65 2c 20 31 2c 20 30 2c 20 2d 31 2c 20  base, 1, 0, -1, 
92e0: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 63 6f  eDest, iParm, co
92f0: 6e 74 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c  nt, cont);.  sql
9300: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
9310: 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20  bel(v, cont);.  
9320: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9330: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73  v, OP_Close, bas
9340: 65 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  e, 0);.  return 
9350: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  1;.}../*.** Gene
9360: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
9370: 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73  e given SELECT s
9380: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
9390: 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
93a0: 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76  distributed in v
93b0: 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65  arious ways depe
93c0: 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20  nding on the.** 
93d0: 76 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61  value of eDest a
93e0: 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  nd iParm..**.** 
93f0: 20 20 20 20 65 44 65 73 74 20 56 61 6c 75 65 20      eDest Value 
9400: 20 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20        Result.** 
9410: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
9420: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
9430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
9450: 2a 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62  **     SRT_Callb
9460: 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68  ack    Invoke th
9470: 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65  e callback for e
9480: 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72  ach row of the r
9490: 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  esult..**.**    
94a0: 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20   SRT_Mem        
94b0: 20 53 74 6f 72 65 20 66 69 72 73 74 20 72 65 73   Store first res
94c0: 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  ult in memory ce
94d0: 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  ll iParm.**.**  
94e0: 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20     SRT_Set      
94f0: 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
9500: 20 61 73 20 6b 65 79 73 20 6f 66 20 61 20 74 61   as keys of a ta
9510: 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20  ble with cursor 
9520: 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iParm.**.**     
9530: 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20  SRT_Union       
9540: 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73  Store results as
9550: 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70   a key in a temp
9560: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
9570: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
9580: 45 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f  Except      Remo
9590: 76 65 20 72 65 73 75 6c 74 73 20 66 6f 72 6d 20  ve results form 
95a0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
95b0: 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ble iParm..**.**
95c0: 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20       SRT_Table  
95d0: 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
95e0: 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  ts in temporary 
95f0: 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a  table iParm.**.*
9600: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
9610: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
9620: 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
9630: 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
9640: 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
9650: 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
9660: 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
9670: 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
9680: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
9690: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
96a0: 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
96b0: 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
96c0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
96d0: 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
96e0: 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
96f0: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a   to do that..**.
9700: 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20  ** The pParent, 
9710: 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a  parentTab, and *
9720: 70 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64  pParentAgg field
9730: 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20  s are filled in 
9740: 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43  if this.** SELEC
9750: 54 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2e  T is a subquery.
9760: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
9770: 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e  ay try to combin
9780: 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a  e this SELECT.**
9790: 20 77 69 74 68 20 69 74 73 20 70 61 72 65 6e 74   with its parent
97a0: 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c   to form a singl
97b0: 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49  e flat query.  I
97c0: 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d  n so doing, it m
97d0: 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74  ight.** change t
97e0: 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
97f0: 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65  from a non-aggre
9800: 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65  gate to an aggre
9810: 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46  gate query..** F
9820: 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  or that reason, 
9830: 74 68 65 20 70 50 61 72 65 6e 74 41 67 67 20 66  the pParentAgg f
9840: 6c 61 67 20 69 73 20 70 61 73 73 65 64 20 61 73  lag is passed as
9850: 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69   a pointer, so i
9860: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e  t.** can be chan
9870: 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
9880: 74 65 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  teSelect(.  Pars
9890: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
98a0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
98b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
98c0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
98d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
98e0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
98f0: 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69  ng coded. */.  i
9900: 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20  nt eDest,       
9910: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 3a        /* One of:
9920: 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 4d 65   SRT_Callback Me
9930: 6d 20 53 65 74 20 55 6e 69 6f 6e 20 45 78 63 65  m Set Union Exce
9940: 70 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  pt */.  int iPar
9950: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m,             /
9960: 2a 20 53 61 76 65 20 72 65 73 75 6c 74 20 69 6e  * Save result in
9970: 20 74 68 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63   this memory loc
9980: 61 74 69 6f 6e 2c 20 69 66 20 3e 3d 30 20 2a 2f  ation, if >=0 */
9990: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65  .  Select *pPare
99a0: 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  nt,       /* Ano
99b0: 74 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20  ther SELECT for 
99c0: 77 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20  which this is a 
99d0: 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69  sub-query */.  i
99e0: 6e 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20  nt parentTab,   
99f0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
9a00: 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20  n pParent->pSrc 
9a10: 6f 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  of this query */
9a20: 0a 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41  .  int *pParentA
9a30: 67 67 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  gg        /* Tru
9a40: 65 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65  e if pParent use
9a50: 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
9a60: 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tions */.){.  in
9a70: 74 20 69 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f  t i;.  WhereInfo
9a80: 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65   *pWInfo;.  Vdbe
9a90: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 73 41 67 67   *v;.  int isAgg
9aa0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
9ab0: 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
9ac0: 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
9ad0: 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
9ae0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
9af0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
9b00: 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
9b10: 2e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  . */.  IdList *p
9b20: 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a  TabList;      /*
9b30: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
9b40: 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
9b50: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
9b60: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
9b70: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
9b80: 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
9b90: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
9ba0: 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  erBy;    /* The 
9bb0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
9bc0: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
9bd0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
9be0: 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  oupBy;    /* The
9bf0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
9c00: 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
9c10: 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
9c20: 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g;         /* Th
9c30: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
9c40: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
9c50: 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  .  int isDistinc
9c60: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
9c70: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
9c80: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
9c90: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69  sent */.  int di
9ca0: 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
9cb0: 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65   /* Table to use
9cc0: 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
9cd0: 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 62  t set */.  int b
9ce0: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
9cf0: 20 20 2f 2a 20 46 69 72 73 74 20 63 75 72 73 6f    /* First curso
9d00: 72 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  r available for 
9d10: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  use */.  int rc 
9d20: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
9d30: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
9d40: 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  rn from this fun
9d50: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20  ction */..  if( 
9d60: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
9d70: 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
9d80: 6e 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72  nErr || p==0 ) r
9d90: 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49  eturn 1;..  /* I
9da0: 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61  f there is are a
9db0: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65   sequence of que
9dc0: 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72  ries, do the ear
9dd0: 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e  lier ones first.
9de0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
9df0: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  Prior ){.    ret
9e00: 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  urn multiSelect(
9e10: 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
9e20: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20  , iParm);.  }.. 
9e30: 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63   /* Make local c
9e40: 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72  opies of the par
9e50: 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73  ameters for this
9e60: 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
9e70: 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
9e80: 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  c;.  pWhere = p-
9e90: 3e 70 57 68 65 72 65 3b 0a 20 20 70 4f 72 64 65  >pWhere;.  pOrde
9ea0: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
9eb0: 79 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20  y;.  pGroupBy = 
9ec0: 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70  p->pGroupBy;.  p
9ed0: 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
9ee0: 69 6e 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63  ing;.  isDistinc
9ef0: 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
9f00: 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  t;..  /* Allocat
9f10: 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 56 44 42  e a block of VDB
9f20: 45 20 63 75 72 73 6f 72 73 2c 20 6f 6e 65 20 66  E cursors, one f
9f30: 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
9f40: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9f50: 2e 0a 20 20 2a 2a 20 54 68 65 20 57 48 45 52 45  ..  ** The WHERE
9f60: 20 70 72 6f 63 65 73 73 69 6e 67 20 72 65 71 75   processing requ
9f70: 69 72 65 73 20 74 68 61 74 20 74 68 65 20 63 75  ires that the cu
9f80: 72 73 6f 72 73 20 66 6f 72 20 74 68 65 20 74 61  rsors for the ta
9f90: 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a  bles in the.  **
9fa0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 65 20   FROM clause be 
9fb0: 63 6f 6e 73 65 63 75 74 69 76 65 2e 0a 20 20 2a  consecutive..  *
9fc0: 2f 0a 20 20 62 61 73 65 20 3d 20 70 2d 3e 62 61  /.  base = p->ba
9fd0: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  se = pParse->nTa
9fe0: 62 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  b;.  pParse->nTa
9ff0: 62 20 2b 3d 20 70 54 61 62 4c 69 73 74 2d 3e 6e  b += pTabList->n
a000: 49 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  Id;..  /* .  ** 
a010: 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65  Do not even atte
a020: 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20  mpt to generate 
a030: 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68  any code if we h
a040: 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e  ave already seen
a050: 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66  .  ** errors bef
a060: 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
a070: 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20   starts..  */.  
a080: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
a090: 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  >0 ) goto select
a0a0: 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  _end;..  /* Look
a0b0: 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20   up every table 
a0c0: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69 73  in the table lis
a0d0: 74 20 61 6e 64 20 63 72 65 61 74 65 20 61 6e 20  t and create an 
a0e0: 61 70 70 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a  appropriate.  **
a0f0: 20 63 6f 6c 75 6d 6e 6c 69 73 74 20 69 6e 20 70   columnlist in p
a100: 45 4c 69 73 74 20 69 66 20 74 68 65 72 65 20 69  EList if there i
a110: 73 6e 27 74 20 6f 6e 65 20 61 6c 72 65 61 64 79  sn't one already
a120: 2e 20 20 28 54 68 65 20 70 61 72 73 65 72 20 6c  .  (The parser l
a130: 65 61 76 65 73 0a 20 20 2a 2a 20 61 20 4e 55 4c  eaves.  ** a NUL
a140: 4c 20 69 6e 20 74 68 65 20 70 2d 3e 70 45 4c 69  L in the p->pELi
a150: 73 74 20 69 66 20 74 68 65 20 53 51 4c 20 73 61  st if the SQL sa
a160: 69 64 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  id "SELECT * FRO
a170: 4d 20 2e 2e 2e 22 29 0a 20 20 2a 2f 0a 20 20 69  M ...").  */.  i
a180: 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  f( fillInColumnL
a190: 69 73 74 28 70 50 61 72 73 65 2c 20 70 29 20 29  ist(pParse, p) )
a1a0: 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
a1b0: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 45 4c  t_end;.  }.  pEL
a1c0: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
a1d0: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
a1e0: 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
a1f0: 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69  nd;..  /* If wri
a200: 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ting to memory o
a210: 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73  r generating a s
a220: 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73  et.  ** only a s
a230: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79  ingle column may
a240: 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
a250: 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d 53  .  if( (eDest==S
a260: 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d  RT_Mem || eDest=
a270: 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70 45 4c  =SRT_Set) && pEL
a280: 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b 0a  ist->nExpr>1 ){.
a290: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
a2a0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
a2b0: 72 4d 73 67 2c 20 22 6f 6e 6c 79 20 61 20 73 69  rMsg, "only a si
a2c0: 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f  ngle result allo
a2d0: 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20  wed for ".      
a2e0: 20 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20   "a SELECT that 
a2f0: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
a300: 70 72 65 73 73 69 6f 6e 22 2c 20 30 29 3b 0a 20  pression", 0);. 
a310: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
a320: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  +;.    goto sele
a330: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
a340: 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20 69 67  * ORDER BY is ig
a350: 6e 6f 72 65 64 20 69 66 20 77 65 20 61 72 65 20  nored if we are 
a360: 6e 6f 74 20 73 65 6e 64 69 6e 67 20 74 68 65 20  not sending the 
a370: 72 65 73 75 6c 74 20 74 6f 20 61 20 63 61 6c 6c  result to a call
a380: 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  back..  */.  if(
a390: 20 65 44 65 73 74 21 3d 53 52 54 5f 43 61 6c 6c   eDest!=SRT_Call
a3a0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 70 4f 72 64  back ){.    pOrd
a3b0: 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erBy = 0;.  }.. 
a3c0: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
a3d0: 74 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61 76  t, we should hav
a3e0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6c 20  e allocated all 
a3f0: 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
a400: 20 77 65 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f   we.  ** need to
a410: 20 68 61 6e 64 6c 65 20 73 75 62 71 75 65 72 79   handle subquery
a420: 73 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20  s and temporary 
a430: 74 61 62 6c 65 73 2e 20 20 0a 20 20 2a 2a 0a 20  tables.  .  **. 
a440: 20 2a 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20   ** Resolve the 
a450: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
a460: 20 64 6f 20 61 20 73 65 6d 61 6e 74 69 63 73 20   do a semantics 
a470: 63 68 65 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 65  check on all the
a480: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
a490: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
a4a0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
a4b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
a4c0: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
a4d0: 73 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20  s(pParse, base, 
a4e0: 70 54 61 62 4c 69 73 74 2c 20 30 2c 20 70 45 4c  pTabList, 0, pEL
a4f0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
a500: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
a510: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
a520: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
a530: 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
a540: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
a550: 78 70 72 2c 20 31 2c 20 26 69 73 41 67 67 29 20  xpr, 1, &isAgg) 
a560: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
a570: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
a580: 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65 72 65    }.  if( pWhere
a590: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
a5a0: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  teExprResolveIds
a5b0: 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 70  (pParse, base, p
a5c0: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  TabList, pEList,
a5d0: 20 70 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20   pWhere) ){.    
a5e0: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
a5f0: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
a600: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
a610: 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c  (pParse, pWhere,
a620: 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   0, 0) ){.      
a630: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
a640: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
a650: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
a660: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
a670: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
a680: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
a690: 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
a6a0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
a6b0: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49 73  if( sqliteExprIs
a6c0: 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b 0a  Constant(pE) ){.
a6d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
a6e0: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
a6f0: 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20 20 20  >zErrMsg, .     
a700: 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
a710: 59 20 65 78 70 72 65 73 73 69 6f 6e 73 20 73 68  Y expressions sh
a720: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6f 6e 73  ould not be cons
a730: 74 61 6e 74 22 2c 20 30 29 3b 0a 20 20 20 20 20  tant", 0);.     
a740: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
a750: 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  +;.        goto 
a760: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
a770: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
a780: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
a790: 64 73 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c  ds(pParse, base,
a7a0: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
a7b0: 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20  t, pE) ){.      
a7c0: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
a7d0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
a7e0: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43   if( sqliteExprC
a7f0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c  heck(pParse, pE,
a800: 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20   isAgg, 0) ){.  
a810: 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
a820: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
a830: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
a840: 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 66  GroupBy ){.    f
a850: 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70  or(i=0; i<pGroup
a860: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
a870: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
a880: 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  = pGroupBy->a[i]
a890: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
a8a0: 28 20 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f  ( sqliteExprIsCo
a8b0: 6e 73 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20  nstant(pE) ){.  
a8c0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
a8d0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
a8e0: 45 72 72 4d 73 67 2c 20 0a 20 20 20 20 20 20 20  ErrMsg, .       
a8f0: 20 20 20 20 20 20 22 47 52 4f 55 50 20 42 59 20        "GROUP BY 
a900: 65 78 70 72 65 73 73 69 6f 6e 73 20 73 68 6f 75  expressions shou
a910: 6c 64 20 6e 6f 74 20 62 65 20 63 6f 6e 73 74 61  ld not be consta
a920: 6e 74 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  nt", 0);.       
a930: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
a940: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
a950: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
a960: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
a970: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  teExprResolveIds
a980: 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 70  (pParse, base, p
a990: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  TabList, pEList,
a9a0: 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pE) ){.        
a9b0: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
a9c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a9d0: 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
a9e0: 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69  ck(pParse, pE, i
a9f0: 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20  sAgg, 0) ){.    
aa00: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
aa10: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
aa20: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 48 61   }.  }.  if( pHa
aa30: 76 69 6e 67 20 29 7b 0a 20 20 20 20 69 66 28 20  ving ){.    if( 
aa40: 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
aa50: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
aa60: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
aa70: 72 72 4d 73 67 2c 20 22 61 20 47 52 4f 55 50 20  rrMsg, "a GROUP 
aa80: 42 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  BY clause is req
aa90: 75 69 72 65 64 20 22 0a 20 20 20 20 20 20 20 20  uired ".        
aaa0: 20 22 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22   "before HAVING"
aab0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
aac0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
aad0: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
aae0: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
aaf0: 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
ab00: 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 62 61  veIds(pParse, ba
ab10: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
ab20: 4c 69 73 74 2c 20 70 48 61 76 69 6e 67 29 20 29  List, pHaving) )
ab30: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
ab40: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
ab50: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
ab60: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
ab70: 48 61 76 69 6e 67 2c 20 69 73 41 67 67 2c 20 30  Having, isAgg, 0
ab80: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
ab90: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
aba0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
abb0: 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 61  k for the specia
abc0: 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e 28  l case of a min(
abd0: 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74  ) or max() funct
abe0: 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20 20  ion by itself.  
abf0: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
ac00: 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
ac10: 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65   simpleMinMaxQue
ac20: 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44  ry(pParse, p, eD
ac30: 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a 20  est, iParm) ){. 
ac40: 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 67     rc = 0;.    g
ac50: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
ac60: 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
ac70: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
ac80: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
ac90: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
aca0: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
acb0: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
acc0: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
acd0: 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
ace0: 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
acf0: 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
ad00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
ad10: 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  abList->nId; i++
ad20: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c  ){.    if( pTabL
ad30: 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
ad40: 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
ad50: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63  .    sqliteSelec
ad60: 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  t(pParse, pTabLi
ad70: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
ad80: 2c 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 2c  , SRT_TempTable,
ad90: 20 62 61 73 65 2b 69 2c 0a 20 20 20 20 20 20 20   base+i,.       
ada0: 20 20 20 20 20 20 20 20 20 20 70 2c 20 69 2c 20            p, i, 
adb0: 26 69 73 41 67 67 29 3b 0a 20 20 20 20 70 54 61  &isAgg);.    pTa
adc0: 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
add0: 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d  .    pWhere = p-
ade0: 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28  >pWhere;.    if(
adf0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
ae00: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 70 4f  back ){.      pO
ae10: 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
ae20: 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  erBy;.    }.    
ae30: 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
ae40: 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61 76  roupBy;.    pHav
ae50: 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67  ing = p->pHaving
ae60: 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63 74  ;.    isDistinct
ae70: 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
ae80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
ae90: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  k to see if this
aea0: 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74   is a subquery t
aeb0: 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74  hat can be "flat
aec0: 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20  tened" into its 
aed0: 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  parent..  ** If 
aee0: 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20  flattening is a 
aef0: 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73  possiblity, do s
af00: 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  o and return imm
af10: 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f  ediately.  .  */
af20: 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 26  .  if( pParent &
af30: 26 20 70 50 61 72 65 6e 74 41 67 67 20 26 26 0a  & pParentAgg &&.
af40: 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75 62        flattenSub
af50: 71 75 65 72 79 28 70 50 61 72 65 6e 74 2c 20 70  query(pParent, p
af60: 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72 65  arentTab, *pPare
af70: 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20 29 7b  ntAgg, isAgg) ){
af80: 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29  .    if( isAgg )
af90: 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20 31   *pParentAgg = 1
afa0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
afb0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
afc0: 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74  e output is dest
afd0: 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f  ined for a tempo
afe0: 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e  rary table, open
aff0: 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a   that table..  *
b000: 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
b010: 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a  RT_TempTable ){.
b020: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b030: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
b040: 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  mp, iParm, 0);. 
b050: 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e 20 61   }..  /* Do an a
b060: 6e 61 6c 79 73 69 73 20 6f 66 20 61 67 67 72 65  nalysis of aggre
b070: 67 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  gate expressions
b080: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 41  ..  */.  sqliteA
b090: 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65  ggregateInfoRese
b0a0: 74 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  t(pParse);.  if(
b0b0: 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73   isAgg ){.    as
b0c0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 41  sert( pParse->nA
b0d0: 67 67 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  gg==0 );.    for
b0e0: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
b0f0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
b100: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
b110: 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
b120: 65 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  es(pParse, pELis
b130: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
b140: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
b150: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
b160: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
b170: 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
b180: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47     for(i=0; i<pG
b190: 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
b1a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
b1b0: 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79   sqliteExprAnaly
b1c0: 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61  zeAggregates(pPa
b1d0: 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
b1e0: 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
b1f0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
b200: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
b210: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
b220: 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
b230: 20 26 26 20 73 71 6c 69 74 65 45 78 70 72 41 6e   && sqliteExprAn
b240: 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
b250: 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 29  pParse, pHaving)
b260: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
b270: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
b280: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
b290: 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  y ){.      for(i
b2a0: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
b2b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
b2c0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
b2d0: 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
b2e0: 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 4f 72  ates(pParse, pOr
b2f0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
b300: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
b310: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
b320: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b330: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
b340: 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
b350: 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  er.  */.  if( p-
b360: 3e 6e 4c 69 6d 69 74 3c 3d 30 20 29 7b 0a 20 20  >nLimit<=0 ){.  
b370: 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30    p->nOffset = 0
b380: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
b390: 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3c 30 20  f( p->nOffset<0 
b3a0: 29 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30  ) p->nOffset = 0
b3b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
b3c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 69 6d 69  AddOp(v, OP_Limi
b3d0: 74 2c 20 70 2d 3e 6e 4c 69 6d 69 74 2c 20 70 2d  t, p->nLimit, p-
b3e0: 3e 6e 4f 66 66 73 65 74 29 3b 0a 20 20 7d 0a 20  >nOffset);.  }. 
b3f0: 20 20 20 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69     ..  /* Identi
b400: 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
b410: 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
b420: 69 6e 67 20 69 6e 20 74 68 65 20 63 61 6c 6c 62  ing in the callb
b430: 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ack.  This.  ** 
b440: 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20  step is skipped 
b450: 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  if the output is
b460: 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c   going to a tabl
b470: 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65  e or a memory ce
b480: 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ll..  */.  if( e
b490: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
b4a0: 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ck ){.    genera
b4b0: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
b4c0: 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 70  arse, p->base, p
b4d0: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
b4e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65  ;.  }..  /* Rese
b4f0: 74 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  t the aggregator
b500: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67  .  */.  if( isAg
b510: 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  g ){.    sqliteV
b520: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
b530: 67 67 52 65 73 65 74 2c 20 30 2c 20 70 50 61 72  ggReset, 0, pPar
b540: 73 65 2d 3e 6e 41 67 67 29 3b 0a 20 20 20 20 66  se->nAgg);.    f
b550: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
b560: 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAgg; i++){.  
b570: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75      FuncDef *pFu
b580: 6e 63 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  nc;.      if( (p
b590: 46 75 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 61  Func = pParse->a
b5a0: 41 67 67 5b 69 5d 2e 70 46 75 6e 63 29 21 3d 30  Agg[i].pFunc)!=0
b5b0: 20 26 26 20 70 46 75 6e 63 2d 3e 78 46 69 6e 61   && pFunc->xFina
b5c0: 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  lize!=0 ){.     
b5d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b5e0: 4f 70 28 76 2c 20 4f 50 5f 41 67 67 49 6e 69 74  Op(v, OP_AggInit
b5f0: 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  , 0, i);.       
b600: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
b610: 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP3(v, -1, (char
b620: 2a 29 70 46 75 6e 63 2c 20 50 33 5f 50 4f 49 4e  *)pFunc, P3_POIN
b630: 54 45 52 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TER);.      }.  
b640: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72 6f    }.    if( pGro
b650: 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  upBy==0 ){.     
b660: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b670: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
b680: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
b690: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b6a0: 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 30  P_AggFocus, 0, 0
b6b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
b6c0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
b6d0: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  e memory cell to
b6e0: 20 4e 55 4c 4c 0a 20 20 2a 2f 0a 20 20 69 66 28   NULL.  */.  if(
b6f0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20   eDest==SRT_Mem 
b700: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
b710: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
b720: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
b730: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
b740: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
b750: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a  iParm, 1);.  }..
b760: 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70    /* Open a temp
b770: 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 75  orary table to u
b780: 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
b790: 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
b7a0: 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29  if( isDistinct )
b7b0: 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  {.    distinct =
b7c0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
b7d0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
b7e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
b7f0: 65 6d 70 2c 20 64 69 73 74 69 6e 63 74 2c 20 31  emp, distinct, 1
b800: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b810: 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  distinct = -1;. 
b820: 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 74   }..  /* Begin t
b830: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
b840: 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d  .  */.  pWInfo =
b850: 20 73 71 6c 69 74 65 57 68 65 72 65 42 65 67 69   sqliteWhereBegi
b860: 6e 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73  n(pParse, p->bas
b870: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
b880: 65 72 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ere, 0);.  if( p
b890: 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
b8a0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
b8b0: 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
b8c0: 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 66  rd inner loop if
b8d0: 20 77 65 20 61 72 65 20 6e 6f 74 20 64 65 61 6c   we are not deal
b8e0: 69 6e 67 20 77 69 74 68 0a 20 20 2a 2a 20 61 67  ing with.  ** ag
b8f0: 67 72 65 67 61 74 65 73 0a 20 20 2a 2f 0a 20 20  gregates.  */.  
b900: 69 66 28 20 21 69 73 41 67 67 20 29 7b 0a 20 20  if( !isAgg ){.  
b910: 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65    if( selectInne
b920: 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 45  rLoop(pParse, pE
b930: 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64  List, 0, 0, pOrd
b940: 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20  erBy, distinct, 
b950: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 0a 20 20  eDest, iParm,.  
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69    pWInfo->iConti
b980: 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  nue, pWInfo->iBr
b990: 65 61 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 67  eak) ){.       g
b9a0: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
b9b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
b9c0: 49 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  If we are dealin
b9d0: 67 20 77 69 74 68 20 61 67 67 72 65 67 61 74 65  g with aggregate
b9e0: 73 2c 20 74 68 65 6e 20 74 6f 20 74 68 65 20 73  s, then to the s
b9f0: 70 65 63 69 61 6c 20 61 67 67 72 65 67 61 74 65  pecial aggregate
ba00: 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  .  ** processing
ba10: 2e 20 20 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  .  .  */.  else{
ba20: 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
ba30: 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  y ){.      int l
ba40: 62 6c 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  bl1;.      for(i
ba50: 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; i<pGroupBy->
ba60: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
ba70: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
ba80: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ode(pParse, pGro
ba90: 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  upBy->a[i].pExpr
baa0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
bab0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
bac0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20  (v, OP_MakeKey, 
bad0: 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
bae0: 20 30 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20   0);.      lbl1 
baf0: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
bb00: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
bb10: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
bb20: 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20  v, OP_AggFocus, 
bb30: 30 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20  0, lbl1);.      
bb40: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
bb50: 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20  e->nAgg; i++){. 
bb60: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
bb70: 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  e->aAgg[i].isAgg
bb80: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
bb90: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
bba0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 50 61 72  ode(pParse, pPar
bbb0: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70  se->aAgg[i].pExp
bbc0: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
bbd0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
bbe0: 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69 29 3b  P_AggSet, 0, i);
bbf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
bc00: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
bc10: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a  Label(v, lbl1);.
bc20: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
bc30: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67  0; i<pParse->nAg
bc40: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  g; i++){.      E
bc50: 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69  xpr *pE;.      i
bc60: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20  nt j;.      if( 
bc70: 21 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d  !pParse->aAgg[i]
bc80: 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75  .isAgg ) continu
bc90: 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 50  e;.      pE = pP
bca0: 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45  arse->aAgg[i].pE
bcb0: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
bcc0: 74 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  t( pE->op==TK_AG
bcd0: 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
bce0: 20 20 20 20 69 66 28 20 70 45 2d 3e 70 4c 69 73      if( pE->pLis
bcf0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  t ){.        for
bd00: 28 6a 3d 30 3b 20 6a 3c 70 45 2d 3e 70 4c 69 73  (j=0; j<pE->pLis
bd10: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
bd20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
bd30: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
bd40: 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d   pE->pList->a[j]
bd50: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
bd60: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
bd70: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
bd80: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
bd90: 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  i, 0);.      sql
bda0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
bdb0: 4f 50 5f 41 67 67 46 75 6e 63 2c 20 30 2c 20 70  OP_AggFunc, 0, p
bdc0: 45 2d 3e 70 4c 69 73 74 20 3f 20 70 45 2d 3e 70  E->pList ? pE->p
bdd0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29  List->nExpr : 0)
bde0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
bdf0: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
be00: 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20 20 20 20  pFunc!=0 );.    
be10: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
be20: 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 2d  ->aAgg[i].pFunc-
be30: 3e 78 53 74 65 70 21 3d 30 20 29 3b 0a 20 20 20  >xStep!=0 );.   
be40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
be50: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP3(v, -1, (ch
be60: 61 72 2a 29 70 50 61 72 73 65 2d 3e 61 41 67 67  ar*)pParse->aAgg
be70: 5b 69 5d 2e 70 46 75 6e 63 2c 20 50 33 5f 50 4f  [i].pFunc, P3_PO
be80: 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20  INTER);.    }.  
be90: 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  }..  /* End the 
bea0: 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
beb0: 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  op..  */.  sqlit
bec0: 65 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  eWhereEnd(pWInfo
bed0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61  );..  /* If we a
bee0: 72 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67  re processing ag
bef0: 67 72 65 67 61 74 65 73 2c 20 77 65 20 6e 65 65  gregates, we nee
bf00: 64 20 74 6f 20 73 65 74 20 75 70 20 61 20 73 65  d to set up a se
bf10: 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f  cond loop.  ** o
bf20: 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 61  ver all of the a
bf30: 67 67 72 65 67 61 74 65 20 76 61 6c 75 65 73 20  ggregate values 
bf40: 61 6e 64 20 70 72 6f 63 65 73 73 20 74 68 65 6d  and process them
bf50: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41  ..  */.  if( isA
bf60: 67 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e  gg ){.    int en
bf70: 64 61 67 67 20 3d 20 73 71 6c 69 74 65 56 64 62  dagg = sqliteVdb
bf80: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
bf90: 20 20 20 69 6e 74 20 73 74 61 72 74 61 67 67 3b     int startagg;
bfa0: 0a 20 20 20 20 73 74 61 72 74 61 67 67 20 3d 20  .    startagg = 
bfb0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
bfc0: 76 2c 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30  v, OP_AggNext, 0
bfd0: 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 70  , endagg);.    p
bfe0: 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20  Parse->useAgg = 
bff0: 31 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69  1;.    if( pHavi
c000: 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
c010: 74 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  teExprIfFalse(pP
c020: 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73  arse, pHaving, s
c030: 74 61 72 74 61 67 67 29 3b 0a 20 20 20 20 7d 0a  tartagg);.    }.
c040: 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e      if( selectIn
c050: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
c060: 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
c070: 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74  rderBy, distinct
c080: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 0a  , eDest, iParm,.
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0a0: 20 20 20 20 73 74 61 72 74 61 67 67 2c 20 65 6e      startagg, en
c0b0: 64 61 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67  dagg) ){.      g
c0c0: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
c0d0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
c0e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c0f0: 47 6f 74 6f 2c 20 30 2c 20 73 74 61 72 74 61 67  Goto, 0, startag
c100: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  g);.    sqliteVd
c110: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
c120: 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 73  , endagg);.    s
c130: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
c140: 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29  , OP_Noop, 0, 0)
c150: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73  ;.    pParse->us
c160: 65 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  eAgg = 0;.  }.. 
c170: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
c180: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
c190: 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64  se, then we need
c1a0: 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73   to sort the res
c1b0: 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65  ults.  ** and se
c1c0: 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63  nd them to the c
c1d0: 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f  allback one by o
c1e0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ne..  */.  if( p
c1f0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67  OrderBy ){.    g
c200: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
c210: 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  v, pEList->nExpr
c220: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 73  );.  }...  /* Is
c230: 73 75 65 20 61 20 6e 75 6c 6c 20 63 61 6c 6c 62  sue a null callb
c240: 61 63 6b 20 69 66 20 74 68 61 74 20 69 73 20 77  ack if that is w
c250: 68 61 74 20 74 68 65 20 75 73 65 72 20 77 61 6e  hat the user wan
c260: 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ts..  */.  if( (
c270: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
c280: 73 20 26 20 53 51 4c 49 54 45 5f 4e 75 6c 6c 43  s & SQLITE_NullC
c290: 61 6c 6c 62 61 63 6b 29 21 3d 30 20 26 26 20 65  allback)!=0 && e
c2a0: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
c2b0: 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
c2c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c2d0: 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 2c 20 70 45  NullCallback, pE
c2e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b  List->nExpr, 0);
c2f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 53  .  }..  /* The S
c300: 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73  ELECT was succes
c310: 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20  sfully coded.   
c320: 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  Set the return c
c330: 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f  ode to 0.  ** to
c340: 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72   indicate no err
c350: 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ors..  */.  rc =
c360: 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f   0;..  /* Contro
c370: 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20  l jumps to here 
c380: 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  if an error is e
c390: 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65  ncountered above
c3a0: 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73  , or upon.  ** s
c3b0: 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67  uccessful coding
c3c0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
c3d0: 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a    */.select_end:
c3e0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20  .  pParse->nTab 
c3f0: 3d 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65  = base;.  sqlite
c400: 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73  AggregateInfoRes
c410: 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65  et(pParse);.  re
c420: 74 75 72 6e 20 72 63 3b 0a 7d 0a                 turn rc;.}.