/ Hex Artifact Content
Login

Artifact 49c78aa0c96dda036846937b516658536db98b56:


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 34 20  select.c,v 1.74 
0200: 32 30 30 32 2f 30 33 2f 30 33 20 31 38 3a 35 39  2002/03/03 18:59
0210: 3a 34 31 20 64 72 68 20 45 78 70 20 24 0a 2a 2f  :41 drh Exp $.*/
0220: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0230: 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 41  eInt.h"../*.** A
0240: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65  llocate a new Se
0250: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61  lect structure a
0260: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
0270: 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73  ter to that.** s
0280: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c  tructure..*/.Sel
0290: 65 63 74 20 2a 73 71 6c 69 74 65 53 65 6c 65 63  ect *sqliteSelec
02a0: 74 4e 65 77 28 0a 20 20 45 78 70 72 4c 69 73 74  tNew(.  ExprList
02b0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f 2a   *pEList,     /*
02c0: 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 74   which columns t
02d0: 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 65  o include in the
02e0: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 49 64 4c   result */.  IdL
02f0: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
0300: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
0310: 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20 74  lause -- which t
0320: 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f  ables to scan */
0330: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
0340: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
0350: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
0360: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
0370: 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 47  upBy,   /* the G
0380: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
0390: 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
03a0: 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  g,        /* the
03b0: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 2a   HAVING clause *
03c0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
03d0: 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68 65  rderBy,   /* the
03e0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
03f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74   */.  int isDist
0400: 69 6e 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 74  inct,       /* t
0410: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
0420: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
0430: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
0440: 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20  nLimit,         
0450: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
0460: 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 74 20  .  -1 means not 
0470: 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  used */.  int nO
0480: 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20  ffset           
0490: 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75 65 2e  /* OFFSET value.
04a0: 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 74 20 75    -1 means not u
04b0: 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  sed */.){.  Sele
04c0: 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  ct *pNew;.  pNew
04d0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
04e0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
04f0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
0500: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  ){.    sqliteExp
0510: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69  rListDelete(pELi
0520: 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 49  st);.    sqliteI
0530: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 53 72 63  dListDelete(pSrc
0540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  );.    sqliteExp
0550: 72 44 65 6c 65 74 65 28 70 57 68 65 72 65 29 3b  rDelete(pWhere);
0560: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 4c  .    sqliteExprL
0570: 69 73 74 44 65 6c 65 74 65 28 70 47 72 6f 75 70  istDelete(pGroup
0580: 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45  By);.    sqliteE
0590: 78 70 72 44 65 6c 65 74 65 28 70 48 61 76 69 6e  xprDelete(pHavin
05a0: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78  g);.    sqliteEx
05b0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4f 72  prListDelete(pOr
05c0: 64 65 72 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  derBy);.  }else{
05d0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  .    pNew->pELis
05e0: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20  t = pEList;.    
05f0: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72  pNew->pSrc = pSr
0600: 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 68  c;.    pNew->pWh
0610: 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
0620: 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
0630: 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20   = pGroupBy;.   
0640: 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
0650: 20 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 70 4e   pHaving;.    pN
0660: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  ew->pOrderBy = p
0670: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 4e 65  OrderBy;.    pNe
0680: 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  w->isDistinct = 
0690: 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20  isDistinct;.    
06a0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  pNew->op = TK_SE
06b0: 4c 45 43 54 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  LECT;.    pNew->
06c0: 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d 69 74 3b  nLimit = nLimit;
06d0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 66 66 73  .    pNew->nOffs
06e0: 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b 0a 20 20  et = nOffset;.  
06f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
0700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
0710: 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63   the given Selec
0720: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0730: 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74  all of its subst
0740: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
0750: 64 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65  d sqliteSelectDe
0760: 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70 29 7b  lete(Select *p){
0770: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
0780: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 45 78  turn;.  sqliteEx
0790: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
07a0: 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  pEList);.  sqlit
07b0: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  eIdListDelete(p-
07c0: 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  >pSrc);.  sqlite
07d0: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 57  ExprDelete(p->pW
07e0: 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 45  here);.  sqliteE
07f0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  xprListDelete(p-
0800: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 73 71  >pGroupBy);.  sq
0810: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
0820: 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 73 71  ->pHaving);.  sq
0830: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
0840: 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  te(p->pOrderBy);
0850: 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44  .  sqliteSelectD
0860: 65 6c 65 74 65 28 70 2d 3e 70 50 72 69 6f 72 29  elete(p->pPrior)
0870: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
0880: 2d 3e 7a 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  ->zSelect);.  sq
0890: 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a  liteFree(p);.}..
08a0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
08b0: 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72   aggregate infor
08c0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
08d0: 70 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  parse structure.
08e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
08f0: 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49  sqliteAggregateI
0900: 6e 66 6f 52 65 73 65 74 28 50 61 72 73 65 20 2a  nfoReset(Parse *
0910: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
0920: 65 46 72 65 65 28 70 50 61 72 73 65 2d 3e 61 41  eFree(pParse->aA
0930: 67 67 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61  gg);.  pParse->a
0940: 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Agg = 0;.  pPars
0950: 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20 20 70  e->nAgg = 0;.  p
0960: 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20  Parse->useAgg = 
0970: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
0980: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
0990: 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
09a0: 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68  the inside of th
09b0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
09c0: 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  of a SELECT..**.
09d0: 2a 2a 20 54 68 65 20 70 45 4c 69 73 74 20 69 73  ** The pEList is
09e0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
09f0: 6e 65 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f  ne the values fo
0a00: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e  r each column in
0a10: 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 72   the.** result r
0a20: 6f 77 2e 20 20 45 78 63 65 70 74 20 20 69 66 20  ow.  Except  if 
0a30: 70 45 4c 69 73 74 3d 3d 4e 55 4c 4c 2c 20 74 68  pEList==NULL, th
0a40: 65 6e 20 77 65 20 6a 75 73 74 20 72 65 61 64 20  en we just read 
0a50: 6e 43 6f 6c 75 6d 6e 0a 2a 2a 20 65 6c 65 6d 65  nColumn.** eleme
0a60: 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 72 63  nts from the src
0a70: 54 61 62 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  Tab table..*/.st
0a80: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 49  atic int selectI
0a90: 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73  nnerLoop(.  Pars
0aa0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
0ab0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
0ac0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  r context */.  E
0ad0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
0ae0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
0af0: 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65  f values being e
0b00: 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e  xtracted */.  in
0b10: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
0b20: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
0b30: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
0b40: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  le */.  int nCol
0b50: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
0b60: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
0b70: 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72  umns in the sour
0b80: 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  ce table */.  Ex
0b90: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0ba0: 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20  ,     /* If not 
0bb0: 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c  NULL, sort resul
0bc0: 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65  ts using this ke
0bd0: 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  y */.  int disti
0be0: 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  nct,           /
0bf0: 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73  * If >=0, make s
0c00: 75 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ure results are 
0c10: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e  distinct */.  in
0c20: 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20  t eDest,        
0c30: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
0c40: 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
0c50: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
0c60: 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iParm,          
0c70: 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65      /* An argume
0c80: 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73  nt to the dispos
0c90: 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69  al method */.  i
0ca0: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20  nt iContinue,   
0cb0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
0cc0: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
0cd0: 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f  with next row */
0ce0: 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
0cf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
0d00: 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
0d10: 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65   out of the inne
0d20: 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56  r loop */.){.  V
0d30: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
0d40: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
0d50: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
0d60: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 50 75  turn 0;..  /* Pu
0d70: 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ll the requested
0d80: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20   columns..  */. 
0d90: 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20   if( pEList ){. 
0da0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
0db0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
0dc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  ){.      sqliteE
0dd0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
0de0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
0df0: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  pr);.    }.    n
0e00: 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74 2d  Column = pEList-
0e10: 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c 73 65 7b  >nExpr;.  }else{
0e20: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
0e30: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
0e40: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
0e50: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
0e60: 6e 2c 20 73 72 63 54 61 62 2c 20 69 29 3b 0a 20  n, srcTab, i);. 
0e70: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
0e80: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
0e90: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
0ea0: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
0eb0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
0ec0: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
0ed0: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
0ee0: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
0ef0: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
0f00: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
0f10: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
0f20: 20 64 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a   distinct>=0 ){.
0f30: 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71      int lbl = sq
0f40: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
0f50: 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l(v);.    sqlite
0f60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
0f70: 4d 61 6b 65 4b 65 79 2c 20 70 45 4c 69 73 74 2d  MakeKey, pEList-
0f80: 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20  >nExpr, 1);.    
0f90: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
0fa0: 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20  v, OP_Distinct, 
0fb0: 64 69 73 74 69 6e 63 74 2c 20 6c 62 6c 29 3b 0a  distinct, lbl);.
0fc0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
0fd0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 70  dOp(v, OP_Pop, p
0fe0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 2c 20  EList->nExpr+1, 
0ff0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
1000: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
1010: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65  to, 0, iContinue
1020: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
1030: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1040: 20 6c 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74   lbl);.    sqlit
1050: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
1060: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
1070: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
1080: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72  dOp(v, OP_PutStr
1090: 4b 65 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 30  Key, distinct, 0
10a0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
10b0: 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
10c0: 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
10d0: 6e 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  n store the resu
10e0: 6c 74 73 0a 20 20 2a 2a 20 69 6e 20 61 20 73 6f  lts.  ** in a so
10f0: 72 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rter..  */.  if(
1100: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
1110: 20 63 68 61 72 20 2a 7a 53 6f 72 74 4f 72 64 65   char *zSortOrde
1120: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  r;.    sqliteVdb
1130: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
1140: 74 4d 61 6b 65 52 65 63 2c 20 6e 43 6f 6c 75 6d  tMakeRec, nColum
1150: 6e 2c 20 30 29 3b 0a 20 20 20 20 7a 53 6f 72 74  n, 0);.    zSort
1160: 4f 72 64 65 72 20 3d 20 73 71 6c 69 74 65 4d 61  Order = sqliteMa
1170: 6c 6c 6f 63 28 20 70 4f 72 64 65 72 42 79 2d 3e  lloc( pOrderBy->
1180: 6e 45 78 70 72 20 2b 20 31 20 29 3b 0a 20 20 20  nExpr + 1 );.   
1190: 20 69 66 28 20 7a 53 6f 72 74 4f 72 64 65 72 3d   if( zSortOrder=
11a0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
11b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
11c0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
11d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 6f 72 74  ++){.      zSort
11e0: 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65  Order[i] = pOrde
11f0: 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
1200: 64 65 72 20 3f 20 27 2d 27 20 3a 20 27 2b 27 3b  der ? '-' : '+';
1210: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
1220: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4f  rCode(pParse, pO
1230: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
1240: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  pr);.    }.    z
1250: 53 6f 72 74 4f 72 64 65 72 5b 70 4f 72 64 65 72  SortOrder[pOrder
1260: 42 79 2d 3e 6e 45 78 70 72 5d 20 3d 20 30 3b 0a  By->nExpr] = 0;.
1270: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
1280: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61  dOp(v, OP_SortMa
1290: 6b 65 4b 65 79 2c 20 70 4f 72 64 65 72 42 79 2d  keKey, pOrderBy-
12a0: 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  >nExpr, 0);.    
12b0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
12c0: 50 33 28 76 2c 20 2d 31 2c 20 7a 53 6f 72 74 4f  P3(v, -1, zSortO
12d0: 72 64 65 72 2c 20 73 74 72 6c 65 6e 28 7a 53 6f  rder, strlen(zSo
12e0: 72 74 4f 72 64 65 72 29 29 3b 0a 20 20 20 20 73  rtOrder));.    s
12f0: 71 6c 69 74 65 46 72 65 65 28 7a 53 6f 72 74 4f  qliteFree(zSortO
1300: 72 64 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rder);.    sqlit
1310: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
1320: 5f 53 6f 72 74 50 75 74 2c 20 30 2c 20 30 29 3b  _SortPut, 0, 0);
1330: 0a 20 20 7d 65 6c 73 65 20 0a 0a 20 20 2f 2a 20  .  }else ..  /* 
1340: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
1350: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
1360: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
1370: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
1380: 79 0a 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61  y.  ** table iPa
1390: 72 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  rm..  */.  if( e
13a0: 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20  Dest==SRT_Union 
13b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
13c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
13d0: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
13e0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1400: 53 74 72 69 6e 67 2c 20 69 50 61 72 6d 2c 20 30  String, iParm, 0
1410: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
1420: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
1430: 53 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30  StrKey, iParm, 0
1440: 29 3b 0a 20 20 7d 65 6c 73 65 20 0a 0a 20 20 2f  );.  }else ..  /
1450: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
1460: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
1470: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
1480: 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
1490: 3d 53 52 54 5f 54 61 62 6c 65 20 7c 7c 20 65 44  =SRT_Table || eD
14a0: 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62  est==SRT_TempTab
14b0: 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
14c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14d0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c  MakeRecord, nCol
14e0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  umn, 0);.    sql
14f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
1500: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61  OP_NewRecno, iPa
1510: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rm, 0);.    sqli
1520: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1530: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
1540: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
1550: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
1560: 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  ey, iParm, 0);. 
1570: 20 7d 65 6c 73 65 20 0a 0a 20 20 2f 2a 20 43 6f   }else ..  /* Co
1580: 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64  nstruct a record
1590: 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20   from the query 
15a0: 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74  result, but inst
15b0: 65 61 64 20 6f 66 0a 20 20 2a 2a 20 73 61 76 69  ead of.  ** savi
15c0: 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20  ng that record, 
15d0: 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20  use it as a key 
15e0: 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e  to delete elemen
15f0: 74 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  ts from.  ** the
1600: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1610: 20 69 50 61 72 6d 2e 0a 20 20 2a 2f 0a 20 20 69   iParm..  */.  i
1620: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  f( eDest==SRT_Ex
1630: 63 65 70 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  cept ){.    int 
1640: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
1650: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
1660: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
1670: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1680: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1690: 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c  NotFound, iParm,
16a0: 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 73 71   addr+3);.    sq
16b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
16c0: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61 72   OP_Delete, iPar
16d0: 6d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 0a  m, 0);.  }else .
16e0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
16f0: 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
1700: 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
1710: 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e  SELECT ...)" con
1720: 73 74 72 75 63 74 2c 0a 20 20 2a 2a 20 74 68 65  struct,.  ** the
1730: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
1740: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
1750: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
1760: 72 69 74 65 20 74 68 69 73 0a 20 20 2a 2a 20 69  rite this.  ** i
1770: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
1780: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
1790: 73 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69  s data..  */.  i
17a0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65  f( eDest==SRT_Se
17b0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
17c0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
17d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
17e0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
17f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1800: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1810: 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 69 50 61  P_PutStrKey, iPa
1820: 72 6d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20  rm, 0);.  }else 
1830: 0a 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ...  /* If this 
1840: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
1850: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
1860: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
1870: 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 74 6f 72  , then.  ** stor
1880: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
1890: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
18a0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
18b0: 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 2a 2a 20   break out.  ** 
18c0: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
18d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
18e0: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20  st==SRT_Mem ){. 
18f0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
1900: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c  mn==1 );.    sql
1910: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
1920: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61  OP_MemStore, iPa
1930: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  rm, 1);.    sqli
1940: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1950: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61  P_Goto, 0, iBrea
1960: 6b 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f  k);.  }else..  /
1970: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
1980: 20 61 62 6f 76 65 2c 20 73 65 6e 64 20 74 68 65   above, send the
1990: 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c   data to the cal
19a0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a  lback function..
19b0: 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 73 71 6c    */.  {.    sql
19c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
19d0: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f  OP_Callback, nCo
19e0: 6c 75 6d 6e 2c 20 69 42 72 65 61 6b 29 3b 0a 20  lumn, iBreak);. 
19f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1a00: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
1a10: 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65  nner loop was ge
1a20: 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20  nerated using a 
1a30: 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42  non-null pOrderB
1a40: 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74  y argument,.** t
1a50: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
1a60: 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61  were placed in a
1a70: 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20   sorter.  After 
1a80: 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d  the loop is term
1a90: 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65  inated.** we nee
1aa0: 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72  d to run the sor
1ab0: 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74  ter and output t
1ac0: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65  he results.  The
1ad0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f   following.** ro
1ae0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
1af0: 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20  the code needed 
1b00: 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73  to do that..*/.s
1b10: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
1b20: 61 74 65 53 6f 72 74 54 61 69 6c 28 56 64 62 65  ateSortTail(Vdbe
1b30: 20 2a 76 2c 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e   *v, int nColumn
1b40: 29 7b 0a 20 20 69 6e 74 20 65 6e 64 20 3d 20 73  ){.  int end = s
1b50: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
1b60: 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64  el(v);.  int add
1b70: 72 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  r;.  sqliteVdbeA
1b80: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c  ddOp(v, OP_Sort,
1b90: 20 30 2c 20 30 29 3b 0a 20 20 61 64 64 72 20 3d   0, 0);.  addr =
1ba0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1bb0: 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c  (v, OP_SortNext,
1bc0: 20 30 2c 20 65 6e 64 29 3b 0a 20 20 73 71 6c 69   0, end);.  sqli
1bd0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1be0: 50 5f 53 6f 72 74 43 61 6c 6c 62 61 63 6b 2c 20  P_SortCallback, 
1bf0: 6e 43 6f 6c 75 6d 6e 2c 20 65 6e 64 29 3b 0a 20  nColumn, end);. 
1c00: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1c10: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1c20: 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 56  addr);.  sqliteV
1c30: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1c40: 76 2c 20 65 6e 64 29 3b 0a 20 20 73 71 6c 69 74  v, end);.  sqlit
1c50: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
1c60: 5f 53 6f 72 74 52 65 73 65 74 2c 20 30 2c 20 30  _SortReset, 0, 0
1c70: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
1c80: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
1c90: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
1ca0: 45 20 68 6f 77 20 6d 61 6e 79 20 63 6f 6c 75 6d  E how many colum
1cb0: 6e 73 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  ns there.** are 
1cc0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e  in the result an
1cd0: 64 20 74 68 65 20 6e 61 6d 65 20 66 6f 72 20 65  d the name for e
1ce0: 61 63 68 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69  ach column.  Thi
1cf0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  s information.**
1d00: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76   is used to prov
1d10: 69 64 65 20 22 61 72 67 63 22 20 61 6e 64 20 22  ide "argc" and "
1d20: 61 7a 43 6f 6c 5b 5d 22 20 76 61 6c 75 65 73 20  azCol[]" values 
1d30: 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  in the callback.
1d40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d50: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
1d60: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
1d70: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
1d80: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
1d90: 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20    int base,     
1da0: 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75        /* VDBE cu
1db0: 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64 69  rsor correspondi
1dc0: 6e 67 20 74 6f 20 66 69 72 73 74 20 65 6e 74 72  ng to first entr
1dd0: 79 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f  y in pTabList */
1de0: 0a 20 20 49 64 4c 69 73 74 20 2a 70 54 61 62 4c  .  IdList *pTabL
1df0: 69 73 74 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ist,   /* List o
1e00: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
1e10: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
1e20: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
1e30: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
1e40: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20  sult set */.){. 
1e50: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1e60: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1e70: 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  i;.  if( pParse-
1e80: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
1e90: 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  v==0 || sqlite_m
1ea0: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
1eb0: 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d  eturn;.  pParse-
1ec0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
1ed0: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64  ;.  sqliteVdbeAd
1ee0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
1ef0: 43 6f 75 6e 74 2c 20 70 45 4c 69 73 74 2d 3e 6e  Count, pEList->n
1f00: 45 78 70 72 2c 20 30 29 3b 0a 20 20 66 6f 72 28  Expr, 0);.  for(
1f10: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
1f20: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1f30: 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 69 6e 74  Expr *p;.    int
1f40: 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 3b 0a   showFullNames;.
1f50: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
1f60: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20  a[i].zName ){.  
1f70: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
1f80: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
1f90: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Name;.      sqli
1fa0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1fb0: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c  P_ColumnName, i,
1fc0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
1fd0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
1fe0: 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c   -1, zName, strl
1ff0: 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  en(zName));.    
2000: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2010: 7d 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74  }.    p = pEList
2020: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
2030: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e    if( p==0 ) con
2040: 74 69 6e 75 65 3b 0a 20 20 20 20 73 68 6f 77 46  tinue;.    showF
2050: 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 70 50 61 72  ullNames = (pPar
2060: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
2070: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
2080: 6d 65 73 29 21 3d 30 3b 0a 20 20 20 20 69 66 28  mes)!=0;.    if(
2090: 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d   p->span.z && p-
20a0: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 26 26 20 21 73  >span.z[0] && !s
20b0: 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a  howFullNames ){.
20c0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
20d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
20e0: 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  (v,OP_ColumnName
20f0: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , i, 0);.      s
2100: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
2110: 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 73 70 61 6e  3(v, -1, p->span
2120: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  .z, p->span.n);.
2130: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
2140: 43 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c  CompressSpace(v,
2150: 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73   addr);.    }els
2160: 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  e if( p->op==TK_
2170: 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69  COLUMN && pTabLi
2180: 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  st ){.      Tabl
2190: 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69  e *pTab = pTabLi
21a0: 73 74 2d 3e 61 5b 70 2d 3e 69 54 61 62 6c 65 20  st->a[p->iTable 
21b0: 2d 20 62 61 73 65 5d 2e 70 54 61 62 3b 0a 20 20  - base].pTab;.  
21c0: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
21d0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
21e0: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
21f0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
2200: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
2210: 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
2220: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
2230: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
2240: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
2250: 20 20 20 20 7a 43 6f 6c 20 3d 20 69 43 6f 6c 3c      zCol = iCol<
2260: 30 20 3f 20 22 5f 52 4f 57 49 44 5f 22 20 3a 20  0 ? "_ROWID_" : 
2270: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
2280: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66  .zName;.      if
2290: 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3e  ( pTabList->nId>
22a0: 31 20 7c 7c 20 73 68 6f 77 46 75 6c 6c 4e 61 6d  1 || showFullNam
22b0: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  es ){.        ch
22c0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
22d0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
22e0: 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61  b;. .        zTa
22f0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
2300: 70 2d 3e 69 54 61 62 6c 65 20 2d 20 62 61 73 65  p->iTable - base
2310: 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ].zAlias;.      
2320: 20 20 69 66 28 20 73 68 6f 77 46 75 6c 6c 4e 61    if( showFullNa
2330: 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29  mes || zTab==0 )
2340: 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e   zTab = pTab->zN
2350: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ame;.        sql
2360: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  iteSetString(&zN
2370: 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  ame, zTab, ".", 
2380: 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  zCol, 0);.      
2390: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
23a0: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61  p(v, OP_ColumnNa
23b0: 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  me, i, 0);.     
23c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
23d0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61  ngeP3(v, -1, zNa
23e0: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  me, strlen(zName
23f0: 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
2400: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
2410: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2420: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
2430: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
2440: 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20  Name, i, 0);.   
2450: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
2460: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a  hangeP3(v, -1, z
2470: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Col, 0);.      }
2480: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
2490: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
24a0: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
24b0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
24c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 4f  iteVdbeAddOp(v,O
24d0: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c  P_ColumnName, i,
24e0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
24f0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
2500: 20 2d 31 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20   -1, p->span.z, 
2510: 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  p->span.n);.    
2520: 20 20 73 71 6c 69 74 65 56 64 62 65 43 6f 6d 70    sqliteVdbeComp
2530: 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64  ressSpace(v, add
2540: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
2550: 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b       char zName[
2560: 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  30];.      asser
2570: 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  t( p->op!=TK_COL
2580: 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d  UMN || pTabList=
2590: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 70 72 69  =0 );.      spri
25a0: 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75  ntf(zName, "colu
25b0: 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20  mn%d", i+1);.   
25c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
25d0: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e  Op(v, OP_ColumnN
25e0: 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ame, i, 0);.    
25f0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
2600: 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d  geP3(v, -1, zNam
2610: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
2620: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
2630: 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68  /*.** Name of th
2640: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65  e connection ope
2650: 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20  rator, used for 
2660: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
2670: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
2680: 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61  char *selectOpNa
2690: 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68  me(int id){.  ch
26a0: 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28  ar *z;.  switch(
26b0: 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20   id ){.    case 
26c0: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20  TK_ALL:       z 
26d0: 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20  = "UNION ALL";  
26e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
26f0: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a   TK_INTERSECT: z
2700: 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20   = "INTERSECT"; 
2710: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
2720: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20  e TK_EXCEPT:    
2730: 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20  z = "EXCEPT";   
2740: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
2750: 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20  fault:          
2760: 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20   z = "UNION";   
2770: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
2780: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
2790: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45  .** Given a SELE
27a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65  CT statement, ge
27b0: 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73  nerate a Table s
27c0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
27d0: 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72  scribes.** the r
27e0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61  esult set of tha
27f0: 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62  t SELECT..*/.Tab
2800: 6c 65 20 2a 73 71 6c 69 74 65 52 65 73 75 6c 74  le *sqliteResult
2810: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
2820: 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20  e *pParse, char 
2830: 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63  *zTabName, Selec
2840: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
2850: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e  able *pTab;.  in
2860: 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  t i;.  ExprList 
2870: 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 61 74 69  *pEList;.  stati
2880: 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75  c int fillInColu
2890: 6d 6e 4c 69 73 74 28 50 61 72 73 65 2a 2c 20 53  mnList(Parse*, S
28a0: 65 6c 65 63 74 2a 29 3b 0a 0a 20 20 69 66 28 20  elect*);..  if( 
28b0: 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74  fillInColumnList
28c0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
28d0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
28e0: 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20  0;.  }.  pTab = 
28f0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
2900: 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
2910: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
2920: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2930: 7d 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  }.  pTab->zName 
2940: 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c  = zTabName ? sql
2950: 69 74 65 53 74 72 44 75 70 28 7a 54 61 62 4e 61  iteStrDup(zTabNa
2960: 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73  me) : 0;.  pELis
2970: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
2980: 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f  ist;.  pTab->nCo
2990: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
29a0: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
29b0: 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70  b->nCol>0 );.  p
29c0: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69  Tab->aCol = sqli
29d0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
29e0: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a  (pTab->aCol[0])*
29f0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
2a00: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
2a10: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
2a20: 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 69 66   Expr *p;.    if
2a30: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
2a40: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 70 54  Name ){.      pT
2a50: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
2a60: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
2a70: 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  (pEList->a[i].zN
2a80: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ame);.    }else 
2a90: 69 66 28 20 28 70 3d 70 45 4c 69 73 74 2d 3e 61  if( (p=pEList->a
2aa0: 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e  [i].pExpr)->span
2ab0: 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b  .z && p->span.z[
2ac0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0] ){.      sqli
2ad0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 54  teSetNString(&pT
2ae0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
2af0: 65 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d  e, p->span.z, p-
2b00: 3e 73 70 61 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20  >span.n, 0);.   
2b10: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70   }else if( p->op
2b20: 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 2d 3e 70  ==TK_DOT && p->p
2b30: 52 69 67 68 74 20 26 26 20 70 2d 3e 70 52 69 67  Right && p->pRig
2b40: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 0a 20  ht->token.z &&. 
2b50: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69            p->pRi
2b60: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20  ght->token.z[0] 
2b70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
2b80: 65 74 4e 53 74 72 69 6e 67 28 26 70 54 61 62 2d  etNString(&pTab-
2b90: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[i].zName, 
2ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  .           p->p
2bb0: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  Right->token.z, 
2bc0: 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  p->pRight->token
2bd0: 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  .n, 0);.    }els
2be0: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42  e{.      char zB
2bf0: 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73 70  uf[30];.      sp
2c00: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 63 6f 6c  rintf(zBuf, "col
2c10: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20  umn%d", i+1);.  
2c20: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
2c30: 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
2c40: 53 74 72 44 75 70 28 7a 42 75 66 29 3b 0a 20 20  StrDup(zBuf);.  
2c50: 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e    }.  }.  pTab->
2c60: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65  iPKey = -1;.  re
2c70: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
2c80: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 67 69 76 65  .** For the give
2c90: 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
2ca0: 6e 74 2c 20 64 6f 20 74 77 6f 20 74 68 69 6e 67  nt, do two thing
2cb0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s..**.**    (1) 
2cc0: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61   Fill in the pTa
2cd0: 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20  bList->a[].pTab 
2ce0: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 49 64  fields in the Id
2cf0: 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
2d00: 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 74 68        defines th
2d10: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
2d20: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 73  that should be s
2d30: 63 61 6e 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20  canned. .**.**  
2d40: 20 20 28 32 29 20 20 49 66 20 74 68 65 20 63 6f    (2)  If the co
2d50: 6c 75 6d 6e 73 20 74 6f 20 62 65 20 65 78 74 72  lumns to be extr
2d60: 61 63 74 65 64 20 76 61 72 69 61 62 6c 65 20 28  acted variable (
2d70: 70 45 4c 69 73 74 29 20 69 73 20 4e 55 4c 4c 0a  pEList) is NULL.
2d80: 2a 2a 20 20 20 20 20 20 20 20 20 28 6d 65 61 6e  **         (mean
2d90: 69 6e 67 20 74 68 61 74 20 61 20 22 2a 22 20 77  ing that a "*" w
2da0: 61 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 53  as used in the S
2db0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 29 20 74 68  QL statement) th
2dc0: 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 72  en.**         cr
2dd0: 65 61 74 65 20 61 20 66 61 6b 65 20 70 45 4c 69  eate a fake pELi
2de0: 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  st containing th
2df0: 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63  e names of all c
2e00: 6f 6c 75 6d 6e 73 0a 2a 2a 20 20 20 20 20 20 20  olumns.**       
2e10: 20 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 2e    of all tables.
2e20: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
2e30: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
2e40: 74 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65  there are proble
2e50: 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ms, leave an err
2e60: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e  or message.** in
2e70: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
2e80: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  rn non-zero..*/.
2e90: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
2ea0: 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73  nColumnList(Pars
2eb0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
2ec0: 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  t *p){.  int i, 
2ed0: 6a 2c 20 6b 3b 0a 20 20 49 64 4c 69 73 74 20 2a  j, k;.  IdList *
2ee0: 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
2ef0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
2f00: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20  Table *pTab;..  
2f10: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
2f20: 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
2f30: 31 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  1;.  pTabList = 
2f40: 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
2f50: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a  t = p->pEList;..
2f60: 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
2f70: 72 79 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ry table in the 
2f80: 74 61 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a 2f  table list..  */
2f90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
2fa0: 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  abList->nId; i++
2fb0: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c  ){.    if( pTabL
2fc0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 29  ist->a[i].pTab )
2fd0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
2fe0: 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20  routine has run 
2ff0: 62 65 66 6f 72 65 21 20 20 4e 6f 20 6e 65 65 64  before!  No need
3000: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a   to continue */.
3010: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
3020: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
3030: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  abList->a[i].zNa
3040: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  me==0 ){.      /
3050: 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
3060: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
3070: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
3080: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
3090: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  abList->a[i].pSe
30a0: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  lect!=0 );.     
30b0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
30c0: 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
30d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 52 65 73         sqliteRes
30e0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
30f0: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d  Parse, pTabList-
3100: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 0a 20 20  >a[i].zAlias,.  
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3130: 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e        pTabList->
3140: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
3150: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
3160: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
3170: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
3180: 20 20 20 20 70 54 61 62 2d 3e 69 73 54 72 61 6e      pTab->isTran
3190: 73 69 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d  sient = 1;.    }
31a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
31b0: 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
31c0: 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e   or view name in
31d0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
31e0: 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 4c 69   */.      pTabLi
31f0: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20  st->a[i].pTab = 
3200: 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20  pTab = .        
3210: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
3220: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
3230: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
3240: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
3250: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
3260: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
3270: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
3280: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
3290: 3a 20 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  : ", .          
32a0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
32b0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
32c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
32d0: 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  +;.        retur
32e0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
32f0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
3300: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
3310: 69 66 28 20 73 71 6c 69 74 65 56 69 65 77 47 65  if( sqliteViewGe
3320: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
3330: 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20  rse, pTab) ){.  
3340: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
3350: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3360: 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b      pTabList->a[
3370: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  i].pSelect = sql
3380: 69 74 65 53 65 6c 65 63 74 44 75 70 28 70 54 61  iteSelectDup(pTa
3390: 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b->pSelect);.   
33a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
33b0: 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22    /* For every "
33c0: 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  *" that occurs i
33d0: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
33e0: 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  t, insert the na
33f0: 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20  mes of.  ** all 
3400: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
3410: 61 62 6c 65 73 2e 20 20 54 68 65 20 70 61 72 73  ables.  The pars
3420: 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
3430: 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
3440: 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
3450: 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66  K_ALL operator f
3460: 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
3470: 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
3480: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20   column list..  
3490: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
34a0: 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74   code just has t
34b0: 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f  o locate the TK_
34c0: 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ALL expressions 
34d0: 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20  and expand.  ** 
34e0: 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
34f0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
3500: 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
3510: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  s..  */.  for(k=
3520: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
3530: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66  pr; k++){.    if
3540: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70  ( pEList->a[k].p
3550: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  Expr->op==TK_ALL
3560: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
3570: 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
3580: 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63  xpr ){.    struc
3590: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
35a0: 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
35b0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
35c0: 65 77 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ew = 0;.    for(
35d0: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
35e0: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
35f0: 20 20 69 66 28 20 61 5b 6b 5d 2e 70 45 78 70 72    if( a[k].pExpr
3600: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ->op!=TK_ALL ){.
3610: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
3620: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70  qliteExprListApp
3630: 65 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  end(pNew, a[k].p
3640: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
3650: 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
3660: 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
3670: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
3680: 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
3690: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b  = 0;.        a[k
36a0: 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
36b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
36d0: 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  bList->nId; i++)
36e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
36f0: 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69  e *pTab = pTabLi
3700: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a 20  st->a[i].pTab;. 
3710: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
3720: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
3730: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
3740: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a    Expr *pExpr, *
3750: 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a  pLeft, *pRight;.
3760: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
3770: 68 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  ht = sqliteExpr(
3780: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b  TK_ID, 0, 0, 0);
3790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
37a0: 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65   pRight==0 ) bre
37b0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
37c0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20  pRight->token.z 
37d0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
37e0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
37f0: 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e     pRight->token
3800: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 61 62  .n = strlen(pTab
3810: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
3820: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
3830: 28 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 29 7b  ( pTab->zName ){
3840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
3850: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45 78 70  Left = sqliteExp
3860: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30  r(TK_ID, 0, 0, 0
3870: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3880: 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 20   if( pLeft==0 ) 
3890: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
38a0: 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73       if( pTabLis
38b0: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 20 26  t->a[i].zAlias &
38c0: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  & pTabList->a[i]
38d0: 2e 7a 41 6c 69 61 73 5b 30 5d 20 29 7b 0a 20 20  .zAlias[0] ){.  
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
38f0: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 70  eft->token.z = p
3900: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  TabList->a[i].zA
3910: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
3920: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b        pLeft->tok
3930: 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54  en.n = strlen(pT
3940: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
3950: 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ias);.          
3960: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3970: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
3980: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 70 54 61 62  ->token.z = pTab
3990: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
39a0: 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e           pLeft->
39b0: 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e  token.n = strlen
39c0: 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pTab->zName);. 
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
39f0: 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  pr = sqliteExpr(
3a00: 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
3a10: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
3a20: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
3a30: 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  pr==0 ) break;. 
3a40: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
3a50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3a60: 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
3a80: 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70  xpr->span = pExp
3a90: 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  r->token;.      
3aa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3ab0: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
3ac0: 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  eExprListAppend(
3ad0: 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 30 29 3b  pNew, pExpr, 0);
3ae0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3af0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3b00: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45     }.    sqliteE
3b10: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
3b20: 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45  List);.    p->pE
3b30: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
3b40: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3b50: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3b60: 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79 20 75  ne recursively u
3b70: 6e 6c 69 6e 6b 73 20 74 68 65 20 53 65 6c 65 63  nlinks the Selec
3b80: 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 54 61 62 20  t.pSrc.a[].pTab 
3b90: 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 69 6e 20 61  pointers.** in a
3ba0: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
3bb0: 65 2e 20 20 49 74 20 6a 75 73 74 20 73 65 74 73  e.  It just sets
3bc0: 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f   the pointers to
3bd0: 20 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 2a 2a 20   NULL.  This.** 
3be0: 72 6f 75 74 69 6e 65 20 69 73 20 72 65 63 75 72  routine is recur
3bf0: 73 69 76 65 20 69 6e 20 74 68 65 20 73 65 6e 73  sive in the sens
3c00: 65 20 74 68 61 74 20 69 66 20 74 68 65 20 53 65  e that if the Se
3c10: 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 53  lect.pSrc.a[].pS
3c20: 65 6c 65 63 74 0a 2a 2a 20 70 6f 69 6e 74 65 72  elect.** pointer
3c30: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
3c40: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
3c50: 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
3c60: 20 6f 6e 20 74 68 61 74 20 70 6f 69 6e 74 65 72   on that pointer
3c70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3c80: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f  tine is called o
3c90: 6e 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  n the Select str
3ca0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69  ucture that defi
3cb0: 6e 65 73 20 61 0a 2a 2a 20 56 49 45 57 20 69 6e  nes a.** VIEW in
3cc0: 20 6f 72 64 65 72 20 74 6f 20 75 6e 64 6f 20 61   order to undo a
3cd0: 6e 79 20 62 69 6e 64 69 6e 67 73 20 74 6f 20 74  ny bindings to t
3ce0: 61 62 6c 65 73 2e 20 20 54 68 69 73 20 69 73 20  ables.  This is 
3cf0: 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 62 65 63  necessary.** bec
3d00: 61 75 73 65 20 74 68 6f 73 65 20 74 61 62 6c 65  ause those table
3d10: 73 20 6d 69 67 68 74 20 62 65 20 44 52 4f 50 65  s might be DROPe
3d20: 64 20 62 79 20 61 20 73 75 62 73 65 71 75 65 6e  d by a subsequen
3d30: 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  t SQL command..*
3d40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 65 6c  /.void sqliteSel
3d50: 65 63 74 55 6e 62 69 6e 64 28 53 65 6c 65 63 74  ectUnbind(Select
3d60: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
3d70: 20 49 64 4c 69 73 74 20 2a 70 53 72 63 20 3d 20   IdList *pSrc = 
3d80: 70 2d 3e 70 53 72 63 3b 0a 20 20 54 61 62 6c 65  p->pSrc;.  Table
3d90: 20 2a 70 54 61 62 3b 0a 20 20 69 66 28 20 70 3d   *pTab;.  if( p=
3da0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
3db0: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
3dc0: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
3dd0: 66 28 20 28 70 54 61 62 20 3d 20 70 53 72 63 2d  f( (pTab = pSrc-
3de0: 3e 61 5b 69 5d 2e 70 54 61 62 29 21 3d 30 20 29  >a[i].pTab)!=0 )
3df0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  {.      if( pTab
3e00: 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b  ->isTransient ){
3e10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 44  .        sqliteD
3e20: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 54  eleteTable(0, pT
3e30: 61 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ab);.        sql
3e40: 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28  iteSelectDelete(
3e50: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  pSrc->a[i].pSele
3e60: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 53 72  ct);.        pSr
3e70: 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20  c->a[i].pSelect 
3e80: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
3e90: 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54     pSrc->a[i].pT
3ea0: 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  ab = 0;.      if
3eb0: 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  ( pSrc->a[i].pSe
3ec0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
3ed0: 73 71 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69  sqliteSelectUnbi
3ee0: 6e 64 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  nd(pSrc->a[i].pS
3ef0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a  elect);.      }.
3f00: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
3f10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3f20: 61 73 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69  associates entri
3f30: 65 73 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  es in an ORDER B
3f40: 59 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  Y expression lis
3f50: 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e  t with.** column
3f60: 73 20 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20  s in a result.  
3f70: 46 6f 72 20 65 61 63 68 20 4f 52 44 45 52 20 42  For each ORDER B
3f80: 59 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  Y expression, th
3f90: 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74  e opcode of.** t
3fa0: 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64  he top-level nod
3fb0: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
3fc0: 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68  TK_COLUMN and th
3fd0: 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  e iColumn value 
3fe0: 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65  of.** the top-le
3ff0: 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c  vel node is fill
4000: 65 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d  ed in with colum
4010: 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  n number and the
4020: 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65   iTable.** value
4030: 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65   of the top-leve
4040: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
4050: 20 77 69 74 68 20 69 54 61 62 6c 65 20 70 61 72   with iTable par
4060: 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ameter..**.** If
4070: 20 74 68 65 72 65 20 61 72 65 20 70 72 69 6f 72   there are prior
4080: 20 53 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c   SELECT clauses,
4090: 20 74 68 65 79 20 61 72 65 20 70 72 6f 63 65 73   they are proces
40a0: 73 65 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61  sed first.  A ma
40b0: 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72  tch.** in an ear
40c0: 6c 69 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65  lier SELECT take
40d0: 73 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  s precedence ove
40e0: 72 20 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54  r a later SELECT
40f0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72  ..**.** Any entr
4100: 79 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  y that does not 
4110: 6d 61 74 63 68 20 69 73 20 66 6c 61 67 67 65 64  match is flagged
4120: 20 61 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54   as an error.  T
4130: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
4140: 65 72 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e  errors is return
4150: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
4160: 74 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  t matchOrderbyTo
4170: 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
4180: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
4190: 20 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20    /* A place to 
41a0: 6c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  leave error mess
41b0: 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ages */.  Select
41c0: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
41d0: 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65    /* Match to re
41e0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  sult columns of 
41f0: 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  this SELECT */. 
4200: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
4210: 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rBy,     /* The 
4220: 4f 52 44 45 52 20 42 59 20 76 61 6c 75 65 73 20  ORDER BY values 
4230: 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  to match against
4240: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
4250: 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
4260: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
4270: 74 68 69 73 20 74 68 69 73 20 76 61 6c 75 65 20  this this value 
4280: 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69  in iTable */.  i
4290: 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  nt mustComplete 
42a0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55         /* If TRU
42b0: 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20  E all ORDER BYs 
42c0: 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b  must match */.){
42d0: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
42e0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45  .  int i, j;.  E
42f0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
4300: 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d  ..  if( pSelect=
4310: 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d  =0 || pOrderBy==
4320: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
4330: 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65  if( mustComplete
4340: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
4350: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
4360: 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72  pr; i++){ pOrder
4370: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20  By->a[i].done = 
4380: 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66  0; }.  }.  if( f
4390: 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28  illInColumnList(
43a0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
43b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
43c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c  ;.  }.  if( pSel
43d0: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ect->pPrior ){. 
43e0: 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65     if( matchOrde
43f0: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
4400: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  se, pSelect->pPr
4410: 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69  ior, pOrderBy, i
4420: 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20  Table, 0) ){.   
4430: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
4440: 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
4450: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
4460: 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
4470: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
4480: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
4490: 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  *pE = pOrderBy->
44a0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
44b0: 69 6e 74 20 6d 61 74 63 68 20 3d 20 30 3b 0a 20  int match = 0;. 
44c0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d     if( pOrderBy-
44d0: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e  >a[i].done ) con
44e0: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a  tinue;.    for(j
44f0: 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; j<pEList->nE
4500: 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
4510: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a   if( pEList->a[j
4520: 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e  ].zName && (pE->
4530: 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d  op==TK_ID || pE-
4540: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20  >op==TK_STRING) 
4550: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
4560: 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b  *zName, *zLabel;
4570: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
4580: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e   pEList->a[j].zN
4590: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ame;.        ass
45a0: 65 72 74 28 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a  ert( pE->token.z
45b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61 62   );.        zLab
45c0: 65 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  el = sqliteStrND
45d0: 75 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  up(pE->token.z, 
45e0: 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pE->token.n);.  
45f0: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75        sqliteDequ
4600: 6f 74 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20  ote(zLabel);.   
4610: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53       if( sqliteS
4620: 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c  trICmp(zName, zL
4630: 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20  abel)==0 ){ .   
4640: 20 20 20 20 20 20 20 6d 61 74 63 68 20 3d 20 31         match = 1
4650: 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
4660: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
4670: 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d  zLabel);.      }
4680: 0a 20 20 20 20 20 20 69 66 28 20 6d 61 74 63 68  .      if( match
4690: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 45 78 70  ==0 && sqliteExp
46a0: 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c  rCompare(pE, pEL
46b0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29  ist->a[j].pExpr)
46c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63   ){.        matc
46d0: 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  h = 1;.      }. 
46e0: 20 20 20 20 20 69 66 28 20 6d 61 74 63 68 20 29       if( match )
46f0: 7b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 6f 70  {.        pE->op
4700: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
4710: 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
4720: 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 70  n = j;.        p
4730: 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  E->iTable = iTab
4740: 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  le;.        pOrd
4750: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
4760: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
4770: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4780: 7d 0a 20 20 20 20 69 66 28 20 21 6d 61 74 63 68  }.    if( !match
4790: 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65   && mustComplete
47a0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a   ){.      char z
47b0: 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73  Buf[30];.      s
47c0: 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 22  printf(zBuf,"%d"
47d0: 2c 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ,i+1);.      sql
47e0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
47f0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
4800: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75  ORDER BY term nu
4810: 6d 62 65 72 20 22 2c 20 7a 42 75 66 2c 20 0a 20  mber ", zBuf, . 
4820: 20 20 20 20 20 20 20 22 20 64 6f 65 73 20 6e 6f         " does no
4830: 74 20 6d 61 74 63 68 20 61 6e 79 20 72 65 73 75  t match any resu
4840: 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  lt column", 0);.
4850: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
4860: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 6e 45 72 72  rr++;.      nErr
4870: 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ++;.      break;
4880: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4890: 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f  urn nErr;  .}../
48a0: 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20  *.** Get a VDBE 
48b0: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
48c0: 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43  rser context.  C
48d0: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
48e0: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
48f0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
4900: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
4910: 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73   and leave a mes
4920: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
4930: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 47  */.Vdbe *sqliteG
4940: 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
4950: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
4960: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
4970: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
4980: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
4990: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 56 64  pVdbe = sqliteVd
49a0: 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d  beCreate(pParse-
49b0: 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >db);.  }.  retu
49c0: 72 6e 20 76 3b 0a 7d 0a 20 20 20 20 0a 0a 2f 2a  rn v;.}.    ../*
49d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
49e0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
49f0: 6f 63 65 73 73 20 61 20 71 75 65 72 79 20 74 68  ocess a query th
4a00: 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65  at is really the
4a10: 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74   union.** or int
4a20: 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f  ersection of two
4a30: 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
4a40: 65 20 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74  e queries..*/.st
4a50: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
4a60: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
4a70: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
4a80: 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50  nt eDest, int iP
4a90: 61 72 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  arm){.  int rc; 
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4ab0: 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
4ac0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
4ad0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
4ae0: 72 3b 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65  r;     /* Anothe
4af0: 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
4b00: 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
4b10: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
4b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
4b30: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
4b40: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
4b50: 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20   base;          
4b60: 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20 76 61 6c   /* Baseline val
4b70: 75 65 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 6e  ue for pParse->n
4b80: 54 61 62 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b  Tab */..  /* Mak
4b90: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
4ba0: 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
4bb0: 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
4bc0: 43 54 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 0a  CTs.  Only the .
4bd0: 20 20 2a 2a 20 6c 61 73 74 20 53 45 4c 45 43 54    ** last SELECT
4be0: 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
4bf0: 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
4c00: 20 42 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   BY..  */.  if( 
4c10: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f  p==0 || p->pPrio
4c20: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  r==0 ) return 1;
4c30: 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
4c40: 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 50 72  Prior;.  if( pPr
4c50: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ior->pOrderBy ){
4c60: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
4c70: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
4c80: 72 72 4d 73 67 2c 22 4f 52 44 45 52 20 42 59 20  rrMsg,"ORDER BY 
4c90: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
4ca0: 6d 65 20 61 66 74 65 72 20 22 2c 0a 20 20 20 20  me after ",.    
4cb0: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
4cc0: 2d 3e 6f 70 29 2c 20 22 20 6e 6f 74 20 62 65 66  ->op), " not bef
4cd0: 6f 72 65 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  ore", 0);.    pP
4ce0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
4cf0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
4d00: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
4d10: 77 65 20 68 61 76 65 20 61 20 76 61 6c 69 64 20  we have a valid 
4d20: 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49  query engine.  I
4d30: 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20  f not, create a 
4d40: 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  new one..  */.  
4d50: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
4d60: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
4d70: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31   v==0 ) return 1
4d80: 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  ;..  /* Process 
4d90: 74 68 65 20 55 4e 49 4f 4e 20 6f 72 20 49 4e 54  the UNION or INT
4da0: 45 52 53 45 43 54 49 4f 4e 0a 20 20 2a 2f 0a 20  ERSECTION.  */. 
4db0: 20 62 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e   base = pParse->
4dc0: 6e 54 61 62 3b 0a 20 20 73 77 69 74 63 68 28 20  nTab;.  switch( 
4dd0: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
4de0: 65 20 54 4b 5f 41 4c 4c 3a 0a 20 20 20 20 63 61  e TK_ALL:.    ca
4df0: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20  se TK_EXCEPT:.  
4e00: 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
4e10: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69   {.      int uni
4e20: 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72  onTab;    /* Cur
4e30: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
4e40: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
4e50: 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  e holding result
4e60: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   */.      int op
4e70: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ;          /* On
4e80: 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70  e of the SRT_ op
4e90: 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c  erations to appl
4ea0: 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20  y to self */.   
4eb0: 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20     int priorOp; 
4ec0: 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20      /* The SRT_ 
4ed0: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70  operation to app
4ee0: 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65  ly to prior sele
4ef0: 63 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20 70 72  cts */..      pr
4f00: 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54  iorOp = p->op==T
4f10: 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c  K_ALL ? SRT_Tabl
4f20: 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  e : SRT_Union;. 
4f30: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
4f40: 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
4f50: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
4f60: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
4f70: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
4f80: 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
4f90: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
4fa0: 68 74 2e 20 20 54 68 69 73 20 61 6c 73 6f 20 6d  ht.  This also m
4fb0: 65 61 6e 73 20 77 65 20 61 72 65 20 6e 6f 74 20  eans we are not 
4fc0: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73  the right-most s
4fd0: 65 6c 65 63 74 20 61 6e 64 20 73 6f 0a 20 20 20  elect and so.   
4fe0: 20 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f       ** we canno
4ff0: 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  t have an ORDER 
5000: 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  BY clause.      
5010: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
5020: 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20  onTab = iParm;. 
5030: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5040: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
5050: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5060: 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
5070: 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
5080: 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
5090: 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
50a0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
50b0: 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
50c0: 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
50d0: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
50e0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
50f0: 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  +;.        if( p
5100: 2d 3e 70 4f 72 64 65 72 42 79 20 0a 20 20 20 20  ->pOrderBy .    
5110: 20 20 20 20 26 26 20 6d 61 74 63 68 4f 72 64 65      && matchOrde
5120: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
5130: 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72  se, p, p->pOrder
5140: 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29  By, unionTab, 1)
5150: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
5160: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
5170: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
5180: 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20  >op!=TK_ALL ){. 
5190: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
51a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
51b0: 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61  penTemp, unionTa
51c0: 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  b, 1);.         
51d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
51e0: 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61  (v, OP_KeyAsData
51f0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a  , unionTab, 1);.
5200: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5210: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
5220: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
5230: 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61  penTemp, unionTa
5240: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, 0);.        }
5250: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
5260: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
5270: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
5280: 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20   our left.      
5290: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
52a0: 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73  liteSelect(pPars
52b0: 65 2c 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72  e, pPrior, prior
52c0: 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c  Op, unionTab, 0,
52d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
52e0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
52f0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
5300: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
5310: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
5320: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69      */.      swi
5330: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
5340: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45         case TK_E
5350: 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54  XCEPT:  op = SRT
5360: 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b  _Except;   break
5370: 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
5380: 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d  TK_UNION:   op =
5390: 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62   SRT_Union;    b
53a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
53b0: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
53c0: 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20  op = SRT_Table; 
53d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
53e0: 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
53f0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  r = 0;.      rc 
5400: 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70  = sqliteSelect(p
5410: 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e  Parse, p, op, un
5420: 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 29  ionTab, 0, 0, 0)
5430: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
5440: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
5450: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
5460: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  n rc;..      /* 
5470: 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61  Convert the data
5480: 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
5490: 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61  y table into wha
54a0: 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20  tever form.     
54b0: 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77   ** it is that w
54c0: 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64  e currently need
54d0: 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20  ..      */      
54e0: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
54f0: 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20  !=priorOp ){.   
5500: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
5510: 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
5520: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
5530: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
5540: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
5550: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
5560: 20 70 2d 3e 62 61 73 65 2c 20 30 2c 20 70 2d 3e   p->base, 0, p->
5570: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  pEList);.       
5580: 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
5590: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
55a0: 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
55b0: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
55c0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
55d0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
55e0: 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
55f0: 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
5600: 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
5610: 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75  t = sqliteVdbeCu
5620: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
5630: 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63        rc = selec
5640: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
5650: 65 2c 20 30 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  e, 0, unionTab, 
5660: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
5670: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
5690: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20  ->pOrderBy, -1, 
56a0: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20  eDest, iParm, . 
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e              iCon
56d0: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
56e0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
56f0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 73  urn 1;.        s
5700: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
5710: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
5720: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
5730: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
5740: 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
5750: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
5760: 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76  sqliteVdbeResolv
5770: 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
5780: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5790: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
57a0: 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62  _Close, unionTab
57b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
57c0: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
57d0: 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72  .          gener
57e0: 61 74 65 53 6f 72 74 54 61 69 6c 28 76 2c 20 70  ateSortTail(v, p
57f0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
5800: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5810: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
5820: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
5830: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a  TK_INTERSECT: {.
5840: 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20        int tab1, 
5850: 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20  tab2;.      int 
5860: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
5870: 53 74 61 72 74 3b 0a 0a 20 20 20 20 20 20 2f 2a  Start;..      /*
5880: 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
5890: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
58a0: 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
58b0: 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
58c0: 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
58d0: 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
58e0: 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
58f0: 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
5900: 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
5910: 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
5920: 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
5930: 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
5940: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
5950: 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
5960: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
5970: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
5980: 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64  erBy && matchOrd
5990: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61  erbyToColumn(pPa
59a0: 72 73 65 2c 70 2c 70 2d 3e 70 4f 72 64 65 72 42  rse,p,p->pOrderB
59b0: 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20 20 20  y,tab1,1) ){.   
59c0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
59d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
59e0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
59f0: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62  OP_OpenTemp, tab
5a00: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 1);.      sql
5a10: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5a20: 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61  OP_KeyAsData, ta
5a30: 62 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 2f  b1, 1);..      /
5a40: 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
5a50: 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69  Ts to our left i
5a60: 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
5a70: 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20  ble "tab1"..    
5a80: 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
5a90: 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61  sqliteSelect(pPa
5aa0: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 53 52 54  rse, pPrior, SRT
5ab0: 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c  _Union, tab1, 0,
5ac0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
5ad0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
5ae0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
5af0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
5b00: 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  ECT into tempora
5b10: 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a  ry table "tab2".
5b20: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
5b30: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5b40: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74  , OP_OpenTemp, t
5b50: 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ab2, 1);.      s
5b60: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5b70: 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20  , OP_KeyAsData, 
5b80: 74 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20  tab2, 1);.      
5b90: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
5ba0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5bb0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
5bc0: 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
5bd0: 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  2, 0, 0, 0);.   
5be0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
5bf0: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
5c00: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5c10: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
5c20: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65  ate code to take
5c30: 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f   the intersectio
5c40: 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d  n of the two tem
5c50: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20  porary.      ** 
5c60: 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f  tables..      */
5c70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
5c80: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
5c90: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
5ca0: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2d  Names(pParse, p-
5cb0: 3e 62 61 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c  >base, 0, p->pEL
5cc0: 69 73 74 29 3b 0a 20 20 20 20 20 20 69 42 72 65  ist);.      iBre
5cd0: 61 6b 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  ak = sqliteVdbeM
5ce0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
5cf0: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
5d00: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
5d10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
5d20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
5d30: 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
5d40: 65 61 6b 29 3b 0a 20 20 20 20 20 20 69 53 74 61  eak);.      iSta
5d50: 72 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  rt = sqliteVdbeA
5d60: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 75 6c 6c 4b  ddOp(v, OP_FullK
5d70: 65 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  ey, tab1, 0);.  
5d80: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5d90: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  dOp(v, OP_NotFou
5da0: 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 29  nd, tab2, iCont)
5db0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c  ;.      rc = sel
5dc0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
5dd0: 72 73 65 2c 20 30 2c 20 74 61 62 31 2c 20 70 2d  rse, 0, tab1, p-
5de0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
5e10: 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44  pOrderBy, -1, eD
5e20: 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20  est, iParm, .   
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e40: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c            iCont,
5e50: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
5e60: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
5e70: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  1;.      sqliteV
5e80: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
5e90: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
5ea0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5eb0: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62  (v, OP_Next, tab
5ec0: 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20  1, iStart);.    
5ed0: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
5ee0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
5ef0: 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
5f00: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5f10: 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
5f20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
5f30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
5f40: 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
5f50: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
5f60: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
5f70: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
5f80: 28 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  (v, p->pEList->n
5f90: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
5fa0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5fb0: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
5fc0: 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72  p->pEList && pPr
5fd0: 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ior->pEList );. 
5fe0: 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
5ff0: 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70  nExpr!=pPrior->p
6000: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
6010: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
6020: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
6030: 72 4d 73 67 2c 20 22 53 45 4c 45 43 54 73 20 74  rMsg, "SELECTs t
6040: 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
6050: 69 67 68 74 20 6f 66 20 22 2c 0a 20 20 20 20 20  ight of ",.     
6060: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
6070: 3e 6f 70 29 2c 20 22 20 64 6f 20 6e 6f 74 20 68  >op), " do not h
6080: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
6090: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
60a0: 6c 75 6d 6e 73 22 2c 20 30 29 3b 0a 20 20 20 20  lumns", 0);.    
60b0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
60c0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
60d0: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  }.  pParse->nTab
60e0: 20 3d 20 62 61 73 65 3b 0a 20 20 72 65 74 75 72   = base;.  retur
60f0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
6100: 63 75 72 73 69 76 65 6c 79 20 73 63 61 6e 20 74  cursively scan t
6110: 68 72 6f 75 67 68 20 61 6e 20 65 78 70 72 65 73  hrough an expres
6120: 73 69 6f 6e 20 74 72 65 65 2e 20 20 46 6f 72 20  sion tree.  For 
6130: 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 0a  every reference.
6140: 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
6150: 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
6160: 46 72 6f 6d 2c 20 63 68 61 6e 67 65 20 74 68 61  From, change tha
6170: 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  t reference to t
6180: 68 65 0a 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d  he.** same colum
6190: 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
61a0: 72 20 69 54 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  r iTo..*/.static
61b0: 20 76 6f 69 64 20 63 68 61 6e 67 65 54 61 62 6c   void changeTabl
61c0: 65 73 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  es(Expr *pExpr, 
61d0: 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
61e0: 54 6f 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  To){.  if( pExpr
61f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
6200: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
6210: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
6220: 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 46 72 6f 6d  r->iTable==iFrom
6230: 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   ){.    pExpr->i
6240: 54 61 62 6c 65 20 3d 20 69 54 6f 3b 0a 20 20 7d  Table = iTo;.  }
6250: 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
6260: 20 76 6f 69 64 20 63 68 61 6e 67 65 54 61 62 6c   void changeTabl
6270: 65 73 49 6e 4c 69 73 74 28 45 78 70 72 4c 69 73  esInList(ExprLis
6280: 74 2a 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0a 20  t*, int, int);. 
6290: 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28     changeTables(
62a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 46  pExpr->pLeft, iF
62b0: 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 63  rom, iTo);.    c
62c0: 68 61 6e 67 65 54 61 62 6c 65 73 28 70 45 78 70  hangeTables(pExp
62d0: 72 2d 3e 70 52 69 67 68 74 2c 20 69 46 72 6f 6d  r->pRight, iFrom
62e0: 2c 20 69 54 6f 29 3b 0a 20 20 20 20 63 68 61 6e  , iTo);.    chan
62f0: 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74 28 70  geTablesInList(p
6300: 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 46 72  Expr->pList, iFr
6310: 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 7d 0a 7d 0a  om, iTo);.  }.}.
6320: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e  static void chan
6330: 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74 28 45  geTablesInList(E
6340: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
6350: 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
6360: 54 6f 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  To){.  if( pList
6370: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
6380: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
6390: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
63a0: 7b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 54 61  {.      changeTa
63b0: 62 6c 65 73 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  bles(pList->a[i]
63c0: 2e 70 45 78 70 72 2c 20 69 46 72 6f 6d 2c 20 69  .pExpr, iFrom, i
63d0: 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  To);.    }.  }.}
63e0: 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72  ../*.** Scan thr
63f0: 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73  ough the express
6400: 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c  ion pExpr.  Repl
6410: 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65  ace every refere
6420: 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75  nce to.** a colu
6430: 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62  mn in table numb
6440: 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61  er iTable with a
6450: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 72   copy of the cor
6460: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65 6e  responding.** en
6470: 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
6480: 57 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  When make a copy
6490: 20 6f 66 20 70 45 4c 69 73 74 2c 20 63 68 61 6e   of pEList, chan
64a0: 67 65 20 72 65 66 65 72 65 6e 63 65 73 0a 2a 2a  ge references.**
64b0: 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   to columns in t
64c0: 61 62 6c 65 20 69 53 75 62 20 69 6e 74 6f 20 72  able iSub into r
64d0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
64e0: 6c 65 20 69 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  le iTable..**.**
64f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
6500: 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61   part of the fla
6510: 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72  ttening procedur
6520: 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a  e.  A subquery.*
6530: 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73  * whose result s
6540: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
6550: 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20   pEList appears 
6560: 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  as entry in the.
6570: 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ** FROM clause o
6580: 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20  f a SELECT such 
6590: 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75  that the VDBE cu
65a0: 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
65b0: 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c   that.** FORM cl
65c0: 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54  ause entry is iT
65d0: 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
65e0: 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63  ine make the nec
65f0: 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
6600: 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
6610: 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
6620: 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
6630: 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
6640: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
6650: 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
6660: 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
6670: 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ery..*/.static v
6680: 6f 69 64 20 73 75 62 73 74 45 78 70 72 28 45 78  oid substExpr(Ex
6690: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 69  pr *pExpr, int i
66a0: 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20  Table, ExprList 
66b0: 2a 70 45 4c 69 73 74 2c 20 69 6e 74 20 69 53 75  *pEList, int iSu
66c0: 62 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  b){.  if( pExpr=
66d0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
66e0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
66f0: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
6700: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
6710: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   ){.    Expr *pN
6720: 65 77 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ew;.    assert( 
6730: 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
6740: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26  pr->iColumn>=0 &
6750: 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
6760: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
6770: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
6780: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
6790: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
67a0: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73  0 && pExpr->pLis
67b0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77  t==0 );.    pNew
67c0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78   = pEList->a[pEx
67d0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
67e0: 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
67f0: 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 70  pNew!=0 );.    p
6800: 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d  Expr->op = pNew-
6810: 3e 6f 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  >op;.    pExpr->
6820: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45 78  pLeft = sqliteEx
6830: 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65 66  prDup(pNew->pLef
6840: 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70  t);.    pExpr->p
6850: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 45 78  Right = sqliteEx
6860: 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 52 69 67  prDup(pNew->pRig
6870: 68 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ht);.    pExpr->
6880: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78  pList = sqliteEx
6890: 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e  prListDup(pNew->
68a0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70  pList);.    pExp
68b0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77  r->iTable = pNew
68c0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 45  ->iTable;.    pE
68d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  xpr->iColumn = p
68e0: 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  New->iColumn;.  
68f0: 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
6900: 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20  pNew->iAgg;.    
6910: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 20 3d 20 70  pExpr->token = p
6920: 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  New->token;.    
6930: 69 66 28 20 69 53 75 62 21 3d 69 54 61 62 6c 65  if( iSub!=iTable
6940: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 6e 67 65   ){.      change
6950: 54 61 62 6c 65 73 28 70 45 78 70 72 2c 20 69 53  Tables(pExpr, iS
6960: 75 62 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  ub, iTable);.   
6970: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
6980: 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
6990: 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  tExprList(ExprLi
69a0: 73 74 2a 2c 69 6e 74 2c 45 78 70 72 4c 69 73 74  st*,int,ExprList
69b0: 2a 2c 69 6e 74 29 3b 0a 20 20 20 20 73 75 62 73  *,int);.    subs
69c0: 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65  tExpr(pExpr->pLe
69d0: 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
69e0: 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 20 20 73  st, iSub);.    s
69f0: 75 62 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e  ubstExpr(pExpr->
6a00: 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20  pRight, iTable, 
6a10: 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20  pEList, iSub);. 
6a20: 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
6a30: 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69  (pExpr->pList, i
6a40: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 69  Table, pEList, i
6a50: 53 75 62 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  Sub);.  }.}.stat
6a60: 69 63 20 76 6f 69 64 20 0a 73 75 62 73 74 45 78  ic void .substEx
6a70: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
6a80: 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69 54 61 62  *pList, int iTab
6a90: 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45  le, ExprList *pE
6aa0: 4c 69 73 74 2c 20 69 6e 74 20 69 53 75 62 29 7b  List, int iSub){
6ab0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
6ac0: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
6ad0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
6ae0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
6af0: 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  +){.    substExp
6b00: 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  r(pList->a[i].pE
6b10: 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  xpr, iTable, pEL
6b20: 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 7d 0a  ist, iSub);.  }.
6b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6b40: 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
6b50: 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65  o flatten subque
6b60: 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  ries in order to
6b70: 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74   speed.** execut
6b80: 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ion.  It returns
6b90: 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63   1 if it makes c
6ba0: 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20  hanges and 0 if 
6bb0: 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a  no flattening.**
6bc0: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
6bd0: 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  o understand the
6be0: 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74   concept of flat
6bf0: 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72  tening, consider
6c00: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
6c10: 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  * query:.**.**  
6c20: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
6c30: 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20   (SELECT x+y AS 
6c40: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
6c50: 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35  z<100) WHERE a>5
6c60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
6c70: 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d  lt way of implem
6c80: 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72  enting this quer
6c90: 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  y is to execute 
6ca0: 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  the.** subquery 
6cb0: 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20  first and store 
6cc0: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
6cd0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
6ce0: 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68  , then.** run th
6cf0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e  e outer query on
6d00: 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
6d10: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71  table.  This req
6d20: 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73  uires two.** pas
6d30: 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74  ses over the dat
6d40: 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  a.  Furthermore,
6d50: 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d   because the tem
6d60: 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20  porary table.** 
6d70: 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20  has no indices, 
6d80: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
6d90: 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   on the outer qu
6da0: 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ery cannot be.**
6db0: 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a   optimized..**.*
6dc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
6dd0: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69  ttempts to rewri
6de0: 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20  te queries such 
6df0: 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74  as the above int
6e00: 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c  o.** a single fl
6e10: 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20  at select, like 
6e20: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
6e30: 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
6e40: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
6e50: 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a  100 AND a>5.**.*
6e60: 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
6e70: 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69  ated for this si
6e80: 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  mpification give
6e90: 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
6ea0: 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
6eb0: 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
6ec0: 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
6ed0: 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
6ee0: 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
6ef0: 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
6f00: 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
6f10: 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
6f20: 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
6f30: 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
6f40: 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
6f50: 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
6f60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
6f70: 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  rue:.**.**   (1)
6f80: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
6f90: 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
6fa0: 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
6fb0: 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  se aggregates..*
6fc0: 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20  *.**   (2)  The 
6fd0: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
6fe0: 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
6ff0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
7000: 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
7010: 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20  *.**   (3)  The 
7020: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
7030: 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
7040: 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
7050: 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
7060: 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
7070: 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
7080: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20  in..**.**   (5) 
7090: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
70a0: 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72   not DISTINCT or
70b0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
70c0: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
70d0: 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
70e0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20  es..**.**   (6) 
70f0: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
7100: 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
7110: 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
7120: 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
7130: 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
7140: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  CT..**.** In thi
7150: 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
7160: 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
7170: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
7180: 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
7190: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
71a0: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
71b0: 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
71c0: 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
71d0: 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
71e0: 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
71f0: 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
7200: 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
7210: 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
7220: 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
7230: 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
7240: 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
7250: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
7260: 70 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 0a  p and return 0..
7270: 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
7280: 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68   is attempted th
7290: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
72a0: 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ns 1..**.** All 
72b0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
72c0: 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20  n analysis must 
72d0: 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68  occur on both th
72e0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
72f0: 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72  d.** the subquer
7300: 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  y before this ro
7310: 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 69  utine runs..*/.i
7320: 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  nt flattenSubque
7330: 72 79 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  ry(Select *p, in
7340: 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 73 41  t iFrom, int isA
7350: 67 67 2c 20 69 6e 74 20 73 75 62 71 75 65 72 79  gg, int subquery
7360: 49 73 41 67 67 29 7b 0a 20 20 53 65 6c 65 63 74  IsAgg){.  Select
7370: 20 2a 70 53 75 62 3b 0a 20 20 49 64 4c 69 73 74   *pSub;.  IdList
7380: 20 2a 70 53 72 63 2c 20 2a 70 53 75 62 53 72 63   *pSrc, *pSubSrc
7390: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  ;.  ExprList *pL
73a0: 69 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ist;.  int i;.  
73b0: 69 6e 74 20 69 50 61 72 65 6e 74 2c 20 69 53 75  int iParent, iSu
73c0: 62 3b 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  b;.  Expr *pWher
73d0: 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  e;..  /* Check t
73e0: 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
73f0: 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
7400: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
7410: 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ot..  */.  if( p
7420: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7430: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
7440: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
7450: 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
7460: 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 49 64 20  iFrom<pSrc->nId 
7470: 29 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 72 63  );.  pSub = pSrc
7480: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53 65 6c 65  ->a[iFrom].pSele
7490: 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
74a0: 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  ub!=0 );.  if( i
74b0: 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79  sAgg && subquery
74c0: 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
74d0: 3b 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  ;.  if( subquery
74e0: 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e  IsAgg && pSrc->n
74f0: 49 64 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  Id>1 ) return 0;
7500: 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
7510: 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
7520: 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
7530: 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 49 64  if( pSubSrc->nId
7540: 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  >1 ) return 0;. 
7550: 20 69 66 28 20 70 53 75 62 2d 3e 69 73 44 69 73   if( pSub->isDis
7560: 74 69 6e 63 74 20 26 26 20 70 53 72 63 2d 3e 6e  tinct && pSrc->n
7570: 49 64 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  Id>1 ) return 0;
7580: 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 69 73 44  .  if( pSub->isD
7590: 69 73 74 69 6e 63 74 20 26 26 20 69 73 41 67 67  istinct && isAgg
75a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
75b0: 66 28 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  f( p->isDistinct
75c0: 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
75d0: 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  g ) return 0;.. 
75e0: 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
75f0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
7600: 65 61 6e 73 20 66 6c 61 74 74 69 6e 67 20 69 73  eans flatting is
7610: 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74   permitted for t
7620: 68 65 0a 20 20 2a 2a 20 69 2d 74 68 20 65 6e 74  he.  ** i-th ent
7630: 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
7640: 6c 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74  lause in the out
7650: 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  er query..  */. 
7660: 20 69 50 61 72 65 6e 74 20 3d 20 70 2d 3e 62 61   iParent = p->ba
7670: 73 65 20 2b 20 69 46 72 6f 6d 3b 0a 20 20 69 53  se + iFrom;.  iS
7680: 75 62 20 3d 20 70 53 75 62 2d 3e 62 61 73 65 3b  ub = pSub->base;
7690: 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
76a0: 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72  (p->pEList, iPar
76b0: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
76c0: 74 2c 20 69 53 75 62 29 3b 0a 20 20 70 4c 69 73  t, iSub);.  pLis
76d0: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
76e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
76f0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
7700: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
7710: 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  [i].zName==0 ){.
7720: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
7730: 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
7740: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4c 69  pExpr;.      pLi
7750: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
7760: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
7770: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45  Expr->span.z, pE
7780: 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20  xpr->span.n);.  
7790: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73    }.  }.  if( is
77a0: 41 67 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74  Agg ){.    subst
77b0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
77c0: 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  upBy, iParent, p
77d0: 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75  Sub->pEList, iSu
77e0: 62 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  b);.    substExp
77f0: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  r(p->pHaving, iP
7800: 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
7810: 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 7d 0a  ist, iSub);.  }.
7820: 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
7830: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61  p->pOrderBy, iPa
7840: 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
7850: 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 69 66 28  st, iSub);.  if(
7860: 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b   pSub->pWhere ){
7870: 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71  .    pWhere = sq
7880: 6c 69 74 65 45 78 70 72 44 75 70 28 70 53 75 62  liteExprDup(pSub
7890: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 69  ->pWhere);.    i
78a0: 66 28 20 69 50 61 72 65 6e 74 21 3d 69 53 75 62  f( iParent!=iSub
78b0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 6e 67 65   ){.      change
78c0: 54 61 62 6c 65 73 28 70 57 68 65 72 65 2c 20 69  Tables(pWhere, i
78d0: 53 75 62 2c 20 69 50 61 72 65 6e 74 29 3b 0a 20  Sub, iParent);. 
78e0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
78f0: 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
7900: 7d 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  }.  if( subquery
7910: 49 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73  IsAgg ){.    ass
7920: 65 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d  ert( p->pHaving=
7930: 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  =0 );.    p->pHa
7940: 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65  ving = p->pWhere
7950: 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
7960: 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75  = pWhere;.    su
7970: 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69  bstExpr(p->pHavi
7980: 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
7990: 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29  b->pEList, iSub)
79a0: 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  ;.    if( pSub->
79b0: 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
79c0: 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 20 3d   Expr *pHaving =
79d0: 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70   sqliteExprDup(p
79e0: 53 75 62 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  Sub->pHaving);. 
79f0: 20 20 20 20 20 69 66 28 20 69 50 61 72 65 6e 74       if( iParent
7a00: 21 3d 69 53 75 62 20 29 7b 0a 20 20 20 20 20 20  !=iSub ){.      
7a10: 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28 70    changeTables(p
7a20: 48 61 76 69 6e 67 2c 20 69 53 75 62 2c 20 69 50  Having, iSub, iP
7a30: 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arent);.      }.
7a40: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61        if( p->pHa
7a50: 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ving ){.        
7a60: 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c  p->pHaving = sql
7a70: 69 74 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20  iteExpr(TK_AND, 
7a80: 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 48 61 76  p->pHaving, pHav
7a90: 69 6e 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ing, 0);.      }
7aa0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d  else{.        p-
7ab0: 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69  >pHaving = pHavi
7ac0: 6e 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ng;.      }.    
7ad0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  }.    assert( p-
7ae0: 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
7af0: 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20      p->pGroupBy 
7b00: 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74  = sqliteExprList
7b10: 44 75 70 28 70 53 75 62 2d 3e 70 47 72 6f 75 70  Dup(pSub->pGroup
7b20: 42 79 29 3b 0a 20 20 20 20 69 66 28 20 69 50 61  By);.    if( iPa
7b30: 72 65 6e 74 21 3d 69 53 75 62 20 29 7b 0a 20 20  rent!=iSub ){.  
7b40: 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73      changeTables
7b50: 49 6e 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  InList(p->pGroup
7b60: 42 79 2c 20 69 53 75 62 2c 20 69 50 61 72 65 6e  By, iSub, iParen
7b70: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  t);.    }.  }els
7b80: 65 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d  e if( p->pWhere=
7b90: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 57 68  =0 ){.    p->pWh
7ba0: 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
7bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74  }else{.    subst
7bc0: 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
7bd0: 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
7be0: 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20  EList, iSub);.  
7bf0: 20 20 69 66 28 20 70 57 68 65 72 65 20 29 7b 0a    if( pWhere ){.
7c00: 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20        p->pWhere 
7c10: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
7c20: 41 4e 44 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  AND, p->pWhere, 
7c30: 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
7c40: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 69 73 44 69 73  }.  }.  p->isDis
7c50: 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
7c60: 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69  tinct || pSub->i
7c70: 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 69 66 28  sDistinct;.  if(
7c80: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
7c90: 70 54 61 62 20 26 26 20 70 53 72 63 2d 3e 61 5b  pTab && pSrc->a[
7ca0: 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 69 73 54  iFrom].pTab->isT
7cb0: 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20  ransient ){.    
7cc0: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
7cd0: 65 28 30 2c 20 70 53 72 63 2d 3e 61 5b 69 46 72  e(0, pSrc->a[iFr
7ce0: 6f 6d 5d 2e 70 54 61 62 29 3b 0a 20 20 7d 0a 20  om].pTab);.  }. 
7cf0: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
7d00: 70 54 61 62 20 3d 20 70 53 75 62 53 72 63 2d 3e  pTab = pSubSrc->
7d10: 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 53 75  a[0].pTab;.  pSu
7d20: 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 20  bSrc->a[0].pTab 
7d30: 3d 20 30 3b 0a 20 20 70 53 72 63 2d 3e 61 5b 69  = 0;.  pSrc->a[i
7d40: 46 72 6f 6d 5d 2e 70 53 65 6c 65 63 74 20 3d 20  From].pSelect = 
7d50: 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  pSubSrc->a[0].pS
7d60: 65 6c 65 63 74 3b 0a 20 20 70 53 75 62 53 72 63  elect;.  pSubSrc
7d70: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[0].pSelect =
7d80: 20 30 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65   0;.  sqliteSele
7d90: 63 74 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a  ctDelete(pSub);.
7da0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
7db0: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
7dc0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
7dd0: 74 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 61  t passed in as a
7de0: 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65  n argument to se
7df0: 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20  e if it.** is a 
7e00: 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
7e10: 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 49 66  max() query.  If
7e20: 20 69 74 20 69 73 20 61 6e 64 20 74 68 69 73 20   it is and this 
7e30: 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20  query can be.** 
7e40: 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
7e50: 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f  a single seek to
7e60: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
7e70: 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65  r end of an inde
7e80: 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72  x,.** then gener
7e90: 61 74 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72  ate the code for
7ea0: 20 74 68 69 73 20 53 45 4c 45 43 54 20 72 65 74   this SELECT ret
7eb0: 75 72 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20  urn 1.  If this 
7ec0: 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d  is not a .** sim
7ed0: 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
7ee0: 28 29 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72  () query, then r
7ef0: 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41  eturn 0;.**.** A
7f00: 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72   simply min() or
7f10: 20 6d 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f   max() query loo
7f20: 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ks like this:.**
7f30: 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69  .**    SELECT mi
7f40: 6e 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b  n(a) FROM table;
7f50: 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61  .**    SELECT ma
7f60: 78 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b  x(a) FROM table;
7f70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79  .**.** The query
7f80: 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61   may have only a
7f90: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
7fa0: 20 69 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65   its FROM argume
7fb0: 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61  nt.  There.** ca
7fc0: 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59  n be no GROUP BY
7fd0: 20 6f 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48   or HAVING or WH
7fe0: 45 52 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68  ERE clauses.  Th
7ff0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73  e result set mus
8000: 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28  t.** be the min(
8010: 29 20 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20  ) or max() of a 
8020: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66  single column of
8030: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65   the table.  The
8040: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68   column.** in th
8050: 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
8060: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
8070: 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a  e indexed..**.**
8080: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   The parameters 
8090: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
80a0: 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
80b0: 66 6f 72 20 73 71 6c 69 74 65 53 65 6c 65 63 74  for sqliteSelect
80c0: 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68  ()..** See the h
80d0: 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
80e0: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f   that routine fo
80f0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
8100: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
8110: 74 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69  tic int simpleMi
8120: 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20  nMaxQuery(Parse 
8130: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
8140: 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  *p, int eDest, i
8150: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 45 78 70  nt iParm){.  Exp
8160: 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74 20  r *pExpr;.  int 
8170: 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iCol;.  Table *p
8180: 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
8190: 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a  dx;.  int base;.
81a0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
81b0: 20 6f 70 65 6e 4f 70 3b 0a 20 20 69 6e 74 20 73   openOp;.  int s
81c0: 65 65 6b 4f 70 3b 0a 20 20 69 6e 74 20 63 6f 6e  eekOp;.  int con
81d0: 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 65 4c  t;.  ExprList eL
81e0: 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78  ist;.  struct Ex
81f0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73  prList_item eLis
8200: 74 49 74 65 6d 3b 0a 0a 20 20 2f 2a 20 43 68 65  tItem;..  /* Che
8210: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ck to see if thi
8220: 73 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d  s query is a sim
8230: 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
8240: 28 29 20 71 75 65 72 79 2e 20 20 52 65 74 75 72  () query.  Retur
8250: 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69  n.  ** zero if i
8260: 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a  t is  not..  */.
8270: 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
8280: 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20  y || p->pHaving 
8290: 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  || p->pWhere ) r
82a0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
82b0: 2d 3e 70 53 72 63 2d 3e 6e 49 64 21 3d 31 20 29  ->pSrc->nId!=1 )
82c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
82d0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
82e0: 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
82f0: 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  .  pExpr = p->pE
8300: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
8310: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
8320: 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
8330: 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
8340: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73   if( pExpr->pLis
8350: 74 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70  t==0 || pExpr->p
8360: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
8370: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
8380: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21   pExpr->token.n!
8390: 3d 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =3 ) return 0;. 
83a0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49   if( sqliteStrNI
83b0: 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  Cmp(pExpr->token
83c0: 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29  .z,"min",3)==0 )
83d0: 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f  {.    seekOp = O
83e0: 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73  P_Rewind;.  }els
83f0: 65 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 4e  e if( sqliteStrN
8400: 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65  ICmp(pExpr->toke
8410: 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20  n.z,"max",3)==0 
8420: 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  ){.    seekOp = 
8430: 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65  OP_Last;.  }else
8440: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
8450: 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 70 45    }.  pExpr = pE
8460: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
8470: 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45  .pExpr;.  if( pE
8480: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
8490: 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
84a0: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
84b0: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d  Column;.  pTab =
84c0: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
84d0: 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  Tab;..  /* If we
84e0: 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74   get to here, it
84f0: 20 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79   means the query
8500: 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65   is of the corre
8510: 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68  ct form..  ** Ch
8520: 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
8530: 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65   we have an inde
8540: 78 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20  x and make pIdx 
8550: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  point to the.  *
8560: 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e  * appropriate in
8570: 64 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e  dex.  If the min
8580: 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
8590: 6e 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  n an INTEGER PRI
85a0: 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f  MARY.  ** key co
85b0: 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69  lumn, no index i
85c0: 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73  s necessary so s
85d0: 65 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e  et pIdx to NULL.
85e0: 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61    If no.  ** usa
85f0: 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75  ble index is fou
8600: 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  nd, return 0..  
8610: 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  */.  if( iCol<0 
8620: 29 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b  ){.    pIdx = 0;
8630: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
8640: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
8650: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
8660: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
8670: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
8680: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a  ->nColumn>=1 );.
8690: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
86a0: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f  aiColumn[0]==iCo
86b0: 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  l ) break;.    }
86c0: 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30  .    if( pIdx==0
86d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
86e0: 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
86f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20  column names if 
8700: 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
8710: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20   the callback.  
8720: 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69  This.  ** step i
8730: 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
8740: 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67   output is going
8750: 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61   to a table or a
8760: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20   memory cell..  
8770: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  */.  v = sqliteG
8780: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
8790: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
87a0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 65 44 65  urn 0;.  if( eDe
87b0: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
87c0: 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
87d0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
87e0: 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 70 2d 3e  se, p->base, p->
87f0: 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29  pSrc, p->pEList)
8800: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
8810: 72 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66  rating code to f
8820: 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74  ind the min or t
8830: 68 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c  he max.  Basical
8840: 6c 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20  ly all we have. 
8850: 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e   ** to do is fin
8860: 64 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 74  d the first or t
8870: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
8880: 20 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65   the chosen inde
8890: 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20  x.  If.  ** the 
88a0: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69  min() or max() i
88b0: 73 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52  s on the INTEGER
88c0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
88d0: 65 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72 73  en find the firs
88e0: 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65  t.  ** or last e
88f0: 6e 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e  ntry in the main
8900: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
8910: 66 28 20 21 70 50 61 72 73 65 2d 3e 73 63 68 65  f( !pParse->sche
8920: 6d 61 56 65 72 69 66 69 65 64 20 26 26 20 28 70  maVerified && (p
8930: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
8940: 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
8950: 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  s)==0 ){.    sql
8960: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8970: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c  OP_VerifyCookie,
8980: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 73 63 68   pParse->db->sch
8990: 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a  ema_cookie, 0);.
89a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65      pParse->sche
89b0: 6d 61 56 65 72 69 66 69 65 64 20 3d 20 31 3b 0a  maVerified = 1;.
89c0: 20 20 7d 0a 20 20 6f 70 65 6e 4f 70 20 3d 20 70    }.  openOp = p
89d0: 54 61 62 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50  Tab->isTemp ? OP
89e0: 5f 4f 70 65 6e 41 75 78 20 3a 20 4f 50 5f 4f 70  _OpenAux : OP_Op
89f0: 65 6e 3b 0a 20 20 62 61 73 65 20 3d 20 70 2d 3e  en;.  base = p->
8a00: 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 56 64  base;.  sqliteVd
8a10: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f  beAddOp(v, openO
8a20: 70 2c 20 62 61 73 65 2c 20 70 54 61 62 2d 3e 74  p, base, pTab->t
8a30: 6e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 56 64  num);.  sqliteVd
8a40: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
8a50: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50  , pTab->zName, P
8a60: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  3_STATIC);.  if(
8a70: 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20   pIdx==0 ){.    
8a80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8a90: 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c  v, seekOp, base,
8aa0: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
8ab0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8ac0: 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 62 61 73  p(v, openOp, bas
8ad0: 65 2b 31 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29  e+1, pIdx->tnum)
8ae0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
8af0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
8b00: 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f  pIdx->zName, P3_
8b10: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
8b20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8b30: 73 65 65 6b 4f 70 2c 20 62 61 73 65 2b 31 2c 20  seekOp, base+1, 
8b40: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
8b50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
8b60: 78 52 65 63 6e 6f 2c 20 62 61 73 65 2b 31 2c 20  xRecno, base+1, 
8b70: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
8b80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
8b90: 6f 73 65 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b  ose, base+1, 0);
8ba0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
8bb0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 54  ddOp(v, OP_MoveT
8bc0: 6f 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d  o, base, 0);.  }
8bd0: 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d  .  eList.nExpr =
8be0: 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c   1;.  memset(&eL
8bf0: 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65  istItem, 0, size
8c00: 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a  of(eListItem));.
8c10: 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69    eList.a = &eLi
8c20: 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e  stItem;.  eList.
8c30: 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78  a[0].pExpr = pEx
8c40: 70 72 3b 0a 20 20 63 6f 6e 74 20 3d 20 73 71 6c  pr;.  cont = sql
8c50: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
8c60: 28 76 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e  (v);.  selectInn
8c70: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 26  erLoop(pParse, &
8c80: 65 4c 69 73 74 2c 20 62 61 73 65 2c 20 31 2c 20  eList, base, 1, 
8c90: 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  0, -1, eDest, iP
8ca0: 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74 29  arm, cont, cont)
8cb0: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 52 65  ;.  sqliteVdbeRe
8cc0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f  solveLabel(v, co
8cd0: 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  nt);.  sqliteVdb
8ce0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
8cf0: 73 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  se, base, 0);.  
8d00: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
8d10: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
8d20: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
8d30: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
8d40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
8d50: 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
8d60: 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
8d70: 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
8d80: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
8d90: 65 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e  eDest and iParm.
8da0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74  .**.**     eDest
8db0: 20 56 61 6c 75 65 20 20 20 20 20 20 20 52 65 73   Value       Res
8dc0: 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d  ult.**     -----
8dd0: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
8de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e00: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52  ------.**     SR
8e10: 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e  T_Callback    In
8e20: 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63  voke the callbac
8e30: 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  k for each row o
8e40: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  f the result..**
8e50: 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20  .**     SRT_Mem 
8e60: 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69          Store fi
8e70: 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65  rst result in me
8e80: 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a  mory cell iParm.
8e90: 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65  **.**     SRT_Se
8ea0: 74 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20  t         Store 
8eb0: 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20  results as keys 
8ec0: 6f 66 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  of a table with 
8ed0: 63 75 72 73 6f 72 20 69 50 61 72 6d 0a 2a 2a 0a  cursor iParm.**.
8ee0: 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e  **     SRT_Union
8ef0: 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
8f00: 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e  ults as a key in
8f10: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
8f20: 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  le iParm.**.**  
8f30: 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20     SRT_Except   
8f40: 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74     Remove result
8f50: 73 20 66 6f 72 6d 20 74 68 65 20 74 65 6d 70 6f  s form the tempo
8f60: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
8f70: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
8f80: 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72  Table       Stor
8f90: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d  e results in tem
8fa0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
8fb0: 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  rm.**.** This ro
8fc0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
8fd0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
8fe0: 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
8ff0: 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
9000: 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
9010: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
9020: 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
9030: 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
9040: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
9050: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
9060: 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
9070: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
9080: 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
9090: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
90a0: 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
90b0: 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50  at..**.** The pP
90c0: 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62  arent, parentTab
90d0: 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67  , and *pParentAg
90e0: 67 20 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c  g fields are fil
90f0: 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a  led in if this.*
9100: 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20 73 75  * SELECT is a su
9110: 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f  bquery.  This ro
9120: 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f  utine may try to
9130: 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45   combine this SE
9140: 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73  LECT.** with its
9150: 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20   parent to form 
9160: 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75  a single flat qu
9170: 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e  ery.  In so doin
9180: 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63  g, it might.** c
9190: 68 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74  hange the parent
91a0: 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f   query from a no
91b0: 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20 61  n-aggregate to a
91c0: 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
91d0: 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72  y..** For that r
91e0: 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65  eason, the pPare
91f0: 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20 70 61  ntAgg flag is pa
9200: 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  ssed as a pointe
9210: 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20  r, so it.** can 
9220: 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69  be changed..*/.i
9230: 6e 74 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28  nt sqliteSelect(
9240: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9250: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
9260: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
9270: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
9280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9290: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
92a0: 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
92b0: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c   */.  int eDest,
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
92d0: 4f 6e 65 20 6f 66 3a 20 53 52 54 5f 43 61 6c 6c  One of: SRT_Call
92e0: 62 61 63 6b 20 4d 65 6d 20 53 65 74 20 55 6e 69  back Mem Set Uni
92f0: 6f 6e 20 45 78 63 65 70 74 20 2a 2f 0a 20 20 69  on Except */.  i
9300: 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20  nt iParm,       
9310: 20 20 20 20 20 20 2f 2a 20 53 61 76 65 20 72 65        /* Save re
9320: 73 75 6c 74 20 69 6e 20 74 68 69 73 20 6d 65 6d  sult in this mem
9330: 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2c 20 69 66  ory location, if
9340: 20 3e 3d 30 20 2a 2f 0a 20 20 53 65 6c 65 63 74   >=0 */.  Select
9350: 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20   *pParent,      
9360: 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
9370: 43 54 20 66 6f 72 20 77 68 69 63 68 20 74 68 69  CT for which thi
9380: 73 20 69 73 20 61 20 73 75 62 2d 71 75 65 72 79  s is a sub-query
9390: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74   */.  int parent
93a0: 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab,         /* 
93b0: 49 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74  Index in pParent
93c0: 2d 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20 71  ->pSrc of this q
93d0: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  uery */.  int *p
93e0: 50 61 72 65 6e 74 41 67 67 20 20 20 20 20 20 20  ParentAgg       
93f0: 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72   /* True if pPar
9400: 65 6e 74 20 75 73 65 73 20 61 67 67 72 65 67 61  ent uses aggrega
9410: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
9420: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  ){.  int i;.  Wh
9430: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
9440: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
9450: 74 20 69 73 41 67 67 20 3d 20 30 3b 20 20 20 20  t isAgg = 0;    
9460: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
9470: 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
9480: 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
9490: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
94a0: 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist;      /* Lis
94b0: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
94c0: 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 49 64  extract. */.  Id
94d0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
94e0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
94f0: 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
9500: 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
9510: 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
9520: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
9530: 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
9540: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
9550: 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
9560: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
9570: 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
9580: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
9590: 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
95a0: 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
95b0: 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
95c0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
95d0: 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20  *pHaving;       
95e0: 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20    /* The HAVING 
95f0: 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
9600: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  NULL */.  int is
9610: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
9620: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
9630: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
9640: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
9650: 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20   int distinct;  
9660: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
9670: 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
9680: 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a  distinct set */.
9690: 20 20 69 6e 74 20 62 61 73 65 3b 20 20 20 20 20    int base;     
96a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
96b0: 74 20 63 75 72 73 6f 72 20 61 76 61 69 6c 61 62  t cursor availab
96c0: 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 20 20  le for use */.  
96d0: 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20  int rc = 1;     
96e0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
96f0: 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74  to return from t
9700: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
9710: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61  .  if( sqlite_ma
9720: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70  lloc_failed || p
9730: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
9740: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
9750: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
9760: 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65  s are a sequence
9770: 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20   of queries, do 
9780: 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73  the earlier ones
9790: 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69   first..  */.  i
97a0: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
97b0: 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
97c0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
97d0: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b  , eDest, iParm);
97e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
97f0: 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20  local copies of 
9800: 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 66  the parameters f
9810: 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20  or this query.. 
9820: 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d   */.  pTabList =
9830: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68 65   p->pSrc;.  pWhe
9840: 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
9850: 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
9860: 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 47 72 6f  pOrderBy;.  pGro
9870: 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
9880: 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
9890: 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73  p->pHaving;.  is
98a0: 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
98b0: 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20  Distinct;..  /* 
98c0: 41 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b  Allocate a block
98d0: 20 6f 66 20 56 44 42 45 20 63 75 72 73 6f 72 73   of VDBE cursors
98e0: 2c 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 74  , one for each t
98f0: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
9900: 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 54 68   clause..  ** Th
9910: 65 20 57 48 45 52 45 20 70 72 6f 63 65 73 73 69  e WHERE processi
9920: 6e 67 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ng requires that
9930: 20 74 68 65 20 63 75 72 73 6f 72 73 20 66 6f 72   the cursors for
9940: 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
9950: 68 65 0a 20 20 2a 2a 20 46 52 4f 4d 20 63 6c 61  he.  ** FROM cla
9960: 75 73 65 20 62 65 20 63 6f 6e 73 65 63 75 74 69  use be consecuti
9970: 76 65 2e 0a 20 20 2a 2f 0a 20 20 62 61 73 65 20  ve..  */.  base 
9980: 3d 20 70 2d 3e 62 61 73 65 20 3d 20 70 50 61 72  = p->base = pPar
9990: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 70 50 61 72  se->nTab;.  pPar
99a0: 73 65 2d 3e 6e 54 61 62 20 2b 3d 20 70 54 61 62  se->nTab += pTab
99b0: 4c 69 73 74 2d 3e 6e 49 64 3b 0a 0a 20 20 2f 2a  List->nId;..  /*
99c0: 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76   .  ** Do not ev
99d0: 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65  en attempt to ge
99e0: 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20  nerate any code 
99f0: 69 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61  if we have alrea
9a00: 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72  dy seen.  ** err
9a10: 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69 73 20  ors before this 
9a20: 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a  routine starts..
9a30: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
9a40: 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f  e->nErr>0 ) goto
9a50: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
9a60: 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79  /* Look up every
9a70: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61   table in the ta
9a80: 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 63 72 65  ble list and cre
9a90: 61 74 65 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ate an appropria
9aa0: 74 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 6c 69  te.  ** columnli
9ab0: 73 74 20 69 6e 20 70 45 4c 69 73 74 20 69 66 20  st in pEList if 
9ac0: 74 68 65 72 65 20 69 73 6e 27 74 20 6f 6e 65 20  there isn't one 
9ad0: 61 6c 72 65 61 64 79 2e 20 20 28 54 68 65 20 70  already.  (The p
9ae0: 61 72 73 65 72 20 6c 65 61 76 65 73 0a 20 20 2a  arser leaves.  *
9af0: 2a 20 61 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20  * a NULL in the 
9b00: 70 2d 3e 70 45 4c 69 73 74 20 69 66 20 74 68 65  p->pEList if the
9b10: 20 53 51 4c 20 73 61 69 64 20 22 53 45 4c 45 43   SQL said "SELEC
9b20: 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e 22 29 0a 20  T * FROM ..."). 
9b30: 20 2a 2f 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e   */.  if( fillIn
9b40: 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73  ColumnList(pPars
9b50: 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 67 6f 74  e, p) ){.    got
9b60: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
9b70: 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  }.  pEList = p->
9b80: 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
9b90: 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73  List==0 ) goto s
9ba0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
9bb0: 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d   If writing to m
9bc0: 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74  emory or generat
9bd0: 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f  ing a set.  ** o
9be0: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c  nly a single col
9bf0: 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75  umn may be outpu
9c00: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65  t..  */.  if( (e
9c10: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
9c20: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29   eDest==SRT_Set)
9c30: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
9c40: 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>1 ){.    sqlit
9c50: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
9c60: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6f 6e  se->zErrMsg, "on
9c70: 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  ly a single resu
9c80: 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22  lt allowed for "
9c90: 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43  .       "a SELEC
9ca0: 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  T that is part o
9cb0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22  f an expression"
9cc0: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
9cd0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
9ce0: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
9cf0: 20 7d 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42   }..  /* ORDER B
9d00: 59 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  Y is ignored if 
9d10: 77 65 20 61 72 65 20 6e 6f 74 20 73 65 6e 64 69  we are not sendi
9d20: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 74 6f  ng the result to
9d30: 20 61 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 20 2a   a callback..  *
9d40: 2f 0a 20 20 69 66 28 20 65 44 65 73 74 21 3d 53  /.  if( eDest!=S
9d50: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
9d60: 20 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73     sqliteExprLis
9d70: 74 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65  tDelete(p->pOrde
9d80: 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72  rBy);.    pOrder
9d90: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
9da0: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
9db0: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77  At this point, w
9dc0: 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  e should have al
9dd0: 6c 6f 63 61 74 65 64 20 61 6c 6c 20 74 68 65 20  located all the 
9de0: 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 0a  cursors that we.
9df0: 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 68 61 6e    ** need to han
9e00: 64 6c 65 20 73 75 62 71 75 65 72 79 73 20 61 6e  dle subquerys an
9e10: 64 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  d temporary tabl
9e20: 65 73 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  es.  .  **.  ** 
9e30: 52 65 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75  Resolve the colu
9e40: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 64 6f 20  mn names and do 
9e50: 61 20 73 65 6d 61 6e 74 69 63 73 20 63 68 65 63  a semantics chec
9e60: 6b 20 6f 6e 20 61 6c 6c 20 74 68 65 20 65 78 70  k on all the exp
9e70: 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
9e80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
9e90: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
9ea0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
9eb0: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
9ec0: 61 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62  arse, base, pTab
9ed0: 4c 69 73 74 2c 20 30 2c 20 70 45 4c 69 73 74 2d  List, 0, pEList-
9ee0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
9ef0: 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
9f00: 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
9f10: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43   if( sqliteExprC
9f20: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 4c  heck(pParse, pEL
9f30: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
9f40: 20 31 2c 20 26 69 73 41 67 67 29 20 29 7b 0a 20   1, &isAgg) ){. 
9f50: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
9f60: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _end;.    }.  }.
9f70: 20 20 69 66 28 20 70 57 68 65 72 65 20 29 7b 0a    if( pWhere ){.
9f80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
9f90: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
9fa0: 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c  rse, base, pTabL
9fb0: 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 57 68  ist, pEList, pWh
9fc0: 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ere) ){.      go
9fd0: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
9fe0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
9ff0: 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61  iteExprCheck(pPa
a000: 72 73 65 2c 20 70 57 68 65 72 65 2c 20 30 2c 20  rse, pWhere, 0, 
a010: 30 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  0) ){.      goto
a020: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
a030: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 72   }.  }.  if( pOr
a040: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 66 6f 72  derBy ){.    for
a050: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
a060: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
a070: 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
a080: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
a090: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
a0a0: 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73  sqliteExprIsCons
a0b0: 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20  tant(pE) ){.    
a0c0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
a0d0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
a0e0: 72 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20  rMsg, .         
a0f0: 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 65 78      "ORDER BY ex
a100: 70 72 65 73 73 69 6f 6e 73 20 73 68 6f 75 6c 64  pressions should
a110: 20 6e 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e 74   not be constant
a120: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ", 0);.        p
a130: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
a140: 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
a150: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
a160: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
a170: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
a180: 50 61 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61  Parse, base, pTa
a190: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70  bList, pEList, p
a1a0: 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  E) ){.        go
a1b0: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
a1c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a1d0: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
a1e0: 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73 41  (pParse, pE, isA
a1f0: 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  gg, 0) ){.      
a200: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
a210: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
a220: 0a 20 20 7d 0a 20 20 69 66 28 20 70 47 72 6f 75  .  }.  if( pGrou
a230: 70 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  pBy ){.    for(i
a240: 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; i<pGroupBy->
a250: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
a260: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 47     Expr *pE = pG
a270: 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
a280: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  pr;.      if( sq
a290: 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61  liteExprIsConsta
a2a0: 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20  nt(pE) ){.      
a2b0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
a2c0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
a2d0: 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sg, .           
a2e0: 20 20 22 47 52 4f 55 50 20 42 59 20 65 78 70 72    "GROUP BY expr
a2f0: 65 73 73 69 6f 6e 73 20 73 68 6f 75 6c 64 20 6e  essions should n
a300: 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 22 2c  ot be constant",
a310: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
a320: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
a330: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
a340: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
a350: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
a360: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
a370: 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c  rse, base, pTabL
a380: 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 29  ist, pEList, pE)
a390: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
a3a0: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
a3b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
a3c0: 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70  qliteExprCheck(p
a3d0: 50 61 72 73 65 2c 20 70 45 2c 20 69 73 41 67 67  Parse, pE, isAgg
a3e0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
a3f0: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
a400: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a410: 20 7d 0a 20 20 69 66 28 20 70 48 61 76 69 6e 67   }.  if( pHaving
a420: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 47 72 6f   ){.    if( pGro
a430: 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  upBy==0 ){.     
a440: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
a450: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
a460: 67 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63  g, "a GROUP BY c
a470: 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65  lause is require
a480: 64 20 22 0a 20 20 20 20 20 20 20 20 20 22 62 65  d ".         "be
a490: 66 6f 72 65 20 48 41 56 49 4e 47 22 2c 20 30 29  fore HAVING", 0)
a4a0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
a4b0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f  nErr++;.      go
a4c0: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
a4d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
a4e0: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
a4f0: 73 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20  s(pParse, base, 
a500: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
a510: 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  , pHaving) ){.  
a520: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
a530: 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
a540: 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
a550: 63 6b 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  ck(pParse, pHavi
a560: 6e 67 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b  ng, isAgg, 0) ){
a570: 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
a580: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
a590: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
a5a0: 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  r the special ca
a5b0: 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72  se of a min() or
a5c0: 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20   max() function 
a5d0: 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  by itself.  ** i
a5e0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
a5f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d  ..  */.  if( sim
a600: 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70  pleMinMaxQuery(p
a610: 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
a620: 20 69 50 61 72 6d 29 20 29 7b 0a 20 20 20 20 72   iParm) ){.    r
a630: 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 0;.    goto 
a640: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
a650: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
a660: 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
a670: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  /.  v = sqliteGe
a680: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
a690: 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
a6a0: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
a6b0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
a6c0: 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
a6d0: 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
a6e0: 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 66   clause.  */.  f
a6f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
a700: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
a710: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
a720: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30  >a[i].pSelect==0
a730: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
a740: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
a750: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e  arse, pTabList->
a760: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53 52  a[i].pSelect, SR
a770: 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20 62 61 73  T_TempTable, bas
a780: 65 2b 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20  e+i,.           
a790: 20 20 20 20 20 20 70 2c 20 69 2c 20 26 69 73 41        p, i, &isA
a7a0: 67 67 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  gg);.    pTabLis
a7b0: 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
a7c0: 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
a7d0: 65 72 65 3b 0a 20 20 20 20 70 4f 72 64 65 72 42  ere;.    pOrderB
a7e0: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
a7f0: 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
a800: 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
a810: 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
a820: 61 76 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73  aving;.    isDis
a830: 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
a840: 74 69 6e 63 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  tinct;.  }..  /*
a850: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
a860: 20 74 68 69 73 20 69 73 20 61 20 73 75 62 71 75   this is a subqu
a870: 65 72 79 20 74 68 61 74 20 63 61 6e 20 62 65 20  ery that can be 
a880: 22 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f  "flattened" into
a890: 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a   its parent..  *
a8a0: 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
a8b0: 69 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c  is a possiblity,
a8c0: 20 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72   do so and retur
a8d0: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20  n immediately.  
a8e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
a8f0: 65 6e 74 20 26 26 20 70 50 61 72 65 6e 74 41 67  ent && pParentAg
a900: 67 20 26 26 0a 20 20 20 20 20 20 66 6c 61 74 74  g &&.      flatt
a910: 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 65  enSubquery(pPare
a920: 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 2a  nt, parentTab, *
a930: 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73 41 67  pParentAgg, isAg
a940: 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  g) ){.    if( is
a950: 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74 41 67  Agg ) *pParentAg
a960: 67 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  g = 1;.    retur
a970: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
a980: 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
a990: 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
a9a0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
a9b0: 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
a9c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
a9d0: 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c  st==SRT_TempTabl
a9e0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  e ){.    sqliteV
a9f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
aa00: 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20  penTemp, iParm, 
aa10: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  0);.  }..  /* Do
aa20: 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20   an analysis of 
aa30: 61 67 67 72 65 67 61 74 65 20 65 78 70 72 65 73  aggregate expres
aa40: 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  sions..  */.  sq
aa50: 6c 69 74 65 41 67 67 72 65 67 61 74 65 49 6e 66  liteAggregateInf
aa60: 6f 52 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a  oReset(pParse);.
aa70: 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
aa80: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
aa90: 65 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a 20 20  e->nAgg==0 );.  
aaa0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
aab0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
aac0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
aad0: 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  teExprAnalyzeAgg
aae0: 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
aaf0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
ab00: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67  pr) ){.        g
ab10: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
ab20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ab30: 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
ab40: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
ab50: 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
ab60: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
ab70: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
ab80: 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
ab90: 73 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  s(pParse, pGroup
aba0: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  By->a[i].pExpr) 
abb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
abc0: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
abd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
abe0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48      }.    if( pH
abf0: 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65 45  aving && sqliteE
ac00: 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
ac10: 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 48 61  ates(pParse, pHa
ac20: 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
ac30: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
ac40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f      }.    if( pO
ac50: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
ac60: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
ac70: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
ac80: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
ac90: 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
aca0: 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
acb0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
acc0: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
acd0: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
ace0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
acf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ad00: 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
ad10: 6c 69 6d 69 74 65 72 0a 20 20 2a 2f 0a 20 20 69  limiter.  */.  i
ad20: 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3c 3d 30 20  f( p->nLimit<=0 
ad30: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65  ){.    p->nOffse
ad40: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
ad50: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 66 66 73      if( p->nOffs
ad60: 65 74 3c 30 20 29 20 70 2d 3e 6e 4f 66 66 73 65  et<0 ) p->nOffse
ad70: 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t = 0;.    sqlit
ad80: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
ad90: 5f 4c 69 6d 69 74 2c 20 70 2d 3e 6e 4c 69 6d 69  _Limit, p->nLimi
ada0: 74 2c 20 70 2d 3e 6e 4f 66 66 73 65 74 29 3b 0a  t, p->nOffset);.
adb0: 20 20 7d 0a 20 20 20 20 0a 0a 20 20 2f 2a 20 49    }.    ..  /* I
adc0: 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e  dentify column n
add0: 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20  ames if we will 
ade0: 62 65 20 75 73 69 6e 67 20 69 6e 20 74 68 65 20  be using in the 
adf0: 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a  callback.  This.
ae00: 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69    ** step is ski
ae10: 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70  pped if the outp
ae20: 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61  ut is going to a
ae30: 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f   table or a memo
ae40: 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  ry cell..  */.  
ae50: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
ae60: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67  allback ){.    g
ae70: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
ae80: 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61  es(pParse, p->ba
ae90: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
aea0: 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
aeb0: 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65   Reset the aggre
aec0: 67 61 74 6f 72 0a 20 20 2a 2f 0a 20 20 69 66 28  gator.  */.  if(
aed0: 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 71   isAgg ){.    sq
aee0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
aef0: 20 4f 50 5f 41 67 67 52 65 73 65 74 2c 20 30 2c   OP_AggReset, 0,
af00: 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 29 3b 0a   pParse->nAgg);.
af10: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
af20: 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
af30: 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  ){.      FuncDef
af40: 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 69   *pFunc;.      i
af50: 66 28 20 28 70 46 75 6e 63 20 3d 20 70 50 61 72  f( (pFunc = pPar
af60: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e  se->aAgg[i].pFun
af70: 63 29 21 3d 30 20 26 26 20 70 46 75 6e 63 2d 3e  c)!=0 && pFunc->
af80: 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a  xFinalize!=0 ){.
af90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
afa0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
afb0: 67 49 6e 69 74 2c 20 30 2c 20 69 29 3b 0a 20 20  gInit, 0, i);.  
afc0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
afd0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
afe0: 28 63 68 61 72 2a 29 70 46 75 6e 63 2c 20 50 33  (char*)pFunc, P3
aff0: 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 20  _POINTER);.     
b000: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
b010: 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
b020: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b030: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
b040: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
b050: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b060: 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c  (v, OP_AggFocus,
b070: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
b080: 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
b090: 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  ze the memory ce
b0a0: 6c 6c 20 74 6f 20 4e 55 4c 4c 0a 20 20 2a 2f 0a  ll to NULL.  */.
b0b0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
b0c0: 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69  _Mem ){.    sqli
b0d0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b0e0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
b0f0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
b100: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
b110: 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ore, iParm, 1);.
b120: 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
b130: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
b140: 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
b150: 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
b160: 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69  */.  if( isDisti
b170: 6e 63 74 20 29 7b 0a 20 20 20 20 64 69 73 74 69  nct ){.    disti
b180: 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
b190: 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  ab++;.    sqlite
b1a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b1b0: 4f 70 65 6e 54 65 6d 70 2c 20 64 69 73 74 69 6e  OpenTemp, distin
b1c0: 63 74 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  ct, 1);.  }else{
b1d0: 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
b1e0: 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  -1;.  }..  /* Be
b1f0: 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
b200: 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 70 57 49   scan.  */.  pWI
b210: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 57 68 65 72  nfo = sqliteWher
b220: 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
b230: 2d 3e 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74  ->base, pTabList
b240: 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  , pWhere, 0);.  
b250: 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
b260: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
b270: 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73  ..  /* Use the s
b280: 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
b290: 6f 70 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  op if we are not
b2a0: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 0a 20 20   dealing with.  
b2b0: 2a 2a 20 61 67 67 72 65 67 61 74 65 73 0a 20 20  ** aggregates.  
b2c0: 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  */.  if( !isAgg 
b2d0: 29 7b 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63  ){.    if( selec
b2e0: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
b2f0: 65 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  e, pEList, 0, 0,
b300: 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69   pOrderBy, disti
b310: 6e 63 74 2c 20 65 44 65 73 74 2c 20 69 50 61 72  nct, eDest, iPar
b320: 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
b330: 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69         pWInfo->i
b340: 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f  Continue, pWInfo
b350: 2d 3e 69 42 72 65 61 6b 29 20 29 7b 0a 20 20 20  ->iBreak) ){.   
b360: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
b370: 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  end;.    }.  }..
b380: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
b390: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 67 67 72  ealing with aggr
b3a0: 65 67 61 74 65 73 2c 20 74 68 65 6e 20 74 6f 20  egates, then to 
b3b0: 74 68 65 20 73 70 65 63 69 61 6c 20 61 67 67 72  the special aggr
b3c0: 65 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f 63 65  egate.  ** proce
b3d0: 73 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20 20  ssing.  .  */.  
b3e0: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 47  else{.    if( pG
b3f0: 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
b400: 69 6e 74 20 6c 62 6c 31 3b 0a 20 20 20 20 20 20  int lbl1;.      
b410: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75  for(i=0; i<pGrou
b420: 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pBy->nExpr; i++)
b430: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b440: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
b450: 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e   pGroupBy->a[i].
b460: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
b470: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b480: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
b490: 4b 65 79 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Key, pGroupBy->n
b4a0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
b4b0: 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62  lbl1 = sqliteVdb
b4c0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
b4d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
b4e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f  ddOp(v, OP_AggFo
b4f0: 63 75 73 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a 20  cus, 0, lbl1);. 
b500: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
b510: 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b  pParse->nAgg; i+
b520: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
b530: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
b540: 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65  isAgg ) continue
b550: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b560: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
b570: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
b580: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
b590: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b5a0: 28 76 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20 30  (v, OP_AggSet, 0
b5b0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
b5c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
b5d0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
b5e0: 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  l1);.    }.    f
b5f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
b600: 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAgg; i++){.  
b610: 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20      Expr *pE;.  
b620: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
b630: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 61 41   if( !pParse->aA
b640: 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f  gg[i].isAgg ) co
b650: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45  ntinue;.      pE
b660: 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b   = pParse->aAgg[
b670: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
b680: 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 3d 3d  assert( pE->op==
b690: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
b6a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
b6b0: 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  >pList ){.      
b6c0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 2d    for(j=0; j<pE-
b6d0: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a  >pList->nExpr; j
b6e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
b6f0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
b700: 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2d  arse, pE->pList-
b710: 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[j].pExpr);.  
b720: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b730: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b740: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
b750: 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ger, i, 0);.    
b760: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
b770: 70 28 76 2c 20 4f 50 5f 41 67 67 46 75 6e 63 2c  p(v, OP_AggFunc,
b780: 20 30 2c 20 70 45 2d 3e 70 4c 69 73 74 20 3f 20   0, pE->pList ? 
b790: 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pE->pList->nExpr
b7a0: 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73   : 0);.      ass
b7b0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61 41 67  ert( pParse->aAg
b7c0: 67 5b 69 5d 2e 70 46 75 6e 63 21 3d 30 20 29 3b  g[i].pFunc!=0 );
b7d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b7e0: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
b7f0: 46 75 6e 63 2d 3e 78 53 74 65 70 21 3d 30 20 29  Func->xStep!=0 )
b800: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
b810: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
b820: 2c 20 28 63 68 61 72 2a 29 70 50 61 72 73 65 2d  , (char*)pParse-
b830: 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 2c 20  >aAgg[i].pFunc, 
b840: 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20  P3_POINTER);.   
b850: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64   }.  }..  /* End
b860: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
b870: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20  an loop..  */.  
b880: 73 71 6c 69 74 65 57 68 65 72 65 45 6e 64 28 70  sqliteWhereEnd(p
b890: 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66  WInfo);..  /* If
b8a0: 20 77 65 20 61 72 65 20 70 72 6f 63 65 73 73 69   we are processi
b8b0: 6e 67 20 61 67 67 72 65 67 61 74 65 73 2c 20 77  ng aggregates, w
b8c0: 65 20 6e 65 65 64 20 74 6f 20 73 65 74 20 75 70  e need to set up
b8d0: 20 61 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20   a second loop. 
b8e0: 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20   ** over all of 
b8f0: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 76 61  the aggregate va
b900: 6c 75 65 73 20 61 6e 64 20 70 72 6f 63 65 73 73  lues and process
b910: 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66   them..  */.  if
b920: 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69  ( isAgg ){.    i
b930: 6e 74 20 65 6e 64 61 67 67 20 3d 20 73 71 6c 69  nt endagg = sqli
b940: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
b950: 76 29 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  v);.    int star
b960: 74 61 67 67 3b 0a 20 20 20 20 73 74 61 72 74 61  tagg;.    starta
b970: 67 67 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  gg = sqliteVdbeA
b980: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 4e 65  ddOp(v, OP_AggNe
b990: 78 74 2c 20 30 2c 20 65 6e 64 61 67 67 29 3b 0a  xt, 0, endagg);.
b9a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41      pParse->useA
b9b0: 67 67 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  gg = 1;.    if( 
b9c0: 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
b9d0: 20 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c   sqliteExprIfFal
b9e0: 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
b9f0: 6e 67 2c 20 73 74 61 72 74 61 67 67 29 3b 0a 20  ng, startagg);. 
ba00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 65 6c     }.    if( sel
ba10: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
ba20: 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20  rse, pEList, 0, 
ba30: 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73  0, pOrderBy, dis
ba40: 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 20 69 50  tinct, eDest, iP
ba50: 61 72 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  arm,.           
ba60: 20 20 20 20 20 20 20 20 20 73 74 61 72 74 61 67           startag
ba70: 67 2c 20 65 6e 64 61 67 67 29 20 29 7b 0a 20 20  g, endagg) ){.  
ba80: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
ba90: 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  end;.    }.    s
baa0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
bab0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74  , OP_Goto, 0, st
bac0: 61 72 74 61 67 67 29 3b 0a 20 20 20 20 73 71 6c  artagg);.    sql
bad0: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
bae0: 62 65 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a  bel(v, endagg);.
baf0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
bb00: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20  dOp(v, OP_Noop, 
bb10: 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  0, 0);.    pPars
bb20: 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 20  e->useAgg = 0;. 
bb30: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
bb40: 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
bb50: 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65   clause, then we
bb60: 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68   need to sort th
bb70: 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61  e results.  ** a
bb80: 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20  nd send them to 
bb90: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65  the callback one
bba0: 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   by one..  */.  
bbb0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
bbc0: 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
bbd0: 54 61 69 6c 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Tail(v, pEList->
bbe0: 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 0a 20 20  nExpr);.  }...  
bbf0: 2f 2a 20 49 73 73 75 65 20 61 20 6e 75 6c 6c 20  /* Issue a null 
bc00: 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 61 74  callback if that
bc10: 20 69 73 20 77 68 61 74 20 74 68 65 20 75 73 65   is what the use
bc20: 72 20 77 61 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  r wants..  */.  
bc30: 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d  if( (pParse->db-
bc40: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
bc50: 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 29 21 3d 30  NullCallback)!=0
bc60: 20 26 26 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   && eDest==SRT_C
bc70: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 73  allback ){.    s
bc80: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
bc90: 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63  , OP_NullCallbac
bca0: 6b 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  k, pEList->nExpr
bcb0: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
bcc0: 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73  The SELECT was s
bcd0: 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65  uccessfully code
bce0: 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74  d.   Set the ret
bcf0: 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20  urn code to 0.  
bd00: 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e  ** to indicate n
bd10: 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20  o errors..  */. 
bd20: 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43   rc = 0;..  /* C
bd30: 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20  ontrol jumps to 
bd40: 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72  here if an error
bd50: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
bd60: 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20  above, or upon. 
bd70: 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63   ** successful c
bd80: 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c  oding of the SEL
bd90: 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74  ECT..  */.select
bda0: 5f 65 6e 64 3a 0a 20 20 70 50 61 72 73 65 2d 3e  _end:.  pParse->
bdb0: 6e 54 61 62 20 3d 20 62 61 73 65 3b 0a 20 20 73  nTab = base;.  s
bdc0: 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49 6e  qliteAggregateIn
bdd0: 66 6f 52 65 73 65 74 28 70 50 61 72 73 65 29 3b  foReset(pParse);
bde0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.