/ Hex Artifact Content
Login

Artifact c74b6349d5630e05aceef73aaa8ed5e09a793fc4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 36 37 20  select.c,v 1.67 
0200: 32 30 30 32 2f 30 32 2f 32 37 20 30 31 3a 34 37  2002/02/27 01:47
0210: 3a 31 32 20 64 72 68 20 45 78 70 20 24 0a 2a 2f  :12 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 69 41 67 67 43 6f 75 6e 74  Parse->iAggCount
0970: 20 3d 20 2d 31 3b 0a 20 20 70 50 61 72 73 65 2d   = -1;.  pParse-
0980: 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 7d 0a 0a  >useAgg = 0;.}..
0990: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
09a0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
09b0: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
09c0: 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  side of the inne
09d0: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53  r loop.** of a S
09e0: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ELECT..**.** The
09f0: 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20   pEList is used 
0a00: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
0a10: 20 76 61 6c 75 65 73 20 66 6f 72 20 65 61 63 68   values for each
0a20: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a 2a   column in the.*
0a30: 2a 20 72 65 73 75 6c 74 20 72 6f 77 2e 20 20 45  * result row.  E
0a40: 78 63 65 70 74 20 20 69 66 20 70 45 4c 69 73 74  xcept  if pEList
0a50: 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 77 65 20  ==NULL, then we 
0a60: 6a 75 73 74 20 72 65 61 64 20 6e 43 6f 6c 75 6d  just read nColum
0a70: 6e 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 66 72  n.** elements fr
0a80: 6f 6d 20 74 68 65 20 73 72 63 54 61 62 20 74 61  om the srcTab ta
0a90: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
0aa0: 6e 74 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  nt selectInnerLo
0ab0: 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  op(.  Parse *pPa
0ac0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
0ad0: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
0ae0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
0af0: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
0b00: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75   /* List of valu
0b10: 65 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74  es being extract
0b20: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54  ed */.  int srcT
0b30: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
0b40: 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f  /* Pull data fro
0b50: 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  m this table */.
0b60: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
0b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0b80: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
0b90: 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  n the source tab
0ba0: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
0bb0: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
0bc0: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
0bd0: 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73 69  sort results usi
0be0: 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20  ng this key */. 
0bf0: 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20   int distinct,  
0c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e           /* If >
0c10: 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65  =0, make sure re
0c20: 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e  sults are distin
0c30: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ct */.  int eDes
0c40: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
0c50: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
0c60: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
0c70: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c   */.  int iParm,
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0c90: 20 41 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   An argument to 
0ca0: 74 68 65 20 64 69 73 70 6f 73 61 6c 20 6d 65 74  the disposal met
0cb0: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  hod */.  int iCo
0cc0: 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20  ntinue,         
0cd0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
0ce0: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
0cf0: 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ext row */.  int
0d00: 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20   iBreak         
0d10: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
0d20: 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
0d30: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
0d40: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
0d50: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
0d60: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
0d70: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   v==0 ) return 0
0d80: 3b 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65  ;..  /* Pull the
0d90: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d   requested colum
0da0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ns..  */.  if( p
0db0: 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  EList ){.    for
0dc0: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
0dd0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
0de0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
0df0: 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  e(pParse, pEList
0e00: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
0e10: 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e     }.    nColumn
0e20: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
0e30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
0e40: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
0e50: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  n; i++){.      s
0e60: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
0e70: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
0e80: 54 61 62 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  Tab, i);.    }. 
0e90: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
0ea0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
0eb0: 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20   was present on 
0ec0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
0ed0: 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ment.  ** and th
0ee0: 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20  is row has been 
0ef0: 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65  seen before, the
0f00: 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68  n do not make th
0f10: 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74  is row.  ** part
0f20: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   of the result..
0f30: 20 20 2a 2f 0a 20 20 69 66 28 20 64 69 73 74 69    */.  if( disti
0f40: 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  nct>=0 ){.    in
0f50: 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 56 64  t lbl = sqliteVd
0f60: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
0f70: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
0f80: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65  dOp(v, OP_MakeKe
0f90: 79 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  y, pEList->nExpr
0fa0: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
0fb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
0fc0: 44 69 73 74 69 6e 63 74 2c 20 64 69 73 74 69 6e  Distinct, distin
0fd0: 63 74 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 73 71  ct, lbl);.    sq
0fe0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
0ff0: 20 4f 50 5f 50 6f 70 2c 20 70 45 4c 69 73 74 2d   OP_Pop, pEList-
1000: 3e 6e 45 78 70 72 2b 31 2c 20 30 29 3b 0a 20 20  >nExpr+1, 0);.  
1010: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
1020: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
1030: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20   iContinue);.   
1040: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
1050: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
1060: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
1070: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
1080: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  g, 0, 0);.    sq
1090: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
10a0: 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 64   OP_PutStrKey, d
10b0: 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d  istinct, 0);.  }
10c0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
10d0: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
10e0: 6c 61 75 73 65 2c 20 74 68 65 6e 20 73 74 6f 72  lause, then stor
10f0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  e the results.  
1100: 2a 2a 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 0a  ** in a sorter..
1110: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
1120: 72 42 79 20 29 7b 0a 20 20 20 20 63 68 61 72 20  rBy ){.    char 
1130: 2a 7a 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  *zSortOrder;.   
1140: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1150: 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 52  (v, OP_SortMakeR
1160: 65 63 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  ec, nColumn, 0);
1170: 0a 20 20 20 20 7a 53 6f 72 74 4f 72 64 65 72 20  .    zSortOrder 
1180: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
1190: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
11a0: 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  + 1 );.    if( z
11b0: 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 29 20 72  SortOrder==0 ) r
11c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 66 6f 72  eturn 1;.    for
11d0: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
11e0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
11f0: 20 20 20 20 20 7a 53 6f 72 74 4f 72 64 65 72 5b       zSortOrder[
1200: 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  i] = pOrderBy->a
1210: 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3f 20  [i].sortOrder ? 
1220: 27 2d 27 20 3a 20 27 2b 27 3b 0a 20 20 20 20 20  '-' : '+';.     
1230: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
1240: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
1250: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1260: 20 20 20 7d 0a 20 20 20 20 7a 53 6f 72 74 4f 72     }.    zSortOr
1270: 64 65 72 5b 70 4f 72 64 65 72 42 79 2d 3e 6e 45  der[pOrderBy->nE
1280: 78 70 72 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  xpr] = 0;.    sq
1290: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
12a0: 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 4b 65 79 2c   OP_SortMakeKey,
12b0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
12c0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12d0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
12e0: 2d 31 2c 20 7a 53 6f 72 74 4f 72 64 65 72 2c 20  -1, zSortOrder, 
12f0: 73 74 72 6c 65 6e 28 7a 53 6f 72 74 4f 72 64 65  strlen(zSortOrde
1300: 72 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  r));.    sqliteF
1310: 72 65 65 28 7a 53 6f 72 74 4f 72 64 65 72 29 3b  ree(zSortOrder);
1320: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
1330: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 50  ddOp(v, OP_SortP
1340: 75 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c  ut, 0, 0);.  }el
1350: 73 65 20 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 69  se ..  /* In thi
1360: 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61  s mode, write ea
1370: 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20  ch query result 
1380: 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  to the key of th
1390: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 2a 2a  e temporary.  **
13a0: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
13b0: 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
13c0: 53 52 54 5f 55 6e 69 6f 6e 20 29 7b 0a 20 20 20  SRT_Union ){.   
13d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
13e0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
13f0: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  d, nColumn, 0);.
1400: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
1410: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
1420: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
1430: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1440: 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79  (v, OP_PutStrKey
1450: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 7d  , iParm, 0);.  }
1460: 65 6c 73 65 20 0a 0a 20 20 2f 2a 20 53 74 6f 72  else ..  /* Stor
1470: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
1480: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
1490: 71 75 65 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20 20  que key..  */.  
14a0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  if( eDest==SRT_T
14b0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  able ){.    sqli
14c0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
14d0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
14e0: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 73  olumn, 0);.    s
14f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
1500: 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69  , OP_NewRecno, i
1510: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71  Parm, 0);.    sq
1520: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
1530: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
1540: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
1550: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e  ddOp(v, OP_PutIn
1560: 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b  tKey, iParm, 0);
1570: 0a 20 20 7d 65 6c 73 65 20 0a 0a 20 20 2f 2a 20  .  }else ..  /* 
1580: 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f  Construct a reco
1590: 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72  rd from the quer
15a0: 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e  y result, but in
15b0: 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a 20 73 61  stead of.  ** sa
15c0: 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64  ving that record
15d0: 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65  , use it as a ke
15e0: 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d  y to delete elem
15f0: 65 6e 74 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  ents from.  ** t
1600: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
1610: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 2a 2f 0a 20  le iParm..  */. 
1620: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
1630: 45 78 63 65 70 74 20 29 7b 0a 20 20 20 20 69 6e  Except ){.    in
1640: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56  t addr = sqliteV
1650: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
1660: 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75  akeRecord, nColu
1670: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mn, 0);.    sqli
1680: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1690: 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72  P_NotFound, iPar
16a0: 6d 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20  m, addr+3);.    
16b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
16c0: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50  v, OP_Delete, iP
16d0: 61 72 6d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  arm, 0);.  }else
16e0: 20 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72   ..  /* If we ar
16f0: 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
1700: 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
1710: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63   (SELECT ...)" c
1720: 6f 6e 73 74 72 75 63 74 2c 0a 20 20 2a 2a 20 74  onstruct,.  ** t
1730: 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64  hen there should
1740: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65   be a single ite
1750: 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
1760: 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 2a 2a   Write this.  **
1770: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
1780: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
1790: 67 75 73 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20  gus data..  */. 
17a0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
17b0: 53 65 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Set ){.    asser
17c0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
17d0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
17e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
17f0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  g, 0, 0);.    sq
1800: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
1810: 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 69   OP_PutStrKey, i
1820: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  Parm, 0);.  }els
1830: 65 20 0a 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  e ...  /* If thi
1840: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
1850: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
1860: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
1870: 6f 6e 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 74  on, then.  ** st
1880: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
1890: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
18a0: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
18b0: 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 2a  nd break out.  *
18c0: 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
18d0: 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  op..  */.  if( e
18e0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b  Dest==SRT_Mem ){
18f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f  .    assert( nCo
1900: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 73  lumn==1 );.    s
1910: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
1920: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
1930: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 73 71  Parm, 1);.    sq
1940: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
1950: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72   OP_Goto, 0, iBr
1960: 65 61 6b 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  eak);.  }else.. 
1970: 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74   /* If none of t
1980: 68 65 20 61 62 6f 76 65 2c 20 73 65 6e 64 20 74  he above, send t
1990: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63  he data to the c
19a0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
19b0: 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 73  ..  */.  {.    s
19c0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
19d0: 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e  , OP_Callback, n
19e0: 43 6f 6c 75 6d 6e 2c 20 69 42 72 65 61 6b 29 3b  Column, iBreak);
19f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1a00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
1a10: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20   inner loop was 
1a20: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
1a30: 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65  a non-null pOrde
1a40: 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  rBy argument,.**
1a50: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
1a60: 73 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e  s were placed in
1a70: 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65   a sorter.  Afte
1a80: 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65  r the loop is te
1a90: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e  rminated.** we n
1aa0: 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73  eed to run the s
1ab0: 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74  orter and output
1ac0: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
1ad0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1ae0: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
1af0: 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65  s the code neede
1b00: 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  d to do that..*/
1b10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
1b20: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 56 64  erateSortTail(Vd
1b30: 62 65 20 2a 76 2c 20 69 6e 74 20 6e 43 6f 6c 75  be *v, int nColu
1b40: 6d 6e 29 7b 0a 20 20 69 6e 74 20 65 6e 64 20 3d  mn){.  int end =
1b50: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
1b60: 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61  abel(v);.  int a
1b70: 64 64 72 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  ddr;.  sqliteVdb
1b80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
1b90: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 61 64 64 72  t, 0, 0);.  addr
1ba0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
1bb0: 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65 78  Op(v, OP_SortNex
1bc0: 74 2c 20 30 2c 20 65 6e 64 29 3b 0a 20 20 73 71  t, 0, end);.  sq
1bd0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
1be0: 20 4f 50 5f 53 6f 72 74 43 61 6c 6c 62 61 63 6b   OP_SortCallback
1bf0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 65 6e 64 29 3b  , nColumn, end);
1c00: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  .  sqliteVdbeAdd
1c10: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
1c20: 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74  , addr);.  sqlit
1c30: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
1c40: 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20 73 71 6c  l(v, end);.  sql
1c50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
1c60: 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c 20 30 2c  OP_SortReset, 0,
1c70: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   0);.}../*.** Ge
1c80: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1c90: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
1ca0: 44 42 45 20 68 6f 77 20 6d 61 6e 79 20 63 6f 6c  DBE how many col
1cb0: 75 6d 6e 73 20 74 68 65 72 65 0a 2a 2a 20 61 72  umns there.** ar
1cc0: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
1cd0: 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 66 6f 72  and the name for
1ce0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 20 20 54   each column.  T
1cf0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  his information.
1d00: 2a 2a 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ** is used to pr
1d10: 6f 76 69 64 65 20 22 61 72 67 63 22 20 61 6e 64  ovide "argc" and
1d20: 20 22 61 7a 43 6f 6c 5b 5d 22 20 76 61 6c 75 65   "azCol[]" value
1d30: 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63  s in the callbac
1d40: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 0a 76 6f  k..*/.static .vo
1d50: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
1d60: 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
1d70: 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 54  arse, IdList *pT
1d80: 61 62 4c 69 73 74 2c 20 45 78 70 72 4c 69 73 74  abList, ExprList
1d90: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 56 64 62   *pEList){.  Vdb
1da0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1db0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
1dc0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
1dd0: 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30  NamesSet || v==0
1de0: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
1df0: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
1e00: 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  n;.  pParse->col
1e10: 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20  NamesSet = 1;.  
1e20: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
1e30: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e  v, OP_ColumnCoun
1e40: 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
1e50: 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  , 0);.  for(i=0;
1e60: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
1e70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
1e80: 20 2a 70 3b 0a 20 20 20 20 69 6e 74 20 73 68 6f   *p;.    int sho
1e90: 77 46 75 6c 6c 4e 61 6d 65 73 3b 0a 20 20 20 20  wFullNames;.    
1ea0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
1eb0: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
1ec0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
1ed0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1ee0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
1ef0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
1f00: 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b  lumnName, i, 0);
1f10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
1f20: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
1f30: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
1f40: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f  Name));.      co
1f50: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1f60: 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b    p = pEList->a[
1f70: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
1f80: 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ( p==0 ) continu
1f90: 65 3b 0a 20 20 20 20 73 68 6f 77 46 75 6c 6c 4e  e;.    showFullN
1fa0: 61 6d 65 73 20 3d 20 28 70 50 61 72 73 65 2d 3e  ames = (pParse->
1fb0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1fc0: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
1fd0: 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  !=0;.    if( p->
1fe0: 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61  span.z && p->spa
1ff0: 6e 2e 7a 5b 30 5d 20 26 26 20 21 73 68 6f 77 46  n.z[0] && !showF
2000: 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ullNames ){.    
2010: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
2020: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 4f  iteVdbeAddOp(v,O
2030: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c  P_ColumnName, i,
2040: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
2050: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
2060: 20 2d 31 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20   -1, p->span.z, 
2070: 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  p->span.n);.    
2080: 20 20 73 71 6c 69 74 65 56 64 62 65 43 6f 6d 70    sqliteVdbeComp
2090: 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64  ressSpace(v, add
20a0: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  r);.    }else if
20b0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
20c0: 4d 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20 29  MN && pTabList )
20d0: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
20e0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
20f0: 61 5b 70 2d 3e 69 54 61 62 6c 65 20 2d 20 70 50  a[p->iTable - pP
2100: 61 72 73 65 2d 3e 6e 54 61 62 5d 2e 70 54 61 62  arse->nTab].pTab
2110: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  ;.      char *zC
2120: 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ol;.      int iC
2130: 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
2140: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
2150: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
2160: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
2170: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
2180: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
2190: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
21a0: 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 69  ;.      zCol = i
21b0: 43 6f 6c 3c 30 20 3f 20 22 5f 52 4f 57 49 44 5f  Col<0 ? "_ROWID_
21c0: 22 20 3a 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  " : pTab->aCol[i
21d0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
21e0: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
21f0: 6e 49 64 3e 31 20 7c 7c 20 73 68 6f 77 46 75 6c  nId>1 || showFul
2200: 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  lNames ){.      
2210: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
2220: 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  0;.        char 
2230: 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20  *zTab;. .       
2240: 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   zTab = pTabList
2250: 2d 3e 61 5b 70 2d 3e 69 54 61 62 6c 65 20 2d 20  ->a[p->iTable - 
2260: 70 50 61 72 73 65 2d 3e 6e 54 61 62 5d 2e 7a 41  pParse->nTab].zA
2270: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66  lias;.        if
2280: 28 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20  ( showFullNames 
2290: 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61  || zTab==0 ) zTa
22a0: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
22b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
22c0: 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c  etString(&zName,
22d0: 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c   zTab, ".", zCol
22e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
22f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
2300: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
2310: 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  i, 0);.        s
2320: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
2330: 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20  3(v, -1, zName, 
2340: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a  strlen(zName));.
2350: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
2360: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ee(zName);.     
2370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2380: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
2390: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  v, OP_ColumnName
23a0: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , i, 0);.       
23b0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
23c0: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 43 6f 6c 2c  eP3(v, -1, zCol,
23d0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
23e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70   }else if( p->sp
23f0: 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e  an.z && p->span.
2400: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e  z[0] ){.      in
2410: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56  t addr = sqliteV
2420: 64 62 65 41 64 64 4f 70 28 76 2c 4f 50 5f 43 6f  dbeAddOp(v,OP_Co
2430: 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b  lumnName, i, 0);
2440: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
2450: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
2460: 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73   p->span.z, p->s
2470: 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73 71  pan.n);.      sq
2480: 6c 69 74 65 56 64 62 65 43 6f 6d 70 72 65 73 73  liteVdbeCompress
2490: 53 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b 0a  Space(v, addr);.
24a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24b0: 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b   char zName[30];
24c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24d0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
24e0: 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29  || pTabList==0 )
24f0: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
2500: 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64  zName, "column%d
2510: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73  ", i+1);.      s
2520: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
2530: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  , OP_ColumnName,
2540: 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   i, 0);.      sq
2550: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
2560: 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73  (v, -1, zName, s
2570: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20  trlen(zName));. 
2580: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2590: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
25a0: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
25b0: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
25c0: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
25d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
25e0: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
25f0: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
2600: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
2610: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
2620: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
2630: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
2640: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
2650: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
2660: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
2670: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
2680: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
2690: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
26a0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
26b0: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
26c0: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
26d0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
26e0: 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn z;.}../*.** 
26f0: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
2700: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
2710: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
2720: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2730: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
2740: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
2750: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
2760: 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f  sqliteResultSetO
2770: 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  fSelect(Parse *p
2780: 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61  Parse, char *zTa
2790: 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70  bName, Select *p
27a0: 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
27b0: 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b   *pTab;.  int i;
27c0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
27d0: 69 73 74 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  ist;.  static in
27e0: 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69  t fillInColumnLi
27f0: 73 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63  st(Parse*, Selec
2800: 74 2a 29 3b 0a 0a 20 20 69 66 28 20 66 69 6c 6c  t*);..  if( fill
2810: 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61  InColumnList(pPa
2820: 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b  rse, pSelect) ){
2830: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2840: 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69   }.  pTab = sqli
2850: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
2860: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
2870: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
2880: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2890: 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54  pTab->zName = zT
28a0: 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 53  abName ? sqliteS
28b0: 74 72 44 75 70 28 7a 54 61 62 4e 61 6d 65 29 20  trDup(zTabName) 
28c0: 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  : 0;.  pEList = 
28d0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
28e0: 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  .  pTab->nCol = 
28f0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
2900: 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 73 71   pTab->aCol = sq
2910: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
2920: 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d  of(pTab->aCol[0]
2930: 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  )*pTab->nCol );.
2940: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
2950: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
2960: 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
2970: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
2980: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
2990: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
29a0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
29b0: 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  up(pEList->a[i].
29c0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
29d0: 65 20 69 66 28 20 28 70 3d 70 45 4c 69 73 74 2d  e if( (p=pEList-
29e0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70  >a[i].pExpr)->sp
29f0: 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e  an.z && p->span.
2a00: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71  z[0] ){.      sq
2a10: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
2a20: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
2a30: 61 6d 65 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20  ame, p->span.z, 
2a40: 70 2d 3e 73 70 61 6e 2e 6e 2c 20 30 29 3b 0a 20  p->span.n, 0);. 
2a50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
2a60: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 2d  op==TK_DOT && p-
2a70: 3e 70 52 69 67 68 74 20 26 26 20 70 2d 3e 70 52  >pRight && p->pR
2a80: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26  ight->token.z &&
2a90: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  .           p->p
2aa0: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  Right->token.z[0
2ab0: 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ] ){.      sqlit
2ac0: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 54 61  eSetNString(&pTa
2ad0: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
2ae0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  , .           p-
2af0: 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a  >pRight->token.z
2b00: 2c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b  , p->pRight->tok
2b10: 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 7d 65  en.n, 0);.    }e
2b20: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
2b30: 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20  zBuf[30];.      
2b40: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 63  sprintf(zBuf, "c
2b50: 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a  olumn%d", i+1);.
2b60: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
2b70: 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
2b80: 74 65 53 74 72 44 75 70 28 7a 42 75 66 29 3b 0a  teStrDup(zBuf);.
2b90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
2ba0: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
2bb0: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
2bc0: 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 67 69  /*.** For the gi
2bd0: 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65  ven SELECT state
2be0: 6d 65 6e 74 2c 20 64 6f 20 74 77 6f 20 74 68 69  ment, do two thi
2bf0: 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ngs..**.**    (1
2c00: 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  )  Fill in the p
2c10: 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61  TabList->a[].pTa
2c20: 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  b fields in the 
2c30: 49 64 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20  IdList that .** 
2c40: 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20          defines 
2c50: 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65  the set of table
2c60: 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
2c70: 20 73 63 61 6e 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a   scanned. .**.**
2c80: 20 20 20 20 28 32 29 20 20 49 66 20 74 68 65 20      (2)  If the 
2c90: 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 65 78  columns to be ex
2ca0: 74 72 61 63 74 65 64 20 76 61 72 69 61 62 6c 65  tracted variable
2cb0: 20 28 70 45 4c 69 73 74 29 20 69 73 20 4e 55 4c   (pEList) is NUL
2cc0: 4c 0a 2a 2a 20 20 20 20 20 20 20 20 20 28 6d 65  L.**         (me
2cd0: 61 6e 69 6e 67 20 74 68 61 74 20 61 20 22 2a 22  aning that a "*"
2ce0: 20 77 61 73 20 75 73 65 64 20 69 6e 20 74 68 65   was used in the
2cf0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 29 20   SQL statement) 
2d00: 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  then.**         
2d10: 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 70 45  create a fake pE
2d20: 4c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  List containing 
2d30: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
2d40: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 20 20 20 20   columns.**     
2d50: 20 20 20 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65      of all table
2d60: 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
2d70: 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  0 on success.  I
2d80: 66 20 74 68 65 72 65 20 61 72 65 20 70 72 6f 62  f there are prob
2d90: 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  lems, leave an e
2da0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
2db0: 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
2dc0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
2dd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
2de0: 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50 61  lInColumnList(Pa
2df0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
2e00: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
2e10: 2c 20 6a 2c 20 6b 3b 0a 20 20 49 64 4c 69 73 74  , j, k;.  IdList
2e20: 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
2e30: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
2e40: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a    Table *pTab;..
2e50: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d    if( p==0 || p-
2e60: 3e 70 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  >pSrc==0 ) retur
2e70: 6e 20 31 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  n 1;.  pTabList 
2e80: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
2e90: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
2ea0: 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
2eb0: 76 65 72 79 20 74 61 62 6c 65 20 69 6e 20 74 68  very table in th
2ec0: 65 20 74 61 62 6c 65 20 6c 69 73 74 2e 0a 20 20  e table list..  
2ed0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
2ee0: 70 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69  pTabList->nId; i
2ef0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61  ++){.    if( pTa
2f00: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  bList->a[i].pTab
2f10: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
2f20: 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75  s routine has ru
2f30: 6e 20 62 65 66 6f 72 65 21 20 20 4e 6f 20 6e 65  n before!  No ne
2f40: 65 64 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 2a  ed to continue *
2f50: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
2f60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2f70: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
2f80: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
2f90: 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
2fa0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2fb0: 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
2fc0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2fd0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
2fe0: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20  Select!=0 );.   
2ff0: 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
3000: 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ].pTab = pTab = 
3010: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 52  .        sqliteR
3020: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
3030: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
3040: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 0a  t->a[i].zAlias,.
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3070: 20 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74          pTabList
3080: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
3090: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
30a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
30b0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
30c0: 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 54 72        pTab->isTr
30d0: 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 20 20 20  ansient = 1;.   
30e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
30f0: 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   An ordinary tab
3100: 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
3110: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
3120: 73 65 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62  se */.      pTab
3130: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20  List->a[i].pTab 
3140: 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20  = pTab = .      
3150: 20 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c    sqliteFindTabl
3160: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  e(pParse->db, pT
3170: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  abList->a[i].zNa
3180: 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
3190: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
31a0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
31b0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
31c0: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  sg, "no such tab
31d0: 6c 65 3a 20 22 2c 20 0a 20 20 20 20 20 20 20 20  le: ", .        
31e0: 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
31f0: 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ].zName, 0);.   
3200: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
3210: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  r++;.        ret
3220: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
3230: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
3240: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
3250: 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
3260: 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  .pSelect = sqlit
3270: 65 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d  eSelectDup(pTab-
3280: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
3290: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
32a0: 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22  /* For every "*"
32b0: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
32c0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c  the column list,
32d0: 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
32e0: 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f  s of.  ** all co
32f0: 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
3300: 6c 65 73 2e 20 20 54 68 65 20 70 61 72 73 65 72  les.  The parser
3310: 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63   inserted a spec
3320: 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ial expression. 
3330: 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f   ** with the TK_
3340: 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  ALL operator for
3350: 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69   each "*" that i
3360: 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63  t found in the c
3370: 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a  olumn list..  **
3380: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
3390: 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20  ode just has to 
33a0: 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c  locate the TK_AL
33b0: 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  L expressions an
33c0: 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61  d expand.  ** ea
33d0: 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69  ch one to the li
33e0: 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  st of all column
33f0: 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
3400: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  .  */.  for(k=0;
3410: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
3420: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; k++){.    if( 
3430: 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
3440: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  pr->op==TK_ALL )
3450: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
3460: 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ( k<pEList->nExp
3470: 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  r ){.    struct 
3480: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
3490: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
34a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
34b0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d   = 0;.    for(k=
34c0: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
34d0: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; k++){.      
34e0: 69 66 28 20 61 5b 6b 5d 2e 70 45 78 70 72 2d 3e  if( a[k].pExpr->
34f0: 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op!=TK_ALL ){.  
3500: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
3510: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
3520: 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  d(pNew, a[k].pEx
3530: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
3540: 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
3550: 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61  xpr-1].zName = a
3560: 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [k].zName;.     
3570: 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20     a[k].pExpr = 
3580: 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  0;.        a[k].
3590: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
35a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
35c0: 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
35d0: 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
35e0: 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74  *pTab = pTabList
35f0: 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[i].pTab;.   
3600: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
3610: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
3620: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
3630: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c  Expr *pExpr, *pL
3640: 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20  eft, *pRight;.  
3650: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
3660: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
3670: 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  _ID, 0, 0, 0);. 
3680: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
3690: 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b  Right==0 ) break
36a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  ;.            pR
36b0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  ight->token.z = 
36c0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
36d0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
36e0: 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e   pRight->token.n
36f0: 20 3d 20 73 74 72 6c 65 6e 28 70 54 61 62 2d 3e   = strlen(pTab->
3700: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[j].zName);.
3710: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
3720: 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  pTab->zName ){. 
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
3740: 66 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  ft = sqliteExpr(
3750: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b  TK_ID, 0, 0, 0);
3760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
3770: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 20 62 72  f( pLeft==0 ) br
3780: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
3790: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
37a0: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 20 26 26 20  >a[i].zAlias && 
37b0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
37c0: 41 6c 69 61 73 5b 30 5d 20 29 7b 0a 20 20 20 20  Alias[0] ){.    
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
37e0: 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 70 54 61  t->token.z = pTa
37f0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  bList->a[i].zAli
3800: 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  as;.            
3810: 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e      pLeft->token
3820: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 61 62  .n = strlen(pTab
3830: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
3840: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
3850: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3860: 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e           pLeft->
3870: 74 6f 6b 65 6e 2e 7a 20 3d 20 70 54 61 62 2d 3e  token.z = pTab->
3880: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
3890: 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f         pLeft->to
38a0: 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70  ken.n = strlen(p
38b0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
38c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
38d0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
38e0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
38f0: 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
3900: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
3910: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
3920: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
3930: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
3940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
3950: 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
3960: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
3970: 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d  r->span = pExpr-
3980: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
3990: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
39a0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 45    pNew = sqliteE
39b0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e  xprListAppend(pN
39c0: 65 77 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  ew, pExpr, 0);. 
39d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
39e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
39f0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70   }.    sqliteExp
3a00: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69  rListDelete(pELi
3a10: 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69  st);.    p->pELi
3a20: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
3a30: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
3a40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3a50: 20 72 65 63 75 72 73 69 76 65 6c 79 20 75 6e 6c   recursively unl
3a60: 69 6e 6b 73 20 74 68 65 20 53 65 6c 65 63 74 2e  inks the Select.
3a70: 70 53 72 63 2e 61 5b 5d 2e 70 54 61 62 20 70 6f  pSrc.a[].pTab po
3a80: 69 6e 74 65 72 73 0a 2a 2a 20 69 6e 20 61 20 73  inters.** in a s
3a90: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 2e  elect structure.
3aa0: 20 20 49 74 20 6a 75 73 74 20 73 65 74 73 20 74    It just sets t
3ab0: 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 4e  he pointers to N
3ac0: 55 4c 4c 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ULL.  This.** ro
3ad0: 75 74 69 6e 65 20 69 73 20 72 65 63 75 72 73 69  utine is recursi
3ae0: 76 65 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20  ve in the sense 
3af0: 74 68 61 74 20 69 66 20 74 68 65 20 53 65 6c 65  that if the Sele
3b00: 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 53 65 6c  ct.pSrc.a[].pSel
3b10: 65 63 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69  ect.** pointer i
3b20: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 69 73  s not NULL, this
3b30: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
3b40: 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f  ed recursively o
3b50: 6e 20 74 68 61 74 20 70 6f 69 6e 74 65 72 2e 0a  n that pointer..
3b60: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
3b70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  ne is called on 
3b80: 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63  the Select struc
3b90: 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65  ture that define
3ba0: 73 20 61 0a 2a 2a 20 56 49 45 57 20 69 6e 20 6f  s a.** VIEW in o
3bb0: 72 64 65 72 20 74 6f 20 75 6e 64 6f 20 61 6e 79  rder to undo any
3bc0: 20 62 69 6e 64 69 6e 67 73 20 74 6f 20 74 61 62   bindings to tab
3bd0: 6c 65 73 2e 20 20 54 68 69 73 20 69 73 20 6e 65  les.  This is ne
3be0: 63 65 73 73 61 72 79 0a 2a 2a 20 62 65 63 61 75  cessary.** becau
3bf0: 73 65 20 74 68 6f 73 65 20 74 61 62 6c 65 73 20  se those tables 
3c00: 6d 69 67 68 74 20 62 65 20 44 52 4f 50 65 64 20  might be DROPed 
3c10: 62 79 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  by a subsequent 
3c20: 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  SQL command..*/.
3c30: 76 6f 69 64 20 73 71 6c 69 74 65 53 65 6c 65 63  void sqliteSelec
3c40: 74 55 6e 62 69 6e 64 28 53 65 6c 65 63 74 20 2a  tUnbind(Select *
3c50: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 49  p){.  int i;.  I
3c60: 64 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d  dList *pSrc = p-
3c70: 3e 70 53 72 63 3b 0a 20 20 54 61 62 6c 65 20 2a  >pSrc;.  Table *
3c80: 70 54 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pTab;.  if( p==0
3c90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
3ca0: 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 49  (i=0; i<pSrc->nI
3cb0: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
3cc0: 20 28 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61   (pTab = pSrc->a
3cd0: 5b 69 5d 2e 70 54 61 62 29 21 3d 30 20 29 7b 0a  [i].pTab)!=0 ){.
3ce0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
3cf0: 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20  isTransient ){. 
3d00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c         sqliteDel
3d10: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 54 61 62  eteTable(0, pTab
3d20: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3d30: 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  eSelectDelete(pS
3d40: 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  rc->a[i].pSelect
3d50: 29 3b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d  );.        pSrc-
3d60: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20  >a[i].pSelect = 
3d70: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
3d80: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62   pSrc->a[i].pTab
3d90: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
3da0: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  pSrc->a[i].pSele
3db0: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
3dc0: 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e 64  liteSelectUnbind
3dd0: 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c  (pSrc->a[i].pSel
3de0: 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ect);.      }.  
3df0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
3e00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   This routine as
3e10: 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65 73  sociates entries
3e20: 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
3e30: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
3e40: 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  with.** columns 
3e50: 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f  in a result.  Fo
3e60: 72 20 65 61 63 68 20 4f 52 44 45 52 20 42 59 20  r each ORDER BY 
3e70: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20  expression, the 
3e80: 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65  opcode of.** the
3e90: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
3ea0: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b  is changed to TK
3eb0: 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20  _COLUMN and the 
3ec0: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66  iColumn value of
3ed0: 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  .** the top-leve
3ee0: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
3ef0: 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20   in with column 
3f00: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
3f10: 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  Table.** value o
3f20: 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
3f30: 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77  node is filled w
3f40: 69 74 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d  ith iTable param
3f50: 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eter..**.** If t
3f60: 68 65 72 65 20 61 72 65 20 70 72 69 6f 72 20 53  here are prior S
3f70: 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74  ELECT clauses, t
3f80: 68 65 79 20 61 72 65 20 70 72 6f 63 65 73 73 65  hey are processe
3f90: 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63  d first.  A matc
3fa0: 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69  h.** in an earli
3fb0: 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20  er SELECT takes 
3fc0: 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20  precedence over 
3fd0: 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a  a later SELECT..
3fe0: 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20  **.** Any entry 
3ff0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  that does not ma
4000: 74 63 68 20 69 73 20 66 6c 61 67 67 65 64 20 61  tch is flagged a
4010: 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  s an error.  The
4020: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
4030: 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64  rors is returned
4040: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4050: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
4060: 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
4070: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4080: 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65  /* A place to le
4090: 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ave error messag
40a0: 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
40b0: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
40c0: 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75  /* Match to resu
40d0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  lt columns of th
40e0: 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45  is SELECT */.  E
40f0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
4100: 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  y,     /* The OR
4110: 44 45 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f  DER BY values to
4120: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 63   match against c
4130: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
4140: 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
4150: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
4160: 69 73 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e  is this value in
4170: 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   iTable */.  int
4180: 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 20 20   mustComplete   
4190: 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55 45 20       /* If TRUE 
41a0: 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20 6d 75  all ORDER BYs mu
41b0: 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  st match */.){. 
41c0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20   int nErr = 0;. 
41d0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70   int i, j;.  Exp
41e0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a  rList *pEList;..
41f0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30    if( pSelect==0
4200: 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   || pOrderBy==0 
4210: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
4220: 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29  ( mustComplete )
4230: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
4240: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
4250: 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79  ; i++){ pOrderBy
4260: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b  ->a[i].done = 0;
4270: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6c   }.  }.  if( fil
4280: 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50  lInColumnList(pP
4290: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29  arse, pSelect) )
42a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
42b0: 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63    }.  if( pSelec
42c0: 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  t->pPrior ){.   
42d0: 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65 72 62   if( matchOrderb
42e0: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
42f0: 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  , pSelect->pPrio
4300: 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69 54 61  r, pOrderBy, iTa
4310: 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ble, 0) ){.     
4320: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
4330: 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20  .  }.  pEList = 
4340: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
4350: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
4360: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
4370: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
4380: 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
4390: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e  i].pExpr;.    in
43a0: 74 20 6d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  t match = 0;.   
43b0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61   if( pOrderBy->a
43c0: 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69  [i].done ) conti
43d0: 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  nue;.    for(j=0
43e0: 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; j<pEList->nExp
43f0: 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; j++){.      i
4400: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  f( pEList->a[j].
4410: 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e 6f 70  zName && (pE->op
4420: 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f  ==TK_ID || pE->o
4430: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20 29 7b  p==TK_STRING) ){
4440: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
4450: 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a 20  Name, *zLabel;. 
4460: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
4470: 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  EList->a[j].zNam
4480: 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e;.        asser
4490: 74 28 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 20 29  t( pE->token.z )
44a0: 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61 62 65 6c  ;.        zLabel
44b0: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
44c0: 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  (pE->token.z, pE
44d0: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
44e0: 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74      sqliteDequot
44f0: 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  e(zLabel);.     
4500: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
4510: 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62  ICmp(zName, zLab
4520: 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20  el)==0 ){ .     
4530: 20 20 20 20 20 6d 61 74 63 68 20 3d 20 31 3b 20       match = 1; 
4540: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4550: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c     sqliteFree(zL
4560: 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  abel);.      }. 
4570: 20 20 20 20 20 69 66 28 20 6d 61 74 63 68 3d 3d       if( match==
4580: 30 20 26 26 20 73 71 6c 69 74 65 45 78 70 72 43  0 && sqliteExprC
4590: 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c 69 73  ompare(pE, pELis
45a0: 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29  t->a[j].pExpr) )
45b0: 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68 20  {.        match 
45c0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
45d0: 20 20 20 69 66 28 20 6d 61 74 63 68 20 29 7b 0a     if( match ){.
45e0: 20 20 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d          pE->op =
45f0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
4600: 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20      pE->iColumn 
4610: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 70 45 2d  = j;.        pE-
4620: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65  >iTable = iTable
4630: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
4640: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20  By->a[i].done = 
4650: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
4660: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4670: 20 20 20 20 69 66 28 20 21 6d 61 74 63 68 20 26      if( !match &
4680: 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29  & mustComplete )
4690: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75  {.      char zBu
46a0: 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73 70 72  f[30];.      spr
46b0: 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 22 2c 69  intf(zBuf,"%d",i
46c0: 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
46d0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
46e0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 4f 52  se->zErrMsg, "OR
46f0: 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62  DER BY term numb
4700: 65 72 20 22 2c 20 7a 42 75 66 2c 20 0a 20 20 20  er ", zBuf, .   
4710: 20 20 20 20 20 22 20 64 6f 65 73 20 6e 6f 74 20       " does not 
4720: 6d 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74  match any result
4730: 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
4740: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
4750: 2b 2b 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b  ++;.      nErr++
4760: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4770: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4780: 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a  n nErr;  .}../*.
4790: 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
47a0: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
47b0: 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
47c0: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
47d0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
47e0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
47f0: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
4800: 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
4810: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
4820: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 47 65 74  .Vdbe *sqliteGet
4830: 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
4840: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
4850: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
4860: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
4870: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
4880: 64 62 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65  dbe = sqliteVdbe
4890: 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64  Create(pParse->d
48a0: 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  b);.  }.  return
48b0: 20 76 3b 0a 7d 0a 20 20 20 20 0a 0a 2f 2a 0a 2a   v;.}.    ../*.*
48c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
48d0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
48e0: 65 73 73 20 61 20 71 75 65 72 79 20 74 68 61 74  ess a query that
48f0: 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75   is really the u
4900: 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72  nion.** or inter
4910: 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f  section of two o
4920: 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20  r more separate 
4930: 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  queries..*/.stat
4940: 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
4950: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
4960: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
4970: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
4980: 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  m){.  int rc;   
4990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 63            /* Suc
49a0: 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61  cess code from a
49b0: 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
49c0: 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
49d0: 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
49e0: 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
49f0: 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
4a00: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
4a10: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
4a20: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
4a30: 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 62   VDBE */.  int b
4a40: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ase;           /
4a50: 2a 20 42 61 73 65 6c 69 6e 65 20 76 61 6c 75 65  * Baseline value
4a60: 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 6e 54 61   for pParse->nTa
4a70: 62 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  b */..  /* Make 
4a80: 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
4a90: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
4aa0: 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54   on prior SELECT
4ab0: 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 0a 20 20  s.  Only the .  
4ac0: 2a 2a 20 6c 61 73 74 20 53 45 4c 45 43 54 20 69  ** last SELECT i
4ad0: 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79  n the series may
4ae0: 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
4af0: 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d  Y..  */.  if( p=
4b00: 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d  =0 || p->pPrior=
4b10: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
4b20: 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
4b30: 69 6f 72 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  ior;.  if( pPrio
4b40: 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  r->pOrderBy ){. 
4b50: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
4b60: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
4b70: 4d 73 67 2c 22 4f 52 44 45 52 20 42 59 20 63 6c  Msg,"ORDER BY cl
4b80: 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
4b90: 20 61 66 74 65 72 20 22 2c 0a 20 20 20 20 20 20   after ",.      
4ba0: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
4bb0: 6f 70 29 2c 20 22 20 6e 6f 74 20 62 65 66 6f 72  op), " not befor
4bc0: 65 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  e", 0);.    pPar
4bd0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
4be0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
4bf0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
4c00: 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 71 75   have a valid qu
4c10: 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20  ery engine.  If 
4c20: 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65  not, create a ne
4c30: 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20  w one..  */.  v 
4c40: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
4c50: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
4c60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
4c70: 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
4c80: 65 20 55 4e 49 4f 4e 20 6f 72 20 49 4e 54 45 52  e UNION or INTER
4c90: 53 45 43 54 49 4f 4e 0a 20 20 2a 2f 0a 20 20 62  SECTION.  */.  b
4ca0: 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ase = pParse->nT
4cb0: 61 62 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d  ab;.  switch( p-
4cc0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
4cd0: 54 4b 5f 41 4c 4c 3a 0a 20 20 20 20 63 61 73 65  TK_ALL:.    case
4ce0: 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20   TK_EXCEPT:.    
4cf0: 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b  case TK_UNION: {
4d00: 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e  .      int union
4d10: 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f  Tab;    /* Curso
4d20: 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
4d30: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
4d40: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a  holding result *
4d50: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20  /.      int op; 
4d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
4d70: 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72  of the SRT_ oper
4d80: 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20  ations to apply 
4d90: 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20  to self */.     
4da0: 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20   int priorOp;   
4db0: 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70    /* The SRT_ op
4dc0: 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79  eration to apply
4dd0: 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74   to prior select
4de0: 73 20 2a 2f 0a 0a 20 20 20 20 20 20 70 72 69 6f  s */..      prio
4df0: 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  rOp = p->op==TK_
4e00: 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65 20  ALL ? SRT_Table 
4e10: 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  : SRT_Union;.   
4e20: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70 72     if( eDest==pr
4e30: 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  iorOp ){.       
4e40: 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65   /* We can reuse
4e50: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
4e60: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  le generated by 
4e70: 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a  a SELECT to our.
4e80: 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74          ** right
4e90: 2e 20 20 54 68 69 73 20 61 6c 73 6f 20 6d 65 61  .  This also mea
4ea0: 6e 73 20 77 65 20 61 72 65 20 6e 6f 74 20 74 68  ns we are not th
4eb0: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 65 6c  e right-most sel
4ec0: 65 63 74 20 61 6e 64 20 73 6f 0a 20 20 20 20 20  ect and so.     
4ed0: 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20     ** we cannot 
4ee0: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
4ef0: 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
4f00: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
4f10: 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20  Tab = iParm;.   
4f20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
4f30: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
4f40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4f50: 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
4f60: 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
4f70: 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
4f80: 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
4f90: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  e.        ** int
4fa0: 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
4fb0: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
4fc0: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
4fd0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
4fe0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
4ff0: 70 4f 72 64 65 72 42 79 20 0a 20 20 20 20 20 20  pOrderBy .      
5000: 20 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62    && matchOrderb
5010: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
5020: 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  , p, p->pOrderBy
5030: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 20 29  , unionTab, 1) )
5040: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
5050: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
5060: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f          if( p->o
5070: 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
5080: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
5090: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
50a0: 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  nTemp, unionTab,
50b0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
50c0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
50d0: 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20  , OP_KeyAsData, 
50e0: 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20  unionTab, 1);.  
50f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5100: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
5110: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
5120: 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  nTemp, unionTab,
5130: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
5140: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
5150: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
5160: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
5170: 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f  ur left.      */
5180: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
5190: 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  teSelect(pParse,
51a0: 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70   pPrior, priorOp
51b0: 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20  , unionTab);.   
51c0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
51d0: 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a  rn rc;..      /*
51e0: 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
51f0: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
5200: 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  nt.      */.    
5210: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
5220: 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  ){.         case
5230: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20   TK_EXCEPT:  op 
5240: 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20  = SRT_Except;   
5250: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
5260: 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20  case TK_UNION:  
5270: 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b   op = SRT_Union;
5280: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5290: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
52a0: 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61       op = SRT_Ta
52b0: 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ble;    break;. 
52c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
52d0: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
52e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c    rc = sqliteSel
52f0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f  ect(pParse, p, o
5300: 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20  p, unionTab);.  
5310: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
5320: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66  pPrior;.      if
5330: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
5340: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ;..      /* Conv
5350: 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
5360: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
5370: 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
5380: 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
5390: 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
53a0: 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
53b0: 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20      */      .   
53c0: 20 20 20 69 66 28 20 65 44 65 73 74 21 3d 70 72     if( eDest!=pr
53d0: 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  iorOp ){.       
53e0: 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
53f0: 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
5400: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
5410: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  EList );.       
5420: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
5430: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
5440: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
5450: 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
5460: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
5470: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
5480: 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nt = sqliteVdbeM
5490: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
54a0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
54b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
54c0: 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
54d0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53  eak);.        iS
54e0: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 56 64 62  tart = sqliteVdb
54f0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
5500: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65  .        rc = se
5510: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
5520: 61 72 73 65 2c 20 30 2c 20 75 6e 69 6f 6e 54 61  arse, 0, unionTa
5530: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  b, p->pEList->nE
5540: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5560: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d    p->pOrderBy, -
5570: 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  1, eDest, iParm,
5580: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
55a0: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
55b0: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
55c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
55d0: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
55e0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
55f0: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
5600: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5610: 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
5620: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , iStart);.     
5630: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
5640: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
5650: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
5660: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5670: 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
5680: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
5690: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
56a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65   ){.          ge
56b0: 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 76  nerateSortTail(v
56c0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
56d0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
56e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
56f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
5700: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
5710: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62   {.      int tab
5720: 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69  1, tab2;.      i
5730: 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
5740: 2c 20 69 53 74 61 72 74 3b 0a 0a 20 20 20 20 20  , iStart;..     
5750: 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73   /* INTERSECT is
5760: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
5770: 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65  the others since
5780: 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20   it requires.   
5790: 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72     ** two tempor
57a0: 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e  ary tables.  Hen
57b0: 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77  ce it has its ow
57c0: 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20  n case.  Begin. 
57d0: 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63       ** by alloc
57e0: 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73  ating the tables
57f0: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20   we will need.. 
5800: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61       */.      ta
5810: 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b1 = pParse->nTa
5820: 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20  b++;.      tab2 
5830: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
5840: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
5850: 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74 63 68  OrderBy && match
5860: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
5870: 70 50 61 72 73 65 2c 70 2c 70 2d 3e 70 4f 72 64  pParse,p,p->pOrd
5880: 65 72 42 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a  erBy,tab1,1) ){.
5890: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
58a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
58b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
58c0: 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
58d0: 74 61 62 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  tab1, 1);.      
58e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
58f0: 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c  v, OP_KeyAsData,
5900: 20 74 61 62 31 2c 20 31 29 3b 0a 0a 20 20 20 20   tab1, 1);..    
5910: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
5920: 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
5930: 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
5940: 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
5950: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
5960: 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28   = sqliteSelect(
5970: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
5980: 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
5990: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
59a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
59b0: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
59c0: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
59d0: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
59e0: 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
59f0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  */.      sqliteV
5a00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
5a10: 70 65 6e 54 65 6d 70 2c 20 74 61 62 32 2c 20 31  penTemp, tab2, 1
5a20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
5a30: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b  dbeAddOp(v, OP_K
5a40: 65 79 41 73 44 61 74 61 2c 20 74 61 62 32 2c 20  eyAsData, tab2, 
5a50: 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  1);.      p->pPr
5a60: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ior = 0;.      r
5a70: 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74  c = sqliteSelect
5a80: 28 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54 5f  (pParse, p, SRT_
5a90: 55 6e 69 6f 6e 2c 20 74 61 62 32 29 3b 0a 20 20  Union, tab2);.  
5aa0: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
5ab0: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66  pPrior;.      if
5ac0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
5ad0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
5ae0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
5af0: 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
5b00: 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
5b10: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
5b20: 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
5b30: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
5b40: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
5b50: 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
5b60: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
5b70: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
5b80: 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
5b90: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
5ba0: 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74  (v);.      iCont
5bb0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
5bc0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
5bd0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5be0: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
5bf0: 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ab1, iBreak);.  
5c00: 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
5c10: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5c20: 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61 62 31  OP_FullKey, tab1
5c30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
5c40: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5c50: 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32  P_NotFound, tab2
5c60: 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
5c70: 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72  rc = selectInner
5c80: 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 30 2c 20  Loop(pParse, 0, 
5c90: 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  tab1, p->pEList-
5ca0: 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cc0: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
5cd0: 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61  , -1, eDest, iPa
5ce0: 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rm, .           
5cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d00: 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29    iCont, iBreak)
5d10: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
5d20: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
5d30: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
5d40: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
5d50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
5d60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
5d70: 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72  ext, tab1, iStar
5d80: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
5d90: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
5da0: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
5db0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5dc0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
5dd0: 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
5de0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5df0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
5e00: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  1, 0);.      if(
5e10: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
5e20: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
5e30: 53 6f 72 74 54 61 69 6c 28 76 2c 20 70 2d 3e 70  SortTail(v, p->p
5e40: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
5e50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
5e60: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
5e70: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
5e80: 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c  t && pPrior->pEL
5e90: 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ist );.  if( p->
5ea0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70  pEList->nExpr!=p
5eb0: 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Prior->pEList->n
5ec0: 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Expr ){.    sqli
5ed0: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
5ee0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 53  rse->zErrMsg, "S
5ef0: 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65  ELECTs to the le
5f00: 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20  ft and right of 
5f10: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
5f20: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 2c 20 22 20  pName(p->op), " 
5f30: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
5f40: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
5f50: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
5f60: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
5f70: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
5f80: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 72  rn 1;.  }.  pPar
5f90: 73 65 2d 3e 6e 54 61 62 20 3d 20 62 61 73 65 3b  se->nTab = base;
5fa0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
5fb0: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
5fc0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
5fd0: 6e 74 20 70 61 73 73 65 64 20 69 6e 20 61 73 20  nt passed in as 
5fe0: 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  an argument to s
5ff0: 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61  ee if it.** is a
6000: 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72   simple min() or
6010: 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 49   max() query.  I
6020: 66 20 69 74 20 69 73 20 61 6e 64 20 74 68 69 73  f it is and this
6030: 20 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a   query can be.**
6040: 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67   satisfied using
6050: 20 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20 74   a single seek t
6060: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
6070: 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64  or end of an ind
6080: 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65  ex,.** then gene
6090: 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 66 6f  rate the code fo
60a0: 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 72 65  r this SELECT re
60b0: 74 75 72 6e 20 31 2e 20 20 49 66 20 74 68 69 73  turn 1.  If this
60c0: 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69   is not a .** si
60d0: 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mple min() or ma
60e0: 78 28 29 20 71 75 65 72 79 2c 20 74 68 65 6e 20  x() query, then 
60f0: 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20  return 0;.**.** 
6100: 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f  A simply min() o
6110: 72 20 6d 61 78 28 29 20 71 75 65 72 79 20 6c 6f  r max() query lo
6120: 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  oks like this:.*
6130: 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d  *.**    SELECT m
6140: 69 6e 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65  in(a) FROM table
6150: 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d  ;.**    SELECT m
6160: 61 78 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65  ax(a) FROM table
6170: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72  ;.**.** The quer
6180: 79 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79 20  y may have only 
6190: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
61a0: 6e 20 69 74 73 20 46 52 4f 4d 20 61 72 67 75 6d  n its FROM argum
61b0: 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63  ent.  There.** c
61c0: 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50 20 42  an be no GROUP B
61d0: 59 20 6f 72 20 48 41 56 49 4e 47 20 6f 72 20 57  Y or HAVING or W
61e0: 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 20 54  HERE clauses.  T
61f0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75  he result set mu
6200: 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e  st.** be the min
6210: 28 29 20 6f 72 20 6d 61 78 28 29 20 6f 66 20 61  () or max() of a
6220: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f   single column o
6230: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
6240: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74  e column.** in t
6250: 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
6260: 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  ) function must 
6270: 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a  be indexed..**.*
6280: 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 73  * The parameters
6290: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
62a0: 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
62b0: 20 66 6f 72 20 73 71 6c 69 74 65 53 65 6c 65 63   for sqliteSelec
62c0: 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20  t()..** See the 
62d0: 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f  header comment o
62e0: 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66  n that routine f
62f0: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
6300: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
6310: 61 74 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d  atic int simpleM
6320: 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73 65  inMaxQuery(Parse
6330: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
6340: 20 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20   *p, int eDest, 
6350: 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 45 78  int iParm){.  Ex
6360: 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74  pr *pExpr;.  int
6370: 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a   iCol;.  Table *
6380: 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pTab;.  Index *p
6390: 49 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b  Idx;.  int base;
63a0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
63b0: 74 20 6f 70 65 6e 4f 70 3b 0a 20 20 69 6e 74 20  t openOp;.  int 
63c0: 73 65 65 6b 4f 70 3b 0a 20 20 69 6e 74 20 63 6f  seekOp;.  int co
63d0: 6e 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 65  nt;.  ExprList e
63e0: 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45  List;.  struct E
63f0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69  xprList_item eLi
6400: 73 74 49 74 65 6d 3b 0a 0a 20 20 2f 2a 20 43 68  stItem;..  /* Ch
6410: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
6420: 69 73 20 71 75 65 72 79 20 69 73 20 61 20 73 69  is query is a si
6430: 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mple min() or ma
6440: 78 28 29 20 71 75 65 72 79 2e 20 20 52 65 74 75  x() query.  Retu
6450: 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20  rn.  ** zero if 
6460: 69 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f  it is  not..  */
6470: 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70  .  if( p->pGroup
6480: 42 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67  By || p->pHaving
6490: 20 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20 29 20   || p->pWhere ) 
64a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
64b0: 70 2d 3e 70 53 72 63 2d 3e 6e 49 64 21 3d 31 20  p->pSrc->nId!=1 
64c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
64d0: 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
64e0: 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
64f0: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70  ;.  pExpr = p->p
6500: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
6510: 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
6520: 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
6530: 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
6540: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69    if( pExpr->pLi
6550: 73 74 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e  st==0 || pExpr->
6560: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
6570: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
6580: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
6590: 21 3d 46 4e 5f 4d 69 6e 20 26 26 20 70 45 78 70  !=FN_Min && pExp
65a0: 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 46 4e 5f 4d  r->iColumn!=FN_M
65b0: 61 78 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ax ) return 0;. 
65c0: 20 73 65 65 6b 4f 70 20 3d 20 70 45 78 70 72 2d   seekOp = pExpr-
65d0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 46 4e 5f 4d 69 6e  >iColumn==FN_Min
65e0: 20 3f 20 4f 50 5f 52 65 77 69 6e 64 20 3a 20 4f   ? OP_Rewind : O
65f0: 50 5f 4c 61 73 74 3b 0a 20 20 70 45 78 70 72 20  P_Last;.  pExpr 
6600: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
6610: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
6620: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
6630: 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
6640: 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78 70  0;.  iCol = pExp
6650: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54  r->iColumn;.  pT
6660: 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ab = p->pSrc->a[
6670: 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49  0].pTab;..  /* I
6680: 66 20 77 65 20 67 65 74 20 74 6f 20 68 65 72 65  f we get to here
6690: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 71  , it means the q
66a0: 75 65 72 79 20 69 73 20 6f 66 20 74 68 65 20 63  uery is of the c
66b0: 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a  orrect form..  *
66c0: 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  * Check to make 
66d0: 73 75 72 65 20 77 65 20 68 61 76 65 20 61 6e 20  sure we have an 
66e0: 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65 20 70  index and make p
66f0: 49 64 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  Idx point to the
6700: 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  .  ** appropriat
6710: 65 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65  e index.  If the
6720: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
6730: 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52  is on an INTEGER
6740: 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65   PRIMARY.  ** ke
6750: 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64  y column, no ind
6760: 65 78 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  ex is necessary 
6770: 73 6f 20 73 65 74 20 70 49 64 78 20 74 6f 20 4e  so set pIdx to N
6780: 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a  ULL.  If no.  **
6790: 20 75 73 61 62 6c 65 20 69 6e 64 65 78 20 69 73   usable index is
67a0: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 30   found, return 0
67b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f  ..  */.  if( iCo
67c0: 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49 64 78 20  l<0 ){.    pIdx 
67d0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
67e0: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
67f0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
6800: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
6810: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
6820: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31  pIdx->nColumn>=1
6830: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
6840: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
6850: 3d 69 43 6f 6c 20 29 20 62 72 65 61 6b 3b 0a 20  =iCol ) break;. 
6860: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64     }.    if( pId
6870: 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  x==0 ) return 0;
6880: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  .  }..  /* Ident
6890: 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ify column names
68a0: 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75   if we will be u
68b0: 73 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63  sing the callbac
68c0: 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74  k.  This.  ** st
68d0: 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ep is skipped if
68e0: 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67   the output is g
68f0: 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20  oing to a table 
6900: 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  or a memory cell
6910: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
6920: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
6930: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
6940: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
6950: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
6960: 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65  back ){.    gene
6970: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
6980: 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 2c  pParse, p->pSrc,
6990: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d   p->pEList);.  }
69a0: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e  ..  /* Generatin
69b0: 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20 74  g code to find t
69c0: 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61  he min or the ma
69d0: 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20 61 6c  x.  Basically al
69e0: 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  l we have.  ** t
69f0: 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74 68 65  o do is find the
6a00: 20 66 69 72 73 74 20 6f 72 20 74 68 65 20 6c 61   first or the la
6a10: 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
6a20: 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20 49  chosen index.  I
6a30: 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29  f.  ** the min()
6a40: 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20   or max() is on 
6a50: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
6a60: 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 66 69  ARY KEY, then fi
6a70: 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  nd the first.  *
6a80: 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72 79 20  * or last entry 
6a90: 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  in the main tabl
6aa0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  e..  */.  if( !p
6ab0: 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72  Parse->schemaVer
6ac0: 69 66 69 65 64 20 26 26 20 28 70 50 61 72 73 65  ified && (pParse
6ad0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
6ae0: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30  LITE_InTrans)==0
6af0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
6b00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65  beAddOp(v, OP_Ve
6b10: 72 69 66 79 43 6f 6f 6b 69 65 2c 20 70 50 61 72  rifyCookie, pPar
6b20: 73 65 2d 3e 64 62 2d 3e 73 63 68 65 6d 61 5f 63  se->db->schema_c
6b30: 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 70  ookie, 0);.    p
6b40: 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72  Parse->schemaVer
6b50: 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  ified = 1;.  }. 
6b60: 20 6f 70 65 6e 4f 70 20 3d 20 70 54 61 62 2d 3e   openOp = pTab->
6b70: 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e  isTemp ? OP_Open
6b80: 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 3b 0a 20  Aux : OP_Open;. 
6b90: 20 62 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e   base = pParse->
6ba0: 6e 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 56 64  nTab;.  sqliteVd
6bb0: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f  beAddOp(v, openO
6bc0: 70 2c 20 62 61 73 65 2c 20 70 54 61 62 2d 3e 74  p, base, pTab->t
6bd0: 6e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 56 64  num);.  sqliteVd
6be0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
6bf0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50  , pTab->zName, P
6c00: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  3_STATIC);.  if(
6c10: 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20   pIdx==0 ){.    
6c20: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6c30: 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c  v, seekOp, base,
6c40: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
6c50: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6c60: 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 62 61 73  p(v, openOp, bas
6c70: 65 2b 31 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29  e+1, pIdx->tnum)
6c80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
6c90: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
6ca0: 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f  pIdx->zName, P3_
6cb0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
6cc0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6cd0: 73 65 65 6b 4f 70 2c 20 62 61 73 65 2b 31 2c 20  seekOp, base+1, 
6ce0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
6cf0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
6d00: 78 52 65 63 6e 6f 2c 20 62 61 73 65 2b 31 2c 20  xRecno, base+1, 
6d10: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
6d20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
6d30: 6f 73 65 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b  ose, base+1, 0);
6d40: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
6d50: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 54  ddOp(v, OP_MoveT
6d60: 6f 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d  o, base, 0);.  }
6d70: 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d  .  eList.nExpr =
6d80: 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c   1;.  memset(&eL
6d90: 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65  istItem, 0, size
6da0: 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a  of(eListItem));.
6db0: 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69    eList.a = &eLi
6dc0: 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e  stItem;.  eList.
6dd0: 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78  a[0].pExpr = pEx
6de0: 70 72 3b 0a 20 20 63 6f 6e 74 20 3d 20 73 71 6c  pr;.  cont = sql
6df0: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
6e00: 28 76 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e  (v);.  selectInn
6e10: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 26  erLoop(pParse, &
6e20: 65 4c 69 73 74 2c 20 62 61 73 65 2c 20 31 2c 20  eList, base, 1, 
6e30: 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  0, -1, eDest, iP
6e40: 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74 29  arm, cont, cont)
6e50: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 52 65  ;.  sqliteVdbeRe
6e60: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f  solveLabel(v, co
6e70: 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  nt);.  sqliteVdb
6e80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
6e90: 73 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  se, base, 0);.  
6ea0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
6eb0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
6ec0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
6ed0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
6ee0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
6ef0: 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
6f00: 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
6f10: 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
6f20: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
6f30: 65 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e  eDest and iParm.
6f40: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74  .**.**     eDest
6f50: 20 56 61 6c 75 65 20 20 20 20 20 20 20 52 65 73   Value       Res
6f60: 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d  ult.**     -----
6f70: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fa0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52  ------.**     SR
6fb0: 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e  T_Callback    In
6fc0: 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63  voke the callbac
6fd0: 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  k for each row o
6fe0: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  f the result..**
6ff0: 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20  .**     SRT_Mem 
7000: 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69          Store fi
7010: 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65  rst result in me
7020: 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a  mory cell iParm.
7030: 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65  **.**     SRT_Se
7040: 74 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20  t         Store 
7050: 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20  results as keys 
7060: 6f 66 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  of a table with 
7070: 63 75 72 73 6f 72 20 69 50 61 72 6d 0a 2a 2a 0a  cursor iParm.**.
7080: 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e  **     SRT_Union
7090: 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
70a0: 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e  ults as a key in
70b0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
70c0: 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  le iParm.**.**  
70d0: 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20     SRT_Except   
70e0: 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74     Remove result
70f0: 73 20 66 6f 72 6d 20 74 68 65 20 74 65 6d 70 6f  s form the tempo
7100: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
7110: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
7120: 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72  Table       Stor
7130: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d  e results in tem
7140: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
7150: 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  rm.**.** This ro
7160: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
7170: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
7180: 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
7190: 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
71a0: 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
71b0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
71c0: 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
71d0: 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
71e0: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
71f0: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
7200: 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
7210: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
7220: 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
7230: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
7240: 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
7250: 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  at..*/.int sqlit
7260: 65 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  eSelect(.  Parse
7270: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
7280: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
7290: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
72a0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
72b0: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
72c0: 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
72d0: 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e  g coded. */.  in
72e0: 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20  t eDest,        
72f0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 3a 20       /* One of: 
7300: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 4d 65 6d  SRT_Callback Mem
7310: 20 53 65 74 20 55 6e 69 6f 6e 20 45 78 63 65 70   Set Union Excep
7320: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  t */.  int iParm
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7340: 20 53 61 76 65 20 72 65 73 75 6c 74 20 69 6e 20   Save result in 
7350: 74 68 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  this memory loca
7360: 74 69 6f 6e 2c 20 69 66 20 3e 3d 30 20 2a 2f 0a  tion, if >=0 */.
7370: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  ){.  int i;.  Wh
7380: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
7390: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
73a0: 74 20 69 73 41 67 67 20 3d 20 30 3b 20 20 20 20  t isAgg = 0;    
73b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
73c0: 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
73d0: 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
73e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
73f0: 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist;      /* Lis
7400: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
7410: 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 49 64  extract. */.  Id
7420: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
7430: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
7440: 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
7450: 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
7460: 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
7470: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
7480: 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
7490: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
74a0: 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
74b0: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
74c0: 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
74d0: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
74e0: 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
74f0: 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
7500: 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
7510: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
7520: 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20  *pHaving;       
7530: 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20    /* The HAVING 
7540: 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
7550: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  NULL */.  int is
7560: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
7570: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
7580: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
7590: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
75a0: 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20   int distinct;  
75b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
75c0: 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
75d0: 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a  distinct set */.
75e0: 20 20 69 6e 74 20 62 61 73 65 3b 20 20 20 20 20    int base;     
75f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
7600: 74 20 63 75 72 73 6f 72 20 61 76 61 69 6c 61 62  t cursor availab
7610: 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 20 20  le for use */.  
7620: 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20  int rc = 1;     
7630: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
7640: 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74  to return from t
7650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
7660: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61  .  if( sqlite_ma
7670: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70  lloc_failed || p
7680: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
7690: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
76a0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
76b0: 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65  s are a sequence
76c0: 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20   of queries, do 
76d0: 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73  the earlier ones
76e0: 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69   first..  */.  i
76f0: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
7700: 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
7710: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
7720: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b  , eDest, iParm);
7730: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
7740: 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20  local copies of 
7750: 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 66  the parameters f
7760: 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20  or this query.. 
7770: 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d   */.  pTabList =
7780: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68 65   p->pSrc;.  pWhe
7790: 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
77a0: 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
77b0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 47 72 6f  pOrderBy;.  pGro
77c0: 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
77d0: 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
77e0: 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73  p->pHaving;.  is
77f0: 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
7800: 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20  Distinct;..  /* 
7810: 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
7820: 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65   value of pParse
7830: 2d 3e 6e 54 61 62 2e 20 20 52 65 73 74 6f 72 65  ->nTab.  Restore
7840: 20 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f   this value befo
7850: 72 65 0a 20 20 2a 2a 20 77 65 20 65 78 69 74 2e  re.  ** we exit.
7860: 0a 20 20 2a 2f 0a 20 20 62 61 73 65 20 3d 20 70  .  */.  base = p
7870: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 0a 20 20  Parse->nTab;..  
7880: 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  /* .  ** Do not 
7890: 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  even attempt to 
78a0: 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64  generate any cod
78b0: 65 20 69 66 20 77 65 20 68 61 76 65 20 61 6c 72  e if we have alr
78c0: 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65  eady seen.  ** e
78d0: 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69  rrors before thi
78e0: 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
78f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
7900: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f  rse->nErr>0 ) go
7910: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
7920: 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
7930: 72 79 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ry table in the 
7940: 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 63  table list and c
7950: 72 65 61 74 65 20 61 6e 20 61 70 70 72 6f 70 72  reate an appropr
7960: 69 61 74 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e  iate.  ** column
7970: 6c 69 73 74 20 69 6e 20 70 45 4c 69 73 74 20 69  list in pEList i
7980: 66 20 74 68 65 72 65 20 69 73 6e 27 74 20 6f 6e  f there isn't on
7990: 65 20 61 6c 72 65 61 64 79 2e 20 20 28 54 68 65  e already.  (The
79a0: 20 70 61 72 73 65 72 20 6c 65 61 76 65 73 0a 20   parser leaves. 
79b0: 20 2a 2a 20 61 20 4e 55 4c 4c 20 69 6e 20 74 68   ** a NULL in th
79c0: 65 20 70 2d 3e 70 45 4c 69 73 74 20 69 66 20 74  e p->pEList if t
79d0: 68 65 20 53 51 4c 20 73 61 69 64 20 22 53 45 4c  he SQL said "SEL
79e0: 45 43 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e 22 29  ECT * FROM ...")
79f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 69 6c 6c  .  */.  if( fill
7a00: 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61  InColumnList(pPa
7a10: 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 67  rse, p) ){.    g
7a20: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
7a30: 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70    }.  pEList = p
7a40: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
7a50: 70 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f  pEList==0 ) goto
7a60: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
7a70: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 74 65  /* Allocate a te
7a80: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
7a90: 20 75 73 65 20 66 6f 72 20 74 68 65 20 44 49 53   use for the DIS
7aa0: 54 49 4e 43 54 20 73 65 74 2c 20 69 66 0a 20 20  TINCT set, if.  
7ab0: 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  ** necessary.  T
7ac0: 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
7ad0: 20 65 61 72 6c 79 20 74 6f 20 61 6c 6c 6f 63 61   early to alloca
7ae0: 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  te the cursor be
7af0: 66 6f 72 65 0a 20 20 2a 2a 20 61 6e 79 20 63 61  fore.  ** any ca
7b00: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 45 78 70  lls to sqliteExp
7b10: 72 52 65 73 6f 6c 76 65 49 64 73 28 29 2e 0a 20  rResolveIds().. 
7b20: 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74   */.  if( isDist
7b30: 69 6e 63 74 20 29 7b 0a 20 20 20 20 64 69 73 74  inct ){.    dist
7b40: 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
7b50: 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Tab++;.  }else{.
7b60: 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d      distinct = -
7b70: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
7b80: 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72  writing to memor
7b90: 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  y or generating 
7ba0: 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20  a set.  ** only 
7bb0: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
7bc0: 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20  may be output.. 
7bd0: 20 2a 2f 0a 20 20 69 66 28 20 28 65 44 65 73 74   */.  if( (eDest
7be0: 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
7bf0: 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20  st==SRT_Set) && 
7c00: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20  pEList->nExpr>1 
7c10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
7c20: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
7c30: 7a 45 72 72 4d 73 67 2c 20 22 6f 6e 6c 79 20 61  zErrMsg, "only a
7c40: 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61   single result a
7c50: 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20  llowed for ".   
7c60: 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68      "a SELECT th
7c70: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
7c80: 20 65 78 70 72 65 73 73 69 6f 6e 22 2c 20 30 29   expression", 0)
7c90: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
7ca0: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 73  rr++;.    goto s
7cb0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
7cc0: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73    /* ORDER BY is
7cd0: 20 69 67 6e 6f 72 65 64 20 69 66 20 77 65 20 61   ignored if we a
7ce0: 72 65 20 6e 6f 74 20 73 65 6e 64 69 6e 67 20 74  re not sending t
7cf0: 68 65 20 72 65 73 75 6c 74 20 74 6f 20 61 20 63  he result to a c
7d00: 61 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  allback..  */.  
7d10: 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 43  if( eDest!=SRT_C
7d20: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 70  allback ){.    p
7d30: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
7d40: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
7d50: 63 75 72 73 6f 72 73 20 66 6f 72 20 22 65 78 70  cursors for "exp
7d60: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
7d70: 29 22 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 20  )" constructs.. 
7d80: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
7d90: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
7da0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
7db0: 45 78 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c  ExprResolveInSel
7dc0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ect(pParse, pELi
7dd0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
7de0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65 72  .  }.  if( pWher
7df0: 65 20 29 20 73 71 6c 69 74 65 45 78 70 72 52 65  e ) sqliteExprRe
7e00: 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28 70 50  solveInSelect(pP
7e10: 61 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  arse, pWhere);. 
7e20: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
7e30: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7e40: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
7e50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
7e60: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 6e  iteExprResolveIn
7e70: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
7e80: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
7e90: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
7ea0: 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
7eb0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
7ec0: 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
7ed0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
7ee0: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
7ef0: 6e 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  nSelect(pParse, 
7f00: 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70  pGroupBy->a[i].p
7f10: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
7f20: 0a 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29  .  if( pHaving )
7f30: 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
7f40: 76 65 49 6e 53 65 6c 65 63 74 28 70 50 61 72 73  veInSelect(pPars
7f50: 65 2c 20 70 48 61 76 69 6e 67 29 3b 0a 0a 20 20  e, pHaving);..  
7f60: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
7f70: 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65  , we should have
7f80: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6c 20 74   allocated all t
7f90: 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
7fa0: 77 65 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20  we.  ** need to 
7fb0: 68 61 6e 64 6c 65 20 73 75 62 71 75 65 72 79 73  handle subquerys
7fc0: 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 74   and temporary t
7fd0: 61 62 6c 65 73 2e 20 20 46 72 6f 6d 20 68 65 72  ables.  From her
7fe0: 65 20 6f 6e 20 77 65 0a 20 20 2a 2a 20 61 72 65  e on we.  ** are
7ff0: 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 6b 65   committed to ke
8000: 65 70 69 6e 67 20 74 68 65 20 73 61 6d 65 20 76  eping the same v
8010: 61 6c 75 65 20 66 6f 72 20 70 50 61 72 73 65 2d  alue for pParse-
8020: 3e 6e 54 61 62 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  >nTab..  **.  **
8030: 20 52 65 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c   Resolve the col
8040: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 64 6f  umn names and do
8050: 20 61 20 73 65 6d 61 6e 74 69 63 73 20 63 68 65   a semantics che
8060: 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 65 20 65 78  ck on all the ex
8070: 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
8080: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
8090: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
80a0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
80b0: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
80c0: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
80d0: 20 30 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   0, pEList->a[i]
80e0: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
80f0: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
8100: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8110: 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
8120: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
8130: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 31 2c 20 26  a[i].pExpr, 1, &
8140: 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20  isAgg) ){.      
8150: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
8160: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8170: 20 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 69   pWhere ){.    i
8180: 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  f( sqliteExprRes
8190: 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
81a0: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
81b0: 2c 20 70 57 68 65 72 65 29 20 29 7b 0a 20 20 20  , pWhere) ){.   
81c0: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
81d0: 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
81e0: 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63  ( sqliteExprChec
81f0: 6b 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  k(pParse, pWhere
8200: 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  , 0, 0) ){.     
8210: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
8220: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8230: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
8240: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
8250: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
8260: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
8270: 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
8280: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
8290: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49   if( sqliteExprI
82a0: 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b  sConstant(pE) ){
82b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
82c0: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
82d0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20 20  ->zErrMsg, .    
82e0: 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20           "ORDER 
82f0: 42 59 20 65 78 70 72 65 73 73 69 6f 6e 73 20 73  BY expressions s
8300: 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6f 6e  hould not be con
8310: 73 74 61 6e 74 22 2c 20 30 29 3b 0a 20 20 20 20  stant", 0);.    
8320: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
8330: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ++;.        goto
8340: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
8350: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
8360: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
8370: 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  Ids(pParse, pTab
8380: 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45  List, pEList, pE
8390: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
83a0: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
83b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
83c0: 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
83d0: 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73 41 67  pParse, pE, isAg
83e0: 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  g, 0) ){.       
83f0: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
8400: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8410: 20 20 7d 0a 20 20 69 66 28 20 70 47 72 6f 75 70    }.  if( pGroup
8420: 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  By ){.    for(i=
8430: 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; i<pGroupBy->n
8440: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
8450: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 47 72    Expr *pE = pGr
8460: 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  oupBy->a[i].pExp
8470: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  r;.      if( sql
8480: 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  iteExprIsConstan
8490: 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20  t(pE) ){.       
84a0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
84b0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
84c0: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
84d0: 20 22 47 52 4f 55 50 20 42 59 20 65 78 70 72 65   "GROUP BY expre
84e0: 73 73 69 6f 6e 73 20 73 68 6f 75 6c 64 20 6e 6f  ssions should no
84f0: 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 22 2c 20  t be constant", 
8500: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  0);.        pPar
8510: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
8520: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
8530: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
8540: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
8550: 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
8560: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
8570: 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20  List, pE) ){.   
8580: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
8590: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
85a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
85b0: 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
85c0: 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b  pE, isAgg, 0) ){
85d0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
85e0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
85f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
8600: 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
8610: 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30   if( pGroupBy==0
8620: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8630: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
8640: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 61 20 47  e->zErrMsg, "a G
8650: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69  ROUP BY clause i
8660: 73 20 72 65 71 75 69 72 65 64 20 22 0a 20 20 20  s required ".   
8670: 20 20 20 20 20 20 22 62 65 66 6f 72 65 20 48 41        "before HA
8680: 56 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20 20  VING", 0);.     
8690: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
86a0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
86b0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
86c0: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
86d0: 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
86e0: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
86f0: 69 73 74 2c 20 70 48 61 76 69 6e 67 29 20 29 7b  ist, pHaving) ){
8700: 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
8710: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
8720: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
8730: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 48  Check(pParse, pH
8740: 61 76 69 6e 67 2c 20 69 73 41 67 67 2c 20 30 29  aving, isAgg, 0)
8750: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
8760: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
8770: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
8780: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c   for the special
8790: 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e 28 29   case of a min()
87a0: 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
87b0: 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20 20 2a  on by itself.  *
87c0: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
87d0: 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
87e0: 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72  simpleMinMaxQuer
87f0: 79 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65  y(pParse, p, eDe
8800: 73 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a 20 20  st, iParm) ){.  
8810: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f    rc = 0;.    go
8820: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
8830: 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67   }..  /* Begin g
8840: 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a  enerating code..
8850: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
8860: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
8870: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
8880: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
8890: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
88a0: 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
88b0: 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
88c0: 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
88d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
88e0: 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  bList->nId; i++)
88f0: 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64 4e 54 61  {.    int oldNTa
8900: 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c  b;.    if( pTabL
8910: 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
8920: 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
8930: 0a 20 20 20 20 6f 6c 64 4e 54 61 62 20 3d 20 70  .    oldNTab = p
8940: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20  Parse->nTab;.   
8950: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d   pParse->nTab +=
8960: 20 69 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   i+1;.    sqlite
8970: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8980: 4f 70 65 6e 54 65 6d 70 2c 20 6f 6c 64 4e 54 61  OpenTemp, oldNTa
8990: 62 2b 69 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  b+i, 0);.    sql
89a0: 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65  iteSelect(pParse
89b0: 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
89c0: 2e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61  .pSelect, SRT_Ta
89d0: 62 6c 65 2c 20 6f 6c 64 4e 54 61 62 2b 69 29 3b  ble, oldNTab+i);
89e0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  .    pParse->nTa
89f0: 62 20 3d 20 6f 6c 64 4e 54 61 62 3b 0a 20 20 7d  b = oldNTab;.  }
8a00: 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e 20 61 6e 61  ..  /* Do an ana
8a10: 6c 79 73 69 73 20 6f 66 20 61 67 67 72 65 67 61  lysis of aggrega
8a20: 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  te expressions..
8a30: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 41 67 67    */.  sqliteAgg
8a40: 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28  regateInfoReset(
8a50: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 69  pParse);.  if( i
8a60: 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65  sAgg ){.    asse
8a70: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 41 67 67  rt( pParse->nAgg
8a80: 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 69  ==0 && pParse->i
8a90: 41 67 67 43 6f 75 6e 74 3c 30 20 29 3b 0a 20 20  AggCount<0 );.  
8aa0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
8ab0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
8ac0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
8ad0: 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  teExprAnalyzeAgg
8ae0: 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
8af0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
8b00: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67  pr) ){.        g
8b10: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
8b20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8b30: 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
8b40: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
8b50: 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
8b60: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
8b70: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
8b80: 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
8b90: 73 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  s(pParse, pGroup
8ba0: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  By->a[i].pExpr) 
8bb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
8bc0: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
8bd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8be0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48      }.    if( pH
8bf0: 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65 45  aving && sqliteE
8c00: 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
8c10: 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 48 61  ates(pParse, pHa
8c20: 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
8c30: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
8c40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f      }.    if( pO
8c50: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
8c60: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
8c70: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
8c80: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
8c90: 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
8ca0: 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
8cb0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
8cc0: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
8cd0: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
8ce0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
8cf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8d00: 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
8d10: 6c 69 6d 69 74 65 72 0a 20 20 2a 2f 0a 20 20 69  limiter.  */.  i
8d20: 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3c 3d 30 20  f( p->nLimit<=0 
8d30: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65  ){.    p->nOffse
8d40: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
8d50: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 66 66 73      if( p->nOffs
8d60: 65 74 3c 30 20 29 20 70 2d 3e 6e 4f 66 66 73 65  et<0 ) p->nOffse
8d70: 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t = 0;.    sqlit
8d80: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
8d90: 5f 4c 69 6d 69 74 2c 20 70 2d 3e 6e 4c 69 6d 69  _Limit, p->nLimi
8da0: 74 2c 20 70 2d 3e 6e 4f 66 66 73 65 74 29 3b 0a  t, p->nOffset);.
8db0: 20 20 7d 0a 20 20 20 20 0a 0a 20 20 2f 2a 20 49    }.    ..  /* I
8dc0: 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e  dentify column n
8dd0: 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20  ames if we will 
8de0: 62 65 20 75 73 69 6e 67 20 69 6e 20 74 68 65 20  be using in the 
8df0: 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a  callback.  This.
8e00: 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69    ** step is ski
8e10: 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70  pped if the outp
8e20: 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61  ut is going to a
8e30: 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f   table or a memo
8e40: 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  ry cell..  */.  
8e50: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
8e60: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67  allback ){.    g
8e70: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
8e80: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
8e90: 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ist, pEList);.  
8ea0: 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68  }..  /* Reset th
8eb0: 65 20 61 67 67 72 65 67 61 74 6f 72 0a 20 20 2a  e aggregator.  *
8ec0: 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  /.  if( isAgg ){
8ed0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
8ee0: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 52 65  ddOp(v, OP_AggRe
8ef0: 73 65 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  set, 0, pParse->
8f00: 6e 41 67 67 29 3b 0a 20 20 20 20 66 6f 72 28 69  nAgg);.    for(i
8f10: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  =0; i<pParse->nA
8f20: 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gg; i++){.      
8f30: 55 73 65 72 46 75 6e 63 20 2a 70 55 73 65 72 3b  UserFunc *pUser;
8f40: 0a 20 20 20 20 20 20 69 66 28 20 28 70 55 73 65  .      if( (pUse
8f50: 72 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67  r = pParse->aAgg
8f60: 5b 69 5d 2e 70 55 73 65 72 29 21 3d 30 20 26 26  [i].pUser)!=0 &&
8f70: 20 70 55 73 65 72 2d 3e 78 46 69 6e 61 6c 69 7a   pUser->xFinaliz
8f80: 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=0 ){.        
8f90: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8fa0: 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a  v, OP_AggFinaliz
8fb0: 65 72 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20  er, 0, i);.     
8fc0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
8fd0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP3(v, -1, (ch
8fe0: 61 72 2a 29 70 55 73 65 72 2d 3e 78 46 69 6e 61  ar*)pUser->xFina
8ff0: 6c 69 7a 65 2c 20 50 33 5f 50 4f 49 4e 54 45 52  lize, P3_POINTER
9000: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9010: 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
9020: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  y==0 ){.      sq
9030: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9040: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
9050: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
9060: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
9070: 67 67 46 6f 63 75 73 2c 20 30 2c 20 30 29 3b 0a  ggFocus, 0, 0);.
9080: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
9090: 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69  <pParse->nAgg; i
90a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  ++){.        Exp
90b0: 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 20 20 69  r *pE;.        i
90c0: 66 28 20 21 70 50 61 72 73 65 2d 3e 61 41 67 67  f( !pParse->aAgg
90d0: 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74  [i].isAgg ) cont
90e0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45  inue;.        pE
90f0: 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b   = pParse->aAgg[
9100: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
9110: 20 20 61 73 73 65 72 74 28 20 70 45 3d 3d 30 20    assert( pE==0 
9120: 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  || pE->op==TK_AG
9130: 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
9140: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
9150: 3d 3d 30 20 7c 7c 20 28 70 45 2d 3e 70 4c 69 73  ==0 || (pE->pLis
9160: 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 69 73  t!=0 && pE->pLis
9170: 74 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a  t->nExpr==1) );.
9180: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 3d 3d          if( pE==
9190: 30 20 7c 7c 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e  0 || pE->iColumn
91a0: 3d 3d 46 4e 5f 53 75 6d 20 29 7b 0a 20 20 20 20  ==FN_Sum ){.    
91b0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
91c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
91d0: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
91e0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
91f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 53  AddOp(v, OP_AggS
9200: 65 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20  et, 0, i);.     
9210: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
9220: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9230: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9240: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
9250: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e  memory cell to N
9260: 55 4c 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ULL.  */.  if( e
9270: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b  Dest==SRT_Mem ){
9280: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
9290: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
92a0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  g, 0, 0);.    sq
92b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
92c0: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50   OP_MemStore, iP
92d0: 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  arm, 1);.  }..  
92e0: 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74  /* Begin the dat
92f0: 61 62 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a  abase scan.  */.
9300: 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
9310: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
9320: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
9330: 65 6e 54 65 6d 70 2c 20 64 69 73 74 69 6e 63 74  enTemp, distinct
9340: 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  , 1);.  }.  pWIn
9350: 66 6f 20 3d 20 73 71 6c 69 74 65 57 68 65 72 65  fo = sqliteWhere
9360: 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
9370: 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
9380: 30 29 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  0);.  if( pWInfo
9390: 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
93a0: 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73 65  t_end;..  /* Use
93b0: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e   the standard in
93c0: 6e 65 72 20 6c 6f 6f 70 20 69 66 20 77 65 20 61  ner loop if we a
93d0: 72 65 20 6e 6f 74 20 64 65 61 6c 69 6e 67 20 77  re not dealing w
93e0: 69 74 68 0a 20 20 2a 2a 20 61 67 67 72 65 67 61  ith.  ** aggrega
93f0: 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  tes.  */.  if( !
9400: 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28  isAgg ){.    if(
9410: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
9420: 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
9430: 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
9440: 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74   distinct, eDest
9450: 2c 20 69 50 61 72 6d 2c 0a 20 20 20 20 20 20 20  , iParm,.       
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
9470: 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20  nfo->iContinue, 
9480: 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 20  pWInfo->iBreak) 
9490: 29 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ){.       goto s
94a0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
94b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
94c0: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
94d0: 68 20 61 67 67 72 65 67 61 74 65 73 2c 20 74 68  h aggregates, th
94e0: 65 6e 20 74 6f 20 74 68 65 20 73 70 65 63 69 61  en to the specia
94f0: 6c 20 61 67 67 72 65 67 61 74 65 0a 20 20 2a 2a  l aggregate.  **
9500: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 0a 20   processing.  . 
9510: 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20   */.  else{.    
9520: 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
9530: 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 31 3b 0a        int lbl1;.
9540: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
9550: 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
9560: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
9570: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
9580: 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
9590: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
95a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
95b0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
95c0: 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 47 72 6f 75  P_MakeKey, pGrou
95d0: 70 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a  pBy->nExpr, 0);.
95e0: 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c        lbl1 = sql
95f0: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
9600: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
9610: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
9620: 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 6c 62  _AggFocus, 0, lb
9630: 6c 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  l1);.      for(i
9640: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  =0; i<pParse->nA
9650: 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gg; i++){.      
9660: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 41    if( pParse->aA
9670: 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f  gg[i].isAgg ) co
9680: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
9690: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
96a0: 50 61 72 73 65 2c 20 70 50 61 72 73 65 2d 3e 61  Parse, pParse->a
96b0: 41 67 67 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  Agg[i].pExpr);. 
96c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
96d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
96e0: 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20  Set, 0, i);.    
96f0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
9700: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
9710: 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 7d  (v, lbl1);.    }
9720: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
9730: 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b  pParse->nAgg; i+
9740: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
9750: 70 45 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70  pE;.      int op
9760: 2c 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 21  , j;.      if( !
9770: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
9780: 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65  isAgg ) continue
9790: 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 50 61  ;.      pE = pPa
97a0: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78  rse->aAgg[i].pEx
97b0: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
97c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
97d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
97e0: 2c 20 4f 50 5f 41 67 67 49 6e 63 72 2c 20 31 2c  , OP_AggIncr, 1,
97f0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e   i);.        con
9800: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
9810: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
9820: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
9830: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 61 73  TION );.      as
9840: 73 65 72 74 28 20 70 45 2d 3e 70 4c 69 73 74 21  sert( pE->pList!
9850: 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  =0 );.      for(
9860: 6a 3d 30 3b 20 6a 3c 70 45 2d 3e 70 4c 69 73 74  j=0; j<pE->pList
9870: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
9880: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70         sqliteExp
9890: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
98a0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45  ->pList->a[j].pE
98b0: 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
98c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
98d0: 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74  dOp(v, OP_AggGet
98e0: 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20 73  , 0, i);.      s
98f0: 77 69 74 63 68 28 20 70 45 2d 3e 69 43 6f 6c 75  witch( pE->iColu
9900: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  mn ){.        ca
9910: 73 65 20 46 4e 5f 4d 69 6e 3a 20 20 20 20 20 20  se FN_Min:      
9920: 6f 70 20 3d 20 4f 50 5f 4d 69 6e 3b 20 20 20 20  op = OP_Min;    
9930: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
9940: 63 61 73 65 20 46 4e 5f 4d 61 78 3a 20 20 20 20  case FN_Max:    
9950: 20 20 6f 70 20 3d 20 4f 50 5f 4d 61 78 3b 20 20    op = OP_Max;  
9960: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9970: 20 20 63 61 73 65 20 46 4e 5f 41 76 67 3a 20 20    case FN_Avg:  
9980: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 41 64 64 3b      op = OP_Add;
9990: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
99a0: 20 20 20 20 63 61 73 65 20 46 4e 5f 53 75 6d 3a      case FN_Sum:
99b0: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 41 64        op = OP_Ad
99c0: 64 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  d;     break;.  
99d0: 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 55 6e        case FN_Un
99e0: 6b 6e 6f 77 6e 3a 20 20 6f 70 20 3d 20 4f 50 5f  known:  op = OP_
99f0: 41 67 67 46 75 6e 63 3b 20 62 72 65 61 6b 3b 0a  AggFunc; break;.
9a00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
9a10: 28 20 6f 70 21 3d 4f 50 5f 41 67 67 46 75 6e 63  ( op!=OP_AggFunc
9a20: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9a30: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  teVdbeAddOp(v, o
9a40: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
9a50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
9a60: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
9a70: 2c 20 4f 50 5f 41 67 67 46 75 6e 63 2c 20 30 2c  , OP_AggFunc, 0,
9a80: 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70   pE->pList->nExp
9a90: 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
9aa0: 72 74 28 20 70 50 61 72 73 65 2d 3e 61 41 67 67  rt( pParse->aAgg
9ab0: 5b 69 5d 2e 70 55 73 65 72 21 3d 30 20 29 3b 0a  [i].pUser!=0 );.
9ac0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9ad0: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
9ae0: 70 55 73 65 72 2d 3e 78 53 74 65 70 21 3d 30 20  pUser->xStep!=0 
9af0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9b00: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
9b10: 2d 31 2c 28 63 68 61 72 2a 29 70 50 61 72 73 65  -1,(char*)pParse
9b20: 2d 3e 61 41 67 67 5b 69 5d 2e 70 55 73 65 72 2d  ->aAgg[i].pUser-
9b30: 3e 78 53 74 65 70 2c 50 33 5f 50 4f 49 4e 54 45  >xStep,P3_POINTE
9b40: 52 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  R);.      }.    
9b50: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
9b60: 70 28 76 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20  p(v, OP_AggSet, 
9b70: 30 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, i);.    }.  }
9b80: 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64  ..  /* End the d
9b90: 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
9ba0: 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  p..  */.  sqlite
9bb0: 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
9bc0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  ;..  /* If we ar
9bd0: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  e processing agg
9be0: 72 65 67 61 74 65 73 2c 20 77 65 20 6e 65 65 64  regates, we need
9bf0: 20 74 6f 20 73 65 74 20 75 70 20 61 20 73 65 63   to set up a sec
9c00: 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76  ond loop.  ** ov
9c10: 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 67  er all of the ag
9c20: 67 72 65 67 61 74 65 20 76 61 6c 75 65 73 20 61  gregate values a
9c30: 6e 64 20 70 72 6f 63 65 73 73 20 74 68 65 6d 2e  nd process them.
9c40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67  .  */.  if( isAg
9c50: 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64  g ){.    int end
9c60: 61 67 67 20 3d 20 73 71 6c 69 74 65 56 64 62 65  agg = sqliteVdbe
9c70: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
9c80: 20 20 69 6e 74 20 73 74 61 72 74 61 67 67 3b 0a    int startagg;.
9c90: 20 20 20 20 73 74 61 72 74 61 67 67 20 3d 20 73      startagg = s
9ca0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
9cb0: 2c 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c  , OP_AggNext, 0,
9cc0: 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 70 50   endagg);.    pP
9cd0: 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 31  arse->useAgg = 1
9ce0: 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
9cf0: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
9d00: 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  eExprIfFalse(pPa
9d10: 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73 74  rse, pHaving, st
9d20: 61 72 74 61 67 67 29 3b 0a 20 20 20 20 7d 0a 20  artagg);.    }. 
9d30: 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e     if( selectInn
9d40: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
9d50: 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
9d60: 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c  derBy, distinct,
9d70: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 0a 20   eDest, iParm,. 
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 20 20 20 73 74 61 72 74 61 67 67 2c 20 65 6e 64     startagg, end
9da0: 61 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  agg) ){.      go
9db0: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
9dc0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
9dd0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
9de0: 6f 74 6f 2c 20 30 2c 20 73 74 61 72 74 61 67 67  oto, 0, startagg
9df0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
9e00: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
9e10: 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 73 71   endagg);.    sq
9e20: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9e30: 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b   OP_Noop, 0, 0);
9e40: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65  .    pParse->use
9e50: 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Agg = 0;.  }..  
9e60: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
9e70: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
9e80: 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20  e, then we need 
9e90: 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75  to sort the resu
9ea0: 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e  lts.  ** and sen
9eb0: 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61  d them to the ca
9ec0: 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e  llback one by on
9ed0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  e..  */.  if( pO
9ee0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65  rderBy ){.    ge
9ef0: 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 76  nerateSortTail(v
9f00: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
9f10: 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
9f20: 6e 54 61 62 20 3d 20 62 61 73 65 3b 0a 0a 0a 20  nTab = base;... 
9f30: 20 2f 2a 20 49 73 73 75 65 20 61 20 6e 75 6c 6c   /* Issue a null
9f40: 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 61   callback if tha
9f50: 74 20 69 73 20 77 68 61 74 20 74 68 65 20 75 73  t is what the us
9f60: 65 72 20 77 61 6e 74 73 2e 0a 20 20 2a 2f 0a 20  er wants..  */. 
9f70: 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62   if( (pParse->db
9f80: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
9f90: 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 29 21 3d  _NullCallback)!=
9fa0: 30 20 26 26 20 65 44 65 73 74 3d 3d 53 52 54 5f  0 && eDest==SRT_
9fb0: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
9fc0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9fd0: 76 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c 6c 62 61  v, OP_NullCallba
9fe0: 63 6b 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ck, pEList->nExp
9ff0: 72 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r, 0);.  }..  /*
a000: 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20   The SELECT was 
a010: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64  successfully cod
a020: 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65  ed.   Set the re
a030: 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20  turn code to 0. 
a040: 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
a050: 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  no errors..  */.
a060: 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20    rc = 0;..  /* 
a070: 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f  Control jumps to
a080: 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f   here if an erro
a090: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
a0a0: 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a   above, or upon.
a0b0: 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
a0c0: 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45  coding of the SE
a0d0: 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63  LECT..  */.selec
a0e0: 74 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 41  t_end:.  sqliteA
a0f0: 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65  ggregateInfoRese
a100: 74 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74  t(pParse);.  ret
a110: 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.