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

Artifact 008d79761a6025e4db490c8f732e32631c0c57c3:


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 34 36 20  select.c,v 1.46 
0200: 32 30 30 31 2f 31 31 2f 30 36 20 30 34 3a 30 30  2001/11/06 04:00
0210: 3a 31 39 20 64 72 68 20 45 78 70 20 24 0a 2a 2f  :19 drh Exp $.*/
0220: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0230: 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 41  eInt.h"../*.** A
0240: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65  llocate a new Se
0250: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61  lect structure a
0260: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
0270: 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73  ter to that.** s
0280: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c  tructure..*/.Sel
0290: 65 63 74 20 2a 73 71 6c 69 74 65 53 65 6c 65 63  ect *sqliteSelec
02a0: 74 4e 65 77 28 0a 20 20 45 78 70 72 4c 69 73 74  tNew(.  ExprList
02b0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f 2a   *pEList,     /*
02c0: 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 74   which columns t
02d0: 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 65  o include in the
02e0: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 49 64 4c   result */.  IdL
02f0: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
0300: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
0310: 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20 74  lause -- which t
0320: 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f  ables to scan */
0330: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
0340: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
0350: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
0360: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
0370: 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 47  upBy,   /* the G
0380: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
0390: 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
03a0: 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  g,        /* the
03b0: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 2a   HAVING clause *
03c0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
03d0: 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68 65  rderBy,   /* the
03e0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
03f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74   */.  int isDist
0400: 69 6e 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 74  inct,       /* t
0410: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
0420: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
0430: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
0440: 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20  nLimit,         
0450: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
0460: 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 74 20  .  -1 means not 
0470: 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  used */.  int nO
0480: 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20  ffset           
0490: 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75 65 2e  /* OFFSET value.
04a0: 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 74 20 75    -1 means not u
04b0: 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  sed */.){.  Sele
04c0: 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  ct *pNew;.  pNew
04d0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
04e0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
04f0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
0500: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  ){.    sqliteExp
0510: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69  rListDelete(pELi
0520: 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 49  st);.    sqliteI
0530: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 53 72 63  dListDelete(pSrc
0540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  );.    sqliteExp
0550: 72 44 65 6c 65 74 65 28 70 57 68 65 72 65 29 3b  rDelete(pWhere);
0560: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 4c  .    sqliteExprL
0570: 69 73 74 44 65 6c 65 74 65 28 70 47 72 6f 75 70  istDelete(pGroup
0580: 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45  By);.    sqliteE
0590: 78 70 72 44 65 6c 65 74 65 28 70 48 61 76 69 6e  xprDelete(pHavin
05a0: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78  g);.    sqliteEx
05b0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4f 72  prListDelete(pOr
05c0: 64 65 72 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  derBy);.  }else{
05d0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  .    pNew->pELis
05e0: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20  t = pEList;.    
05f0: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72  pNew->pSrc = pSr
0600: 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 68  c;.    pNew->pWh
0610: 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
0620: 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
0630: 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20   = pGroupBy;.   
0640: 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
0650: 20 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 70 4e   pHaving;.    pN
0660: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  ew->pOrderBy = p
0670: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 4e 65  OrderBy;.    pNe
0680: 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  w->isDistinct = 
0690: 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20  isDistinct;.    
06a0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  pNew->op = TK_SE
06b0: 4c 45 43 54 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  LECT;.    pNew->
06c0: 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d 69 74 3b  nLimit = nLimit;
06d0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 66 66 73  .    pNew->nOffs
06e0: 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b 0a 20 20  et = nOffset;.  
06f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
0700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
0710: 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63   the given Selec
0720: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0730: 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74  all of its subst
0740: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
0750: 64 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65  d sqliteSelectDe
0760: 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70 29 7b  lete(Select *p){
0770: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
0780: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 45 78  turn;.  sqliteEx
0790: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
07a0: 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  pEList);.  sqlit
07b0: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  eIdListDelete(p-
07c0: 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  >pSrc);.  sqlite
07d0: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 57  ExprDelete(p->pW
07e0: 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 45  here);.  sqliteE
07f0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  xprListDelete(p-
0800: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 73 71  >pGroupBy);.  sq
0810: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
0820: 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 73 71  ->pHaving);.  sq
0830: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
0840: 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  te(p->pOrderBy);
0850: 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44  .  sqliteSelectD
0860: 65 6c 65 74 65 28 70 2d 3e 70 50 72 69 6f 72 29  elete(p->pPrior)
0870: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
0880: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  );.}../*.** Dele
0890: 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65  te the aggregate
08a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
08b0: 6d 20 74 68 65 20 70 61 72 73 65 20 73 74 72 75  m the parse stru
08c0: 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cture..*/.void s
08d0: 71 6c 69 74 65 50 61 72 73 65 49 6e 66 6f 52 65  qliteParseInfoRe
08e0: 73 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  set(Parse *pPars
08f0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e){.  sqliteFree
0900: 28 70 50 61 72 73 65 2d 3e 61 41 67 67 29 3b 0a  (pParse->aAgg);.
0910: 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20 3d    pParse->aAgg =
0920: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41   0;.  pParse->nA
0930: 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  gg = 0;.  pParse
0940: 2d 3e 69 41 67 67 43 6f 75 6e 74 20 3d 20 2d 31  ->iAggCount = -1
0950: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41  ;.  pParse->useA
0960: 67 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gg = 0;.}../*.**
0970: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
0980: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
0990: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
09a0: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
09b0: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
09c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 4c 69  ..**.** The pELi
09d0: 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  st is used to de
09e0: 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75  termine the valu
09f0: 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  es for each colu
0a00: 6d 6e 20 69 6e 20 74 68 65 0a 2a 2a 20 72 65 73  mn in the.** res
0a10: 75 6c 74 20 72 6f 77 2e 20 20 45 78 63 65 70 74  ult row.  Except
0a20: 20 20 69 66 20 70 45 4c 69 73 74 3d 3d 4e 55 4c    if pEList==NUL
0a30: 4c 2c 20 74 68 65 6e 20 77 65 20 6a 75 73 74 20  L, then we just 
0a40: 72 65 61 64 20 6e 43 6f 6c 75 6d 6e 0a 2a 2a 20  read nColumn.** 
0a50: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  elements from th
0a60: 65 20 73 72 63 54 61 62 20 74 61 62 6c 65 2e 0a  e srcTab table..
0a70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
0a80: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
0a90: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
0aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0ab0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
0ac0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
0ad0: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c  List,       /* L
0ae0: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65  ist of values be
0af0: 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f  ing extracted */
0b00: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
0b10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
0b20: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
0b30: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  s table */.  int
0b40: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   nColumn,       
0b50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0b60: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
0b70: 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f   source table */
0b80: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
0b90: 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66  derBy,     /* If
0ba0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20   not NULL, sort 
0bb0: 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68  results using th
0bc0: 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  is key */.  int 
0bd0: 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20  distinct,       
0be0: 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d      /* If >=0, m
0bf0: 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74 73  ake sure results
0c00: 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f   are distinct */
0c10: 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20  .  int eDest,   
0c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
0c30: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
0c40: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
0c50: 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20   int iParm,     
0c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61           /* An a
0c70: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 64  rgument to the d
0c80: 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a  isposal method *
0c90: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
0ca0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  e,          /* J
0cb0: 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
0cc0: 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72  inue with next r
0cd0: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ow */.  int iBre
0ce0: 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
0cf0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
0d00: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
0d10: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29   inner loop */.)
0d20: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
0d30: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
0d40: 6e 74 20 69 3b 0a 20 20 69 66 28 20 76 3d 3d 30  nt i;.  if( v==0
0d50: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
0d60: 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75  /* Pull the requ
0d70: 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ested columns.. 
0d80: 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69 73 74   */.  if( pEList
0d90: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
0da0: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
0db0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
0dc0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
0dd0: 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  rse, pEList->a[i
0de0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
0df0: 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45      nColumn = pE
0e00: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  List->nExpr;.  }
0e10: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
0e20: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
0e30: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
0e40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
0e50: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
0e60: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  i);.    }.  }.. 
0e70: 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49   /* If the DISTI
0e80: 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20  NCT keyword was 
0e90: 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53  present on the S
0ea0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
0eb0: 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f    ** and this ro
0ec0: 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20  w has been seen 
0ed0: 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20  before, then do 
0ee0: 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f  not make this ro
0ef0: 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74  w.  ** part of t
0f00: 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a  he result..  */.
0f10: 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 3e 3d    if( distinct>=
0f20: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 62 6c  0 ){.    int lbl
0f30: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
0f40: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73  eLabel(v);.    s
0f50: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
0f60: 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 45  , OP_MakeKey, pE
0f70: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b  List->nExpr, 1);
0f80: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
0f90: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74 69  ddOp(v, OP_Disti
0fa0: 6e 63 74 2c 20 64 69 73 74 69 6e 63 74 2c 20 6c  nct, distinct, l
0fb0: 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  bl);.    sqliteV
0fc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
0fd0: 6f 70 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  op, pEList->nExp
0fe0: 72 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  r+1, 0);.    sql
0ff0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
1000: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
1010: 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69  tinue);.    sqli
1020: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
1030: 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  el(v, lbl);.    
1040: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
1050: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
1060: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
1070: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
1080: 31 2c 20 22 22 2c 20 50 33 5f 53 54 41 54 49 43  1, "", P3_STATIC
1090: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
10a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
10b0: 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a  , distinct, 0);.
10c0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
10d0: 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
10e0: 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 73  Y clause, then s
10f0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1100: 0a 20 20 2a 2a 20 69 6e 20 61 20 73 6f 72 74 65  .  ** in a sorte
1110: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  r..  */.  if( pO
1120: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 63 68  rderBy ){.    ch
1130: 61 72 20 2a 7a 53 6f 72 74 4f 72 64 65 72 3b 0a  ar *zSortOrder;.
1140: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
1150: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61  dOp(v, OP_SortMa
1160: 6b 65 52 65 63 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  keRec, nColumn, 
1170: 30 29 3b 0a 20 20 20 20 7a 53 6f 72 74 4f 72 64  0);.    zSortOrd
1180: 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  er = sqliteMallo
1190: 63 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  c( pOrderBy->nEx
11a0: 70 72 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66  pr + 1 );.    if
11b0: 28 20 7a 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20  ( zSortOrder==0 
11c0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
11d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
11e0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
11f0: 7b 0a 20 20 20 20 20 20 7a 53 6f 72 74 4f 72 64  {.      zSortOrd
1200: 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
1210: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
1220: 20 3f 20 27 2d 27 20 3a 20 27 2b 27 3b 0a 20 20   ? '-' : '+';.  
1230: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
1240: 64 65 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  de(pParse, pOrde
1250: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
1260: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 6f 72  ;.    }.    zSor
1270: 74 4f 72 64 65 72 5b 70 4f 72 64 65 72 42 79 2d  tOrder[pOrderBy-
1280: 3e 6e 45 78 70 72 5d 20 3d 20 30 3b 0a 20 20 20  >nExpr] = 0;.   
1290: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12a0: 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 4b  (v, OP_SortMakeK
12b0: 65 79 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ey, pOrderBy->nE
12c0: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  xpr, 0);.    sql
12d0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
12e0: 76 2c 20 2d 31 2c 20 7a 53 6f 72 74 4f 72 64 65  v, -1, zSortOrde
12f0: 72 2c 20 73 74 72 6c 65 6e 28 7a 53 6f 72 74 4f  r, strlen(zSortO
1300: 72 64 65 72 29 29 3b 0a 20 20 20 20 73 71 6c 69  rder));.    sqli
1310: 74 65 46 72 65 65 28 7a 53 6f 72 74 4f 72 64 65  teFree(zSortOrde
1320: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  r);.    sqliteVd
1330: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
1340: 72 74 50 75 74 2c 20 30 2c 20 30 29 3b 0a 20 20  rtPut, 0, 0);.  
1350: 7d 65 6c 73 65 20 0a 0a 20 20 2f 2a 20 49 6e 20  }else ..  /* In 
1360: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
1370: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
1380: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
1390: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
13a0: 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e   ** table iParm.
13b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
13c0: 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 29 7b 0a  t==SRT_Union ){.
13d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
13e0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
13f0: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  cord, nColumn, 0
1400: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
1410: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
1420: 69 6e 67 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  ing, iParm, 0);.
1430: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
1440: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 22  angeP3(v, -1, ""
1450: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
1460: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
1470: 70 28 76 2c 20 4f 50 5f 50 75 74 2c 20 69 50 61  p(v, OP_Put, iPa
1480: 72 6d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20  rm, 0);.  }else 
1490: 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65  ..  /* Store the
14a0: 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
14b0: 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
14c0: 65 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ey..  */.  if( e
14d0: 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
14e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
14f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
1500: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
1510: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1520: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1530: 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c  NewRecno, iParm,
1540: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
1550: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
1560: 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ull, 1, 0);.    
1570: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
1580: 76 2c 20 4f 50 5f 50 75 74 2c 20 69 50 61 72 6d  v, OP_Put, iParm
1590: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 0a 0a  , 0);.  }else ..
15a0: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61    /* Construct a
15b0: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
15c0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62   query result, b
15d0: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20  ut instead of.  
15e0: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
15f0: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
1600: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
1610: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
1620: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
1630: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
1640: 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
1650: 3d 53 52 54 5f 45 78 63 65 70 74 20 29 7b 0a 20  =SRT_Except ){. 
1660: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
1670: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
1680: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
1690: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
16a0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
16b0: 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
16c0: 20 69 50 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b   iParm, addr+3);
16d0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
16e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74  ddOp(v, OP_Delet
16f0: 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  e, iParm, 0);.  
1700: 7d 65 6c 73 65 20 0a 0a 20 20 2f 2a 20 49 66 20  }else ..  /* If 
1710: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
1720: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
1730: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
1740: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
1750: 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
1760: 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
1770: 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
1780: 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
1790: 0a 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20  .  ** item into 
17a0: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
17b0: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
17c0: 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
17d0: 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20 20 20 20  =SRT_Set ){.    
17e0: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
17f0: 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =1 );.    sqlite
1800: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1810: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
1820: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
1830: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 22 2c  ngeP3(v, -1, "",
1840: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
1850: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1860: 28 76 2c 20 4f 50 5f 50 75 74 2c 20 69 50 61 72  (v, OP_Put, iPar
1870: 6d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 0a  m, 0);.  }else .
1880: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1890: 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
18a0: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
18b0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
18c0: 20 74 68 65 6e 0a 20 20 2a 2a 20 73 74 6f 72 65   then.  ** store
18d0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
18e0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
18f0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
1900: 62 72 65 61 6b 20 6f 75 74 0a 20 20 2a 2a 20 6f  break out.  ** o
1910: 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
1920: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
1930: 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20  t==SRT_Mem ){.  
1940: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
1950: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69  n==1 );.    sqli
1960: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1970: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
1980: 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  m, 0);.    sqlit
1990: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
19a0: 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b  _Goto, 0, iBreak
19b0: 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a  );.  }else..  /*
19c0: 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
19d0: 61 62 6f 76 65 2c 20 73 65 6e 64 20 74 68 65 20  above, send the 
19e0: 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c  data to the call
19f0: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  back function.. 
1a00: 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69   */.  {.    sqli
1a10: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1a20: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
1a30: 75 6d 6e 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  umn, iBreak);.  
1a40: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1a50: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
1a60: 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e  ner loop was gen
1a70: 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e  erated using a n
1a80: 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79  on-null pOrderBy
1a90: 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68   argument,.** th
1aa0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77  en the results w
1ab0: 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20  ere placed in a 
1ac0: 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74  sorter.  After t
1ad0: 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69  he loop is termi
1ae0: 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64  nated.** we need
1af0: 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74   to run the sort
1b00: 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  er and output th
1b10: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20  e results.  The 
1b20: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75  following.** rou
1b30: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
1b40: 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74  he code needed t
1b50: 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74  o do that..*/.st
1b60: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
1b70: 74 65 53 6f 72 74 54 61 69 6c 28 56 64 62 65 20  teSortTail(Vdbe 
1b80: 2a 76 2c 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 29  *v, int nColumn)
1b90: 7b 0a 20 20 69 6e 74 20 65 6e 64 20 3d 20 73 71  {.  int end = sq
1ba0: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
1bb0: 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72  l(v);.  int addr
1bc0: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64  ;.  sqliteVdbeAd
1bd0: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  dOp(v, OP_Sort, 
1be0: 30 2c 20 30 29 3b 0a 20 20 61 64 64 72 20 3d 20  0, 0);.  addr = 
1bf0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
1c00: 76 2c 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c 20  v, OP_SortNext, 
1c10: 30 2c 20 65 6e 64 29 3b 0a 20 20 73 71 6c 69 74  0, end);.  sqlit
1c20: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
1c30: 5f 53 6f 72 74 43 61 6c 6c 62 61 63 6b 2c 20 6e  _SortCallback, n
1c40: 43 6f 6c 75 6d 6e 2c 20 65 6e 64 29 3b 0a 20 20  Column, end);.  
1c50: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
1c60: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
1c70: 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 56 64  ddr);.  sqliteVd
1c80: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1c90: 2c 20 65 6e 64 29 3b 0a 20 20 73 71 6c 69 74 65  , end);.  sqlite
1ca0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1cb0: 53 6f 72 74 52 65 73 65 74 2c 20 30 2c 20 30 29  SortReset, 0, 0)
1cc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1cd0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
1ce0: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
1cf0: 20 68 6f 77 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e   how many column
1d00: 73 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 69  s there.** are i
1d10: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64  n the result and
1d20: 20 74 68 65 20 6e 61 6d 65 20 66 6f 72 20 65 61   the name for ea
1d30: 63 68 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73  ch column.  This
1d40: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
1d50: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69  is used to provi
1d60: 64 65 20 22 61 72 67 63 22 20 61 6e 64 20 22 61  de "argc" and "a
1d70: 7a 43 6f 6c 5b 5d 22 20 76 61 6c 75 65 73 20 69  zCol[]" values i
1d80: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  n the callback..
1d90: 2a 2f 0a 73 74 61 74 69 63 20 0a 76 6f 69 64 20  */.static .void 
1da0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
1db0: 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  mes(Parse *pPars
1dc0: 65 2c 20 49 64 4c 69 73 74 20 2a 70 54 61 62 4c  e, IdList *pTabL
1dd0: 69 73 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  ist, ExprList *p
1de0: 45 4c 69 73 74 29 7b 0a 20 20 56 64 62 65 20 2a  EList){.  Vdbe *
1df0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1e00: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  e;.  int i;.  if
1e10: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d  ( pParse->colNam
1e20: 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c  esSet || v==0 ||
1e30: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
1e40: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
1e50: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
1e60: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 73 71 6c  esSet = 1;.  sql
1e70: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
1e80: 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
1e90: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30  pEList->nExpr, 0
1ea0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1eb0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
1ec0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1ed0: 3b 0a 20 20 20 20 69 6e 74 20 73 68 6f 77 46 75  ;.    int showFu
1ee0: 6c 6c 4e 61 6d 65 73 3b 0a 20 20 20 20 69 66 28  llNames;.    if(
1ef0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
1f00: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ame ){.      cha
1f10: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  r *zName = pELis
1f20: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
1f30: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
1f40: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
1f50: 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20  nName, i, 0);.  
1f60: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
1f70: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e  angeP3(v, -1, zN
1f80: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
1f90: 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  e));.      conti
1fa0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nue;.    }.    p
1fb0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
1fc0: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
1fd0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1fe0: 20 20 20 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65      showFullName
1ff0: 73 20 3d 20 28 70 50 61 72 73 65 2d 3e 64 62 2d  s = (pParse->db-
2000: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2010: 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
2020: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 70 61  ;.    if( p->spa
2030: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
2040: 5b 30 5d 20 26 26 20 21 73 68 6f 77 46 75 6c 6c  [0] && !showFull
2050: 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 69  Names ){.      i
2060: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
2070: 56 64 62 65 41 64 64 4f 70 28 76 2c 4f 50 5f 43  VdbeAddOp(v,OP_C
2080: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29  olumnName, i, 0)
2090: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
20a0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
20b0: 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e  , p->span.z, p->
20c0: 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73  span.n);.      s
20d0: 71 6c 69 74 65 56 64 62 65 43 6f 6d 70 72 65 73  qliteVdbeCompres
20e0: 73 53 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b  sSpace(v, addr);
20f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
2100: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
2110: 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20  && pTabList ){. 
2120: 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73       if( pTabLis
2130: 74 2d 3e 6e 49 64 3e 31 20 7c 7c 20 73 68 6f 77  t->nId>1 || show
2140: 46 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  FullNames ){.   
2150: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
2160: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 61   = 0;.        Ta
2170: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
2180: 4c 69 73 74 2d 3e 61 5b 70 2d 3e 69 54 61 62 6c  List->a[p->iTabl
2190: 65 20 2d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e - pParse->nTab
21a0: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ].pTab;.        
21b0: 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20  char *zTab;. .  
21c0: 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61        zTab = pTa
21d0: 62 4c 69 73 74 2d 3e 61 5b 70 2d 3e 69 54 61 62  bList->a[p->iTab
21e0: 6c 65 20 2d 20 70 50 61 72 73 65 2d 3e 6e 54 61  le - pParse->nTa
21f0: 62 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  b].zAlias;.     
2200: 20 20 20 69 66 28 20 73 68 6f 77 46 75 6c 6c 4e     if( showFullN
2210: 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20  ames || zTab==0 
2220: 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a  ) zTab = pTab->z
2230: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Name;.        sq
2240: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a  liteSetString(&z
2250: 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c  Name, zTab, ".",
2260: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69   pTab->aCol[p->i
2270: 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 2c 20 30  Column].zName, 0
2280: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2290: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
22a0: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20  _ColumnName, i, 
22b0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
22c0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
22d0: 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  , -1, zName, str
22e0: 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  len(zName));.   
22f0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
2300: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  zName);.      }e
2310: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 61 62  lse{.        Tab
2320: 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c  le *pTab = pTabL
2330: 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  ist->a[0].pTab;.
2340: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
2350: 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ame = pTab->aCol
2360: 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61  [p->iColumn].zNa
2370: 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  me;.        sqli
2380: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
2390: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c  P_ColumnName, i,
23a0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
23b0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
23c0: 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 50 33  v, -1, zName, P3
23d0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
23e0: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
23f0: 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  p->span.z && p->
2400: 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  span.z[0] ){.   
2410: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
2420: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
2430: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69  OP_ColumnName, i
2440: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
2450: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
2460: 2c 20 2d 31 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c  , -1, p->span.z,
2470: 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20   p->span.n);.   
2480: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 6f 6d     sqliteVdbeCom
2490: 70 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64  pressSpace(v, ad
24a0: 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dr);.    }else{.
24b0: 20 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65        char zName
24c0: 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  [30];.      asse
24d0: 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  rt( p->op!=TK_CO
24e0: 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74  LUMN || pTabList
24f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 70 72  ==0 );.      spr
2500: 69 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c  intf(zName, "col
2510: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20  umn%d", i+1);.  
2520: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
2530: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
2540: 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20  Name, i, 0);.   
2550: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
2560: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61  ngeP3(v, -1, zNa
2570: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  me, strlen(zName
2580: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ));.    }.  }.}.
2590: 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74  ./*.** Name of t
25a0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
25b0: 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72  erator, used for
25c0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e   error messages.
25d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
25e0: 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e   char *selectOpN
25f0: 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63  ame(int id){.  c
2600: 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68  har *z;.  switch
2610: 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65  ( id ){.    case
2620: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a   TK_ALL:       z
2630: 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20   = "UNION ALL"; 
2640: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
2650: 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
2660: 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b  z = "INTERSECT";
2670: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
2680: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20  se TK_EXCEPT:   
2690: 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20   z = "EXCEPT";  
26a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
26b0: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
26c0: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20    z = "UNION";  
26d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
26e0: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f    return z;.}../
26f0: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 67 69 76  *.** For the giv
2700: 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  en SELECT statem
2710: 65 6e 74 2c 20 64 6f 20 74 77 6f 20 74 68 69 6e  ent, do two thin
2720: 67 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  gs..**.**    (1)
2730: 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54    Fill in the pT
2740: 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62  abList->a[].pTab
2750: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 49   fields in the I
2760: 64 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20  dList that .**  
2770: 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 74         defines t
2780: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
2790: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
27a0: 73 63 61 6e 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  scanned..**.**  
27b0: 20 20 28 32 29 20 20 49 66 20 74 68 65 20 63 6f    (2)  If the co
27c0: 6c 75 6d 6e 73 20 74 6f 20 62 65 20 65 78 74 72  lumns to be extr
27d0: 61 63 74 65 64 20 76 61 72 69 61 62 6c 65 20 28  acted variable (
27e0: 70 45 4c 69 73 74 29 20 69 73 20 4e 55 4c 4c 0a  pEList) is NULL.
27f0: 2a 2a 20 20 20 20 20 20 20 20 20 28 6d 65 61 6e  **         (mean
2800: 69 6e 67 20 74 68 61 74 20 61 20 22 2a 22 20 77  ing that a "*" w
2810: 61 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 53  as used in the S
2820: 51 4c 20 73 74 61 74 65 6d 65 6e 74 29 20 74 68  QL statement) th
2830: 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 72  en.**         cr
2840: 65 61 74 65 20 61 20 66 61 6b 65 20 70 45 4c 69  eate a fake pELi
2850: 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  st containing th
2860: 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63  e names of all c
2870: 6f 6c 75 6d 6e 73 0a 2a 2a 20 20 20 20 20 20 20  olumns.**       
2880: 20 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 2e    of all tables.
2890: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
28a0: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
28b0: 74 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65  there are proble
28c0: 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ms, leave an err
28d0: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e  or message.** in
28e0: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
28f0: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  rn non-zero..*/.
2900: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
2910: 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73  nColumnList(Pars
2920: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
2930: 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  t *p){.  int i, 
2940: 6a 3b 0a 20 20 49 64 4c 69 73 74 20 2a 70 54 61  j;.  IdList *pTa
2950: 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
2960: 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66  t *pEList;..  if
2970: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72  ( p==0 || p->pSr
2980: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  c==0 ) return 1;
2990: 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
29a0: 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
29b0: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  = p->pEList;..  
29c0: 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79  /* Look up every
29d0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61   table in the ta
29e0: 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ble list..  */. 
29f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
2a00: 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
2a10: 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
2a20: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 29 7b 0a  t->a[i].pTab ){.
2a30: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f        /* This ro
2a40: 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65  utine has run be
2a50: 66 6f 72 65 21 20 20 4e 6f 20 6e 65 65 64 20 74  fore!  No need t
2a60: 6f 20 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20  o continue */.  
2a70: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2a80: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62    }.    if( pTab
2a90: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
2aa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
2ab0: 4e 6f 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73  No table name is
2ac0: 20 67 69 76 65 6e 2e 20 20 49 6e 73 74 65 61 64   given.  Instead
2ad0: 2c 20 74 68 65 72 65 20 69 73 20 61 20 28 53 45  , there is a (SE
2ae0: 4c 45 43 54 20 2e 2e 2e 29 20 73 74 61 74 65 6d  LECT ...) statem
2af0: 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ent.      ** the
2b00: 20 72 65 73 75 6c 74 73 20 6f 66 20 77 68 69 63   results of whic
2b10: 68 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  h should be used
2b20: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65   in place of the
2b30: 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20 20   table.  The.   
2b40: 20 20 20 2a 2a 20 77 61 73 20 74 68 69 73 20 69     ** was this i
2b50: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 73  s implemented is
2b60: 20 74 68 61 74 20 74 68 65 20 28 53 45 4c 45 43   that the (SELEC
2b70: 54 20 2e 2e 2e 29 20 77 72 69 74 65 73 20 69 74  T ...) writes it
2b80: 73 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  s results.      
2b90: 2a 2a 20 69 6e 74 6f 20 61 20 74 65 6d 70 6f 72  ** into a tempor
2ba0: 61 72 79 20 74 61 62 6c 65 20 77 68 69 63 68 20  ary table which 
2bb0: 69 73 20 74 68 65 6e 20 73 63 61 6e 6e 65 64 20  is then scanned 
2bc0: 6c 69 6b 65 20 61 6e 79 20 6f 74 68 65 72 20 74  like any other t
2bd0: 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  able..      */. 
2be0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
2bf0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
2c00: 72 72 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20  rrMsg, .        
2c10: 20 20 22 28 53 45 4c 45 43 54 2e 2e 2e 29 20 69    "(SELECT...) i
2c20: 6e 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  n a FROM clause 
2c30: 69 73 20 6e 6f 74 20 79 65 74 20 69 6d 70 6c 65  is not yet imple
2c40: 6d 65 6e 74 65 64 2e 22 2c 20 30 29 3b 0a 20 20  mented.", 0);.  
2c50: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
2c60: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
2c70: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54   1;.    }.    pT
2c80: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
2c90: 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  b = sqliteFindTa
2ca0: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
2cb0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
2cc0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
2cd0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  TabList->a[i].pT
2ce0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ab==0 ){.      s
2cf0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
2d00: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
2d10: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
2d20: 20 22 2c 20 0a 20 20 20 20 20 20 20 20 20 70 54   ", .         pT
2d30: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  abList->a[i].zNa
2d40: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  me, 0);.      pP
2d50: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
2d60: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2d70: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
2d80: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c   the list of col
2d90: 75 6d 6e 73 20 74 6f 20 72 65 74 72 69 65 76 65  umns to retrieve
2da0: 20 69 73 20 22 2a 22 20 74 68 65 6e 20 72 65 70   is "*" then rep
2db0: 6c 61 63 65 20 69 74 20 77 69 74 68 0a 20 20 2a  lace it with.  *
2dc0: 2a 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  * a list of all 
2dd0: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 61 6c 6c  columns from all
2de0: 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
2df0: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
2e00: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2e10: 70 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69  pTabList->nId; i
2e20: 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  ++){.      Table
2e30: 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73   *pTab = pTabLis
2e40: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20  t->a[i].pTab;.  
2e50: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2e60: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
2e70: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
2e80: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70  Expr = sqliteExp
2e90: 72 28 54 4b 5f 44 4f 54 2c 20 30 2c 20 30 2c 20  r(TK_DOT, 0, 0, 
2ea0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
2eb0: 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b  pExpr==0 ) break
2ec0: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
2ed0: 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45  >pLeft = sqliteE
2ee0: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
2ef0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
2f00: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
2f10: 20 29 7b 20 73 71 6c 69 74 65 45 78 70 72 44 65   ){ sqliteExprDe
2f20: 6c 65 74 65 28 70 45 78 70 72 29 3b 20 62 72 65  lete(pExpr); bre
2f30: 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 70 45  ak; }.        pE
2f40: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  xpr->pLeft->toke
2f50: 6e 2e 7a 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  n.z = pTab->zNam
2f60: 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  e;.        pExpr
2f70: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e  ->pLeft->token.n
2f80: 20 3d 20 73 74 72 6c 65 6e 28 70 54 61 62 2d 3e   = strlen(pTab->
2f90: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2fa0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
2fb0: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44  sqliteExpr(TK_ID
2fc0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
2fd0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
2fe0: 52 69 67 68 74 3d 3d 30 20 29 7b 20 73 71 6c 69  Right==0 ){ sqli
2ff0: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  teExprDelete(pEx
3000: 70 72 29 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20  pr); break; }.  
3010: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69        pExpr->pRi
3020: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 70  ght->token.z = p
3030: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
3040: 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  me;.        pExp
3050: 72 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  r->pRight->token
3060: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 61 62  .n = strlen(pTab
3070: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
3080: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
3090: 3e 73 70 61 6e 2e 7a 20 3d 20 22 22 3b 0a 20 20  >span.z = "";.  
30a0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
30b0: 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.n = 0;.       
30c0: 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   pEList = sqlite
30d0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
30e0: 45 4c 69 73 74 2c 20 70 45 78 70 72 2c 20 30 29  EList, pExpr, 0)
30f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3100: 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20      p->pEList = 
3110: 70 45 4c 69 73 74 3b 0a 20 20 7d 0a 20 20 72 65  pEList;.  }.  re
3120: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
3130: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   This routine as
3140: 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65 73  sociates entries
3150: 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
3160: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
3170: 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  with.** columns 
3180: 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f  in a result.  Fo
3190: 72 20 65 61 63 68 20 4f 52 44 45 52 20 42 59 20  r each ORDER BY 
31a0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20  expression, the 
31b0: 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65  opcode of.** the
31c0: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
31d0: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b  is changed to TK
31e0: 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20  _COLUMN and the 
31f0: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66  iColumn value of
3200: 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  .** the top-leve
3210: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
3220: 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20   in with column 
3230: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
3240: 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  Table.** value o
3250: 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
3260: 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77  node is filled w
3270: 69 74 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d  ith iTable param
3280: 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eter..**.** If t
3290: 68 65 72 65 20 61 72 65 20 70 72 69 6f 72 20 53  here are prior S
32a0: 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74  ELECT clauses, t
32b0: 68 65 79 20 61 72 65 20 70 72 6f 63 65 73 73 65  hey are processe
32c0: 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63  d first.  A matc
32d0: 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69  h.** in an earli
32e0: 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20  er SELECT takes 
32f0: 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20  precedence over 
3300: 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a  a later SELECT..
3310: 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20  **.** Any entry 
3320: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  that does not ma
3330: 74 63 68 20 69 73 20 66 6c 61 67 67 65 64 20 61  tch is flagged a
3340: 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  s an error.  The
3350: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
3360: 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64  rors is returned
3370: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3380: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
3390: 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
33a0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
33b0: 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65  /* A place to le
33c0: 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ave error messag
33d0: 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
33e0: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
33f0: 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75  /* Match to resu
3400: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  lt columns of th
3410: 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45  is SELECT */.  E
3420: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
3430: 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  y,     /* The OR
3440: 44 45 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f  DER BY values to
3450: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 63   match against c
3460: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
3470: 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
3480: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
3490: 69 73 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e  is this value in
34a0: 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   iTable */.  int
34b0: 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 20 20   mustComplete   
34c0: 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55 45 20       /* If TRUE 
34d0: 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20 6d 75  all ORDER BYs mu
34e0: 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  st match */.){. 
34f0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20   int nErr = 0;. 
3500: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70   int i, j;.  Exp
3510: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a  rList *pEList;..
3520: 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30    if( pSelect==0
3530: 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   || pOrderBy==0 
3540: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
3550: 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29  ( mustComplete )
3560: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
3570: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
3580: 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79  ; i++){ pOrderBy
3590: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b  ->a[i].done = 0;
35a0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6c   }.  }.  if( fil
35b0: 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50  lInColumnList(pP
35c0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29  arse, pSelect) )
35d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
35e0: 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63    }.  if( pSelec
35f0: 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  t->pPrior ){.   
3600: 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65 72 62   if( matchOrderb
3610: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
3620: 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  , pSelect->pPrio
3630: 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69 54 61  r, pOrderBy, iTa
3640: 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ble, 0) ){.     
3650: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3660: 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20  .  }.  pEList = 
3670: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
3680: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
3690: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
36a0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
36b0: 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
36c0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e  i].pExpr;.    in
36d0: 74 20 6d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  t match = 0;.   
36e0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61   if( pOrderBy->a
36f0: 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69  [i].done ) conti
3700: 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  nue;.    for(j=0
3710: 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; j<pEList->nExp
3720: 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; j++){.      i
3730: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  f( pEList->a[j].
3740: 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e 6f 70  zName && (pE->op
3750: 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f  ==TK_ID || pE->o
3760: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20 29 7b  p==TK_STRING) ){
3770: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
3780: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
3790: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
37a0: 20 20 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 20     char *zLabel 
37b0: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
37c0: 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 2d  pE->token.z, pE-
37d0: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
37e0: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
37f0: 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  (zLabel);.      
3800: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
3810: 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65  Cmp(zName, zLabe
3820: 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20  l)==0 ){ .      
3830: 20 20 20 20 6d 61 74 63 68 20 3d 20 31 3b 20 0a      match = 1; .
3840: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3850: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 61    sqliteFree(zLa
3860: 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bel);.      }.  
3870: 20 20 20 20 69 66 28 20 6d 61 74 63 68 3d 3d 30      if( match==0
3880: 20 26 26 20 73 71 6c 69 74 65 45 78 70 72 43 6f   && sqliteExprCo
3890: 6d 70 61 72 65 28 70 45 2c 20 70 45 4c 69 73 74  mpare(pE, pEList
38a0: 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[j].pExpr) ){
38b0: 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 3d  .        match =
38c0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
38d0: 20 20 69 66 28 20 6d 61 74 63 68 20 29 7b 0a 20    if( match ){. 
38e0: 20 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20         pE->op = 
38f0: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
3900: 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d     pE->iColumn =
3910: 20 6a 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e   j;.        pE->
3920: 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b  iTable = iTable;
3930: 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
3940: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31  y->a[i].done = 1
3950: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3960: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3970: 20 20 20 69 66 28 20 21 6d 61 74 63 68 20 26 26     if( !match &&
3980: 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b   mustComplete ){
3990: 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66  .      char zBuf
39a0: 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73 70 72 69  [30];.      spri
39b0: 6e 74 66 28 7a 42 75 66 2c 22 25 64 22 2c 69 2b  ntf(zBuf,"%d",i+
39c0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
39d0: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
39e0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 4f 52 44  e->zErrMsg, "ORD
39f0: 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65  ER BY term numbe
3a00: 72 20 22 2c 20 7a 42 75 66 2c 20 0a 20 20 20 20  r ", zBuf, .    
3a10: 20 20 20 20 22 20 64 6f 65 73 20 6e 6f 74 20 6d      " does not m
3a20: 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20  atch any result 
3a30: 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
3a40: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
3a50: 2b 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  +;.      nErr++;
3a60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3a70: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3a80: 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a   nErr;  .}../*.*
3a90: 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
3aa0: 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
3ab0: 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
3ac0: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
3ad0: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
3ae0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
3af0: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
3b00: 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
3b10: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
3b20: 56 64 62 65 20 2a 73 71 6c 69 74 65 47 65 74 56  Vdbe *sqliteGetV
3b30: 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  dbe(Parse *pPars
3b40: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
3b50: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
3b60: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
3b70: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
3b80: 62 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43  be = sqliteVdbeC
3b90: 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62  reate(pParse->db
3ba0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
3bb0: 76 3b 0a 7d 0a 20 20 20 20 0a 0a 2f 2a 0a 2a 2a  v;.}.    ../*.**
3bc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3bd0: 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
3be0: 73 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20  ss a query that 
3bf0: 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75 6e  is really the un
3c00: 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73  ion.** or inters
3c10: 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72  ection of two or
3c20: 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71   more separate q
3c30: 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ueries..*/.stati
3c40: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
3c50: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
3c60: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
3c70: 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d  eDest, int iParm
3c80: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
3c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 63 63           /* Succ
3ca0: 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20  ess code from a 
3cb0: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
3cc0: 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
3cd0: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
3ce0: 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
3cf0: 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
3d00: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
3d10: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
3d20: 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
3d30: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 62 61  VDBE */.  int ba
3d40: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  se;           /*
3d50: 20 42 61 73 65 6c 69 6e 65 20 76 61 6c 75 65 20   Baseline value 
3d60: 66 6f 72 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  for pParse->nTab
3d70: 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73   */..  /* Make s
3d80: 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
3d90: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
3da0: 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73  on prior SELECTs
3db0: 2e 20 20 4f 6e 6c 79 20 74 68 65 20 0a 20 20 2a  .  Only the .  *
3dc0: 2a 20 6c 61 73 74 20 53 45 4c 45 43 54 20 69 6e  * last SELECT in
3dd0: 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
3de0: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
3df0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d  ..  */.  if( p==
3e00: 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  0 || p->pPrior==
3e10: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
3e20: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
3e30: 6f 72 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  or;.  if( pPrior
3e40: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
3e50: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
3e60: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
3e70: 73 67 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61  sg,"ORDER BY cla
3e80: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
3e90: 61 66 74 65 72 20 22 2c 0a 20 20 20 20 20 20 73  after ",.      s
3ea0: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
3eb0: 70 29 2c 20 22 20 6e 6f 74 20 62 65 66 6f 72 65  p), " not before
3ec0: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
3ed0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
3ee0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
3ef0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
3f00: 68 61 76 65 20 61 20 76 61 6c 69 64 20 71 75 65  have a valid que
3f10: 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e  ry engine.  If n
3f20: 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ot, create a new
3f30: 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d   one..  */.  v =
3f40: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
3f50: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
3f60: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a  =0 ) return 1;..
3f70: 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
3f80: 20 55 4e 49 4f 4e 20 6f 72 20 49 4e 54 45 52 53   UNION or INTERS
3f90: 45 43 54 49 4f 4e 0a 20 20 2a 2f 0a 20 20 62 61  ECTION.  */.  ba
3fa0: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  se = pParse->nTa
3fb0: 62 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  b;.  switch( p->
3fc0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
3fd0: 4b 5f 41 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  K_ALL:.    case 
3fe0: 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63  TK_EXCEPT:.    c
3ff0: 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a  ase TK_UNION: {.
4000: 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54        int unionT
4010: 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ab;    /* Cursor
4020: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
4030: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68  emporary table h
4040: 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f  olding result */
4050: 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20  .      int op;  
4060: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
4070: 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61  f the SRT_ opera
4080: 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74  tions to apply t
4090: 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20  o self */.      
40a0: 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20  int priorOp;    
40b0: 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65   /* The SRT_ ope
40c0: 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  ration to apply 
40d0: 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73  to prior selects
40e0: 20 2a 2f 0a 0a 20 20 20 20 20 20 70 72 69 6f 72   */..      prior
40f0: 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  Op = p->op==TK_A
4100: 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a  LL ? SRT_Table :
4110: 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
4120: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70 72 69    if( eDest==pri
4130: 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  orOp ){.        
4140: 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20  /* We can reuse 
4150: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
4160: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
4170: 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20   SELECT to our. 
4180: 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e         ** right.
4190: 20 20 54 68 69 73 20 61 6c 73 6f 20 6d 65 61 6e    This also mean
41a0: 73 20 77 65 20 61 72 65 20 6e 6f 74 20 74 68 65  s we are not the
41b0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 65 6c 65   right-most sele
41c0: 63 74 20 61 6e 64 20 73 6f 0a 20 20 20 20 20 20  ct and so.      
41d0: 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 68    ** we cannot h
41e0: 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
41f0: 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a  clause.        *
4200: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
4210: 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20  ab = iParm;.    
4220: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
4230: 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
4240: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4250: 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65     /* We will ne
4260: 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ed to create our
4270: 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74   own temporary t
4280: 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  able to hold the
4290: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  .        ** inte
42a0: 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
42b0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
42c0: 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
42d0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
42e0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
42f0: 4f 72 64 65 72 42 79 20 0a 20 20 20 20 20 20 20  OrderBy .       
4300: 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79   && matchOrderby
4310: 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  ToColumn(pParse,
4320: 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c   p, p->pOrderBy,
4330: 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 20 29 7b   unionTab, 1) ){
4340: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
4350: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
4360: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70         if( p->op
4370: 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  !=TK_ALL ){.    
4380: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4390: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
43a0: 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Temp, unionTab, 
43b0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
43c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
43d0: 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 75   OP_KeyAsData, u
43e0: 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20  nionTab, 1);.   
43f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4400: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4410: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
4420: 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Temp, unionTab, 
4430: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
4440: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
4450: 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
4460: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
4470: 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a  r left.      */.
4480: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
4490: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
44a0: 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c  pPrior, priorOp,
44b0: 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20   unionTab);.    
44c0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
44d0: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  n rc;..      /* 
44e0: 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
44f0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4500: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
4510: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
4520: 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  {.         case 
4530: 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d  TK_EXCEPT:  op =
4540: 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62   SRT_Except;   b
4550: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
4560: 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20  ase TK_UNION:   
4570: 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20  op = SRT_Union; 
4580: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4590: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
45a0: 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62      op = SRT_Tab
45b0: 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  le;    break;.  
45c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
45d0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
45e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
45f0: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70  ct(pParse, p, op
4600: 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20  , unionTab);.   
4610: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
4620: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
4630: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
4640: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
4650: 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
4660: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
4670: 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
4680: 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
4690: 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
46a0: 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
46b0: 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20     */      .    
46c0: 20 20 69 66 28 20 65 44 65 73 74 21 3d 70 72 69    if( eDest!=pri
46d0: 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  orOp ){.        
46e0: 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
46f0: 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  k;.        asser
4700: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
4710: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
4720: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
4730: 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74  se, 0, p->pEList
4740: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4750: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4760: 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61  _Rewind, unionTa
4770: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 0);.        i
4780: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 56 64  Break = sqliteVd
4790: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
47a0: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
47b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
47c0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
47d0: 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20  nTab, iBreak);. 
47e0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65         rc = sele
47f0: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
4800: 73 65 2c 20 30 2c 20 75 6e 69 6f 6e 54 61 62 2c  se, 0, unionTab,
4810: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
4820: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4840: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c  p->pOrderBy, -1,
4850: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a   eDest, iParm, .
4860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f               iCo
4880: 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
4890: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
48a0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
48b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
48c0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
48d0: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
48e0: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
48f0: 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
4900: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4910: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4920: 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
4930: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
4940: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
4950: 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61            genera
4960: 74 65 53 6f 72 74 54 61 69 6c 28 76 2c 20 70 2d  teSortTail(v, p-
4970: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
4980: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4990: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
49a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
49b0: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20  K_INTERSECT: {. 
49c0: 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74       int tab1, t
49d0: 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab2;.      int i
49e0: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 3b 0a 0a 20  Cont, iBreak;.. 
49f0: 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
4a00: 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
4a10: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
4a20: 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
4a30: 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
4a40: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
4a50: 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
4a60: 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
4a70: 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
4a80: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
4a90: 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
4aa0: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
4ab0: 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
4ac0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
4ad0: 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
4ae0: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
4af0: 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 6d  p->pOrderBy && m
4b00: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
4b10: 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e  umn(pParse,p,p->
4b20: 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29  pOrderBy,tab1,1)
4b30: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4b40: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
4b50: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4b60: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
4b70: 6d 70 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  mp, tab1, 0);.  
4b80: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4b90: 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44  dOp(v, OP_KeyAsD
4ba0: 61 74 61 2c 20 74 61 62 31 2c 20 31 29 3b 0a 0a  ata, tab1, 1);..
4bb0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
4bc0: 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
4bd0: 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
4be0: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
4bf0: 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
4c00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c    rc = sqliteSel
4c10: 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
4c20: 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  or, SRT_Union, t
4c30: 61 62 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab1);.      if( 
4c40: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
4c50: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
4c60: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
4c70: 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  T into temporary
4c80: 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20   table "tab2".  
4c90: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
4ca0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4cb0: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62  OP_OpenTemp, tab
4cc0: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
4cd0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4ce0: 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61  OP_KeyAsData, ta
4cf0: 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d  b2, 1);.      p-
4d00: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
4d10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65     rc = sqliteSe
4d20: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
4d30: 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 29  SRT_Union, tab2)
4d40: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
4d50: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
4d60: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
4d70: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  n rc;..      /* 
4d80: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
4d90: 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73   take the inters
4da0: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77  ection of the tw
4db0: 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  o temporary.    
4dc0: 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20    ** tables..   
4dd0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
4de0: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
4df0: 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43  .      generateC
4e00: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
4e10: 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29  e, 0, p->pEList)
4e20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
4e30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
4e40: 77 69 6e 64 2c 20 74 61 62 31 2c 20 30 29 3b 0a  wind, tab1, 0);.
4e50: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
4e60: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
4e70: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
4e80: 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  nt = sqliteVdbeA
4e90: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
4ea0: 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a   tab1, iBreak);.
4eb0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4ec0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 75 6c 6c  AddOp(v, OP_Full
4ed0: 4b 65 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  Key, tab1, 0);. 
4ee0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4ef0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  ddOp(v, OP_NotFo
4f00: 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74  und, tab2, iCont
4f10: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  );.      rc = se
4f20: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
4f30: 61 72 73 65 2c 20 30 2c 20 74 61 62 31 2c 20 70  arse, 0, tab1, p
4f40: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
4f50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
4f70: 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65  >pOrderBy, -1, e
4f80: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20  Dest, iParm, .  
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fa0: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74             iCont
4fb0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
4fc0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
4fd0: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
4fe0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4ff0: 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 29 3b  Goto, 0, iCont);
5000: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
5010: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
5020: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
5030: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5040: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
5050: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
5060: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5070: 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20  OP_Close, tab1, 
5080: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  0);.      if( p-
5090: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
50a0: 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72       generateSor
50b0: 74 54 61 69 6c 28 76 2c 20 70 2d 3e 70 45 4c 69  tTail(v, p->pELi
50c0: 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
50d0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
50e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
50f0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
5100: 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
5110: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   );.  if( p->pEL
5120: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69  ist->nExpr!=pPri
5130: 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
5140: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  r ){.    sqliteS
5150: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
5160: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 53 45 4c 45  ->zErrMsg, "SELE
5170: 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
5180: 61 6e 64 20 72 69 67 68 74 20 6f 66 20 22 2c 0a  and right of ",.
5190: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
51a0: 6d 65 28 70 2d 3e 6f 70 29 2c 20 22 20 64 6f 20  me(p->op), " do 
51b0: 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  not have the sam
51c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
51d0: 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 30 29 3b  lt columns", 0);
51e0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
51f0: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r++;.    return 
5200: 31 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  1;.  }.  pParse-
5210: 3e 6e 54 61 62 20 3d 20 62 61 73 65 3b 0a 20 20  >nTab = base;.  
5220: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
5230: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
5240: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
5250: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
5260: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
5270: 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
5280: 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
5290: 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
52a0: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
52b0: 65 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e  eDest and iParm.
52c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74  .**.**     eDest
52d0: 20 56 61 6c 75 65 20 20 20 20 20 20 20 52 65 73   Value       Res
52e0: 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d  ult.**     -----
52f0: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
5300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5320: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52  ------.**     SR
5330: 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e  T_Callback    In
5340: 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63  voke the callbac
5350: 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  k for each row o
5360: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  f the result..**
5370: 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20  .**     SRT_Mem 
5380: 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69          Store fi
5390: 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65  rst result in me
53a0: 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a  mory cell iParm.
53b0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65  **.**     SRT_Se
53c0: 74 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20  t         Store 
53d0: 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20  results as keys 
53e0: 6f 66 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  of a table with 
53f0: 63 75 72 73 6f 72 20 69 50 61 72 6d 0a 2a 2a 0a  cursor iParm.**.
5400: 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e  **     SRT_Union
5410: 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
5420: 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e  ults as a key in
5430: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
5440: 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  le iParm.**.**  
5450: 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20     SRT_Except   
5460: 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74     Remove result
5470: 73 20 66 6f 72 6d 20 74 68 65 20 74 65 6d 70 6f  s form the tempo
5480: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
5490: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
54a0: 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72  Table       Stor
54b0: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d  e results in tem
54c0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
54d0: 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  rm.**.** This ro
54e0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
54f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
5500: 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
5510: 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
5520: 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
5530: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
5540: 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
5550: 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
5560: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
5570: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
5580: 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
5590: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
55a0: 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
55b0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
55c0: 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
55d0: 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  at..*/.int sqlit
55e0: 65 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  eSelect(.  Parse
55f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
5600: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
5610: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
5620: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
5630: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
5640: 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
5650: 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e  g coded. */.  in
5660: 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20  t eDest,        
5670: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 3a 20       /* One of: 
5680: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 4d 65 6d  SRT_Callback Mem
5690: 20 53 65 74 20 55 6e 69 6f 6e 20 45 78 63 65 70   Set Union Excep
56a0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  t */.  int iParm
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
56c0: 20 53 61 76 65 20 72 65 73 75 6c 74 20 69 6e 20   Save result in 
56d0: 74 68 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  this memory loca
56e0: 74 69 6f 6e 2c 20 69 66 20 3e 3d 30 20 2a 2f 0a  tion, if >=0 */.
56f0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  ){.  int i;.  Wh
5700: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
5710: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
5720: 74 20 69 73 41 67 67 20 3d 20 30 3b 20 20 20 20  t isAgg = 0;    
5730: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
5740: 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
5750: 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
5760: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
5770: 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist;      /* Lis
5780: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
5790: 65 78 74 72 61 63 74 2e 20 20 4e 55 4c 4c 20 6d  extract.  NULL m
57a0: 65 61 6e 73 20 22 2a 22 20 2a 2f 0a 20 20 49 64  eans "*" */.  Id
57b0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
57c0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
57d0: 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
57e0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
57f0: 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
5800: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
5810: 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
5820: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
5830: 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
5840: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
5850: 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
5860: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
5870: 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
5880: 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
5890: 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
58a0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
58b0: 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20  *pHaving;       
58c0: 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20    /* The HAVING 
58d0: 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
58e0: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  NULL */.  int is
58f0: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
5900: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
5910: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
5920: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
5930: 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20   int distinct;  
5940: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
5950: 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
5960: 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a  distinct set */.
5970: 20 20 69 6e 74 20 62 61 73 65 3b 20 20 20 20 20    int base;     
5980: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
5990: 74 20 63 75 72 73 6f 72 20 61 76 61 69 6c 61 62  t cursor availab
59a0: 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 0a 20  le for use */.. 
59b0: 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c   if( sqlite_mall
59c0: 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70 50 61  oc_failed || pPa
59d0: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d 3d  rse->nErr || p==
59e0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20  0 ) return 1;.. 
59f0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
5a00: 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f  are a sequence o
5a10: 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68  f queries, do th
5a20: 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66  e earlier ones f
5a30: 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  irst..  */.  if(
5a40: 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
5a50: 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
5a60: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
5a70: 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20  eDest, iParm);. 
5a80: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f   }..  /* Make lo
5a90: 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68  cal copies of th
5aa0: 65 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72  e parameters for
5ab0: 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a   this query..  *
5ac0: 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  /.  pTabList = p
5ad0: 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65  ->pSrc;.  pWhere
5ae0: 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
5af0: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
5b00: 72 64 65 72 42 79 3b 0a 20 20 70 47 72 6f 75 70  rderBy;.  pGroup
5b10: 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
5b20: 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
5b30: 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69  >pHaving;.  isDi
5b40: 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69  stinct = p->isDi
5b50: 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 53 61  stinct;..  /* Sa
5b60: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ve the current v
5b70: 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e  alue of pParse->
5b80: 6e 54 61 62 2e 20 20 52 65 73 74 6f 72 65 20 74  nTab.  Restore t
5b90: 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65  his value before
5ba0: 0a 20 20 2a 2a 20 77 65 20 65 78 69 74 2e 0a 20  .  ** we exit.. 
5bb0: 20 2a 2f 0a 20 20 62 61 73 65 20 3d 20 70 50 61   */.  base = pPa
5bc0: 72 73 65 2d 3e 6e 54 61 62 3b 0a 0a 20 20 2f 2a  rse->nTab;..  /*
5bd0: 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76   .  ** Do not ev
5be0: 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65  en attempt to ge
5bf0: 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20  nerate any code 
5c00: 69 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61  if we have alrea
5c10: 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72  dy seen.  ** err
5c20: 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69 73 20  ors before this 
5c30: 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a  routine starts..
5c40: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
5c50: 65 2d 3e 6e 45 72 72 3e 30 20 29 20 72 65 74 75  e->nErr>0 ) retu
5c60: 72 6e 20 31 3b 0a 20 20 73 71 6c 69 74 65 50 61  rn 1;.  sqlitePa
5c70: 72 73 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61  rseInfoReset(pPa
5c80: 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  rse);..  /* Look
5c90: 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20   up every table 
5ca0: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69 73  in the table lis
5cb0: 74 20 61 6e 64 20 63 72 65 61 74 65 20 61 6e 20  t and create an 
5cc0: 61 70 70 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a  appropriate.  **
5cd0: 20 63 6f 6c 75 6d 6e 6c 69 73 74 20 69 6e 20 70   columnlist in p
5ce0: 45 4c 69 73 74 20 69 66 20 74 68 65 72 65 20 69  EList if there i
5cf0: 73 6e 27 74 20 6f 6e 65 20 61 6c 72 65 61 64 79  sn't one already
5d00: 2e 20 20 28 54 68 65 20 70 61 72 73 65 72 20 6c  .  (The parser l
5d10: 65 61 76 65 73 0a 20 20 2a 2a 20 61 20 4e 55 4c  eaves.  ** a NUL
5d20: 4c 20 69 6e 20 74 68 65 20 70 2d 3e 70 45 4c 69  L in the p->pELi
5d30: 73 74 20 69 66 20 74 68 65 20 53 51 4c 20 73 61  st if the SQL sa
5d40: 69 64 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  id "SELECT * FRO
5d50: 4d 20 2e 2e 2e 22 29 0a 20 20 2a 2f 0a 20 20 69  M ...").  */.  i
5d60: 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  f( fillInColumnL
5d70: 69 73 74 28 70 50 61 72 73 65 2c 20 70 29 20 29  ist(pParse, p) )
5d80: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
5d90: 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70    }.  pEList = p
5da0: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
5db0: 70 45 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75  pEList==0 ) retu
5dc0: 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  rn 1;..  /* Allo
5dd0: 63 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  cate a temporary
5de0: 20 74 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f   table to use fo
5df0: 72 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 73  r the DISTINCT s
5e00: 65 74 2c 20 69 66 0a 20 20 2a 2a 20 6e 65 63 65  et, if.  ** nece
5e10: 73 73 61 72 79 2e 20 20 54 68 69 73 20 6d 75 73  ssary.  This mus
5e20: 74 20 62 65 20 64 6f 6e 65 20 65 61 72 6c 79 20  t be done early 
5e30: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  to allocate the 
5e40: 63 75 72 73 6f 72 20 62 65 66 6f 72 65 0a 20 20  cursor before.  
5e50: 2a 2a 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f 20  ** any calls to 
5e60: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
5e70: 65 49 64 73 28 29 2e 0a 20 20 2a 2f 0a 20 20 69  eIds()..  */.  i
5e80: 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b  f( isDistinct ){
5e90: 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
5ea0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
5eb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73    }else{.    dis
5ec0: 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a  tinct = -1;.  }.
5ed0: 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
5ee0: 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
5ef0: 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
5f00: 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
5f10: 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
5f20: 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69  output..  */.  i
5f30: 66 28 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d  f( (eDest==SRT_M
5f40: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
5f50: 5f 53 65 74 29 20 26 26 20 70 45 4c 69 73 74 2d  _Set) && pEList-
5f60: 3e 6e 45 78 70 72 3e 31 20 29 7b 0a 20 20 20 20  >nExpr>1 ){.    
5f70: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
5f80: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
5f90: 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  , "only a single
5fa0: 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20   result allowed 
5fb0: 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20  for ".       "a 
5fc0: 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70  SELECT that is p
5fd0: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
5fe0: 73 69 6f 6e 22 2c 20 30 29 3b 0a 20 20 20 20 70  sion", 0);.    p
5ff0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
6000: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
6010: 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ..  /* ORDER BY 
6020: 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 77 65  is ignored if we
6030: 20 61 72 65 20 6e 6f 74 20 73 65 6e 64 69 6e 67   are not sending
6040: 20 74 68 65 20 72 65 73 75 6c 74 20 74 6f 20 61   the result to a
6050: 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2f 0a   callback..  */.
6060: 20 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54    if( eDest!=SRT
6070: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
6080: 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
6090: 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
60a0: 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 22 65  e cursors for "e
60b0: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
60c0: 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 73 2e  ..)" constructs.
60d0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
60e0: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
60f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
6100: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 6e 53  teExprResolveInS
6110: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
6120: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
6130: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68  );.  }.  if( pWh
6140: 65 72 65 20 29 20 73 71 6c 69 74 65 45 78 70 72  ere ) sqliteExpr
6150: 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28  ResolveInSelect(
6160: 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 29 3b  pParse, pWhere);
6170: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
6180: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
6190: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
61a0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  r; i++){.      s
61b0: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
61c0: 49 6e 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  InSelect(pParse,
61d0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
61e0: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
61f0: 7d 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79  }.  if( pGroupBy
6200: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
6210: 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
6220: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
6230: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
6240: 65 49 6e 53 65 6c 65 63 74 28 70 50 61 72 73 65  eInSelect(pParse
6250: 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  , pGroupBy->a[i]
6260: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
6270: 20 7d 0a 20 20 69 66 28 20 70 48 61 76 69 6e 67   }.  if( pHaving
6280: 20 29 20 73 71 6c 69 74 65 45 78 70 72 52 65 73   ) sqliteExprRes
6290: 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28 70 50 61  olveInSelect(pPa
62a0: 72 73 65 2c 20 70 48 61 76 69 6e 67 29 3b 0a 0a  rse, pHaving);..
62b0: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
62c0: 6e 74 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61  nt, we should ha
62d0: 76 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6c  ve allocated all
62e0: 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
62f0: 74 20 77 65 0a 20 20 2a 2a 20 6e 65 65 64 20 74  t we.  ** need t
6300: 6f 20 68 61 6e 64 6c 65 20 73 75 62 71 75 65 72  o handle subquer
6310: 79 73 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79  ys and temporary
6320: 20 74 61 62 6c 65 73 2e 20 20 46 72 6f 6d 20 68   tables.  From h
6330: 65 72 65 20 6f 6e 20 77 65 0a 20 20 2a 2a 20 61  ere on we.  ** a
6340: 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
6350: 6b 65 65 70 69 6e 67 20 74 68 65 20 73 61 6d 65  keeping the same
6360: 20 76 61 6c 75 65 20 66 6f 72 20 70 50 61 72 73   value for pPars
6370: 65 2d 3e 6e 54 61 62 2e 0a 20 20 2a 2a 0a 20 20  e->nTab..  **.  
6380: 2a 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 63  ** Resolve the c
6390: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20  olumn names and 
63a0: 64 6f 20 61 20 73 65 6d 61 6e 74 69 63 73 20 63  do a semantics c
63b0: 68 65 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 65 20  heck on all the 
63c0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a  expressions..  *
63d0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
63e0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
63f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
6400: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  teExprResolveIds
6410: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
6420: 74 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t, pEList->a[i].
6430: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
6440: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
6450: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
6460: 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
6470: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
6480: 70 72 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29  pr, 1, &isAgg) )
6490: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
64a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
64b0: 28 20 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ( pWhere ){.    
64c0: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65  if( sqliteExprRe
64d0: 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
64e0: 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
64f0: 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  e) ){.      retu
6500: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
6510: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68  if( sqliteExprCh
6520: 65 63 6b 28 70 50 61 72 73 65 2c 20 70 57 68 65  eck(pParse, pWhe
6530: 72 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  re, 0, 0) ){.   
6540: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
6550: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 72   }.  }.  if( pOr
6560: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 66 6f 72  derBy ){.    for
6570: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
6580: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
6590: 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
65a0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
65b0: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
65c0: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
65d0: 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61  eIds(pParse, pTa
65e0: 62 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20  bList, pE) ){.  
65f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
6600: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6610: 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63  ( sqliteExprChec
6620: 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73  k(pParse, pE, is
6630: 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  Agg, 0) ){.     
6640: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
6650: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6660: 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
6670: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6680: 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
6690: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
66a0: 72 20 2a 70 45 20 3d 20 70 47 72 6f 75 70 42 79  r *pE = pGroupBy
66b0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
66c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
66d0: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
66e0: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
66f0: 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  E) ){.        re
6700: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
6710: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6720: 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
6730: 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20  , pE, isAgg, 0) 
6740: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
6750: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
6760: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 48 61   }.  }.  if( pHa
6770: 76 69 6e 67 20 29 7b 0a 20 20 20 20 69 66 28 20  ving ){.    if( 
6780: 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
6790: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
67a0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
67b0: 72 72 4d 73 67 2c 20 22 61 20 47 52 4f 55 50 20  rrMsg, "a GROUP 
67c0: 42 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  BY clause is req
67d0: 75 69 72 65 64 20 22 0a 20 20 20 20 20 20 20 20  uired ".        
67e0: 20 22 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22   "before HAVING"
67f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
6800: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
6810: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
6820: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
6830: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
6840: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
6850: 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20   pHaving) ){.   
6860: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
6870: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
6880: 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
6890: 65 2c 20 70 48 61 76 69 6e 67 2c 20 69 73 41 67  e, pHaving, isAg
68a0: 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72  g, 0) ){.      r
68b0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
68c0: 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e 20 61   }..  /* Do an a
68d0: 6e 61 6c 79 73 69 73 20 6f 66 20 61 67 67 72 65  nalysis of aggre
68e0: 67 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  gate expressions
68f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41  ..  */.  if( isA
6900: 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  gg ){.    assert
6910: 28 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 3d 3d  ( pParse->nAgg==
6920: 30 20 26 26 20 70 50 61 72 73 65 2d 3e 69 41 67  0 && pParse->iAg
6930: 67 43 6f 75 6e 74 3c 30 20 29 3b 0a 20 20 20 20  gCount<0 );.    
6940: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
6950: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
6960: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6970: 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
6980: 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 45  gates(pParse, pE
6990: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
69a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
69b0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
69c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72     }.    if( pGr
69d0: 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 66  oupBy ){.      f
69e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70  or(i=0; i<pGroup
69f0: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
6a00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
6a10: 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  iteExprAnalyzeAg
6a20: 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
6a30: 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e   pGroupBy->a[i].
6a40: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
6a50: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
6a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6a70: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48      }.    if( pH
6a80: 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65 45  aving && sqliteE
6a90: 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
6aa0: 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 48 61  ates(pParse, pHa
6ab0: 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 72  ving) ){.      r
6ac0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
6ad0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
6ae0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
6af0: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
6b00: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
6b10: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
6b20: 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
6b30: 65 73 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  es(pParse, pOrde
6b40: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
6b50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
6b60: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
6b70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
6b80: 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
6b90: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
6ba0: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
6bb0: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
6bc0: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
6bd0: 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20  return 1;..  /* 
6be0: 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 0a  Set the limiter.
6bf0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c    */.  if( p->nL
6c00: 69 6d 69 74 3c 3d 30 20 29 7b 0a 20 20 20 20 70  imit<=0 ){.    p
6c10: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->nOffset = 0;. 
6c20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
6c30: 70 2d 3e 6e 4f 66 66 73 65 74 3c 30 20 29 20 70  p->nOffset<0 ) p
6c40: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->nOffset = 0;. 
6c50: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6c60: 4f 70 28 76 2c 20 4f 50 5f 4c 69 6d 69 74 2c 20  Op(v, OP_Limit, 
6c70: 70 2d 3e 6e 4c 69 6d 69 74 2c 20 70 2d 3e 6e 4f  p->nLimit, p->nO
6c80: 66 66 73 65 74 29 3b 0a 20 20 7d 0a 20 20 20 20  ffset);.  }.    
6c90: 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
6ca0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20  column names if 
6cb0: 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
6cc0: 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   in the callback
6cd0: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65  .  This.  ** ste
6ce0: 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  p is skipped if 
6cf0: 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
6d00: 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ing to a table o
6d10: 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  r a memory cell.
6d20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
6d30: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
6d40: 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
6d50: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
6d60: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
6d70: 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
6d80: 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
6d90: 61 74 6f 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ator.  */.  if( 
6da0: 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 71 6c  isAgg ){.    sql
6db0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6dc0: 4f 50 5f 41 67 67 52 65 73 65 74 2c 20 30 2c 20  OP_AggReset, 0, 
6dd0: 70 50 61 72 73 65 2d 3e 6e 41 67 67 29 3b 0a 20  pParse->nAgg);. 
6de0: 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d     if( pGroupBy=
6df0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
6e00: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6e10: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
6e20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6e30: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
6e40: 20 22 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b   "", P3_STATIC);
6e50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6e60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
6e70: 46 6f 63 75 73 2c 20 30 2c 20 30 29 3b 0a 20 20  Focus, 0, 0);.  
6e80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
6e90: 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
6ea0: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
6eb0: 2a 70 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28  *pE;.        if(
6ec0: 20 21 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69   !pParse->aAgg[i
6ed0: 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e  ].isAgg ) contin
6ee0: 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d  ue;.        pE =
6ef0: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
6f00: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
6f10: 61 73 73 65 72 74 28 20 70 45 3d 3d 30 20 7c 7c  assert( pE==0 ||
6f20: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f   pE->op==TK_AGG_
6f30: 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
6f40: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 3d 3d      assert( pE==
6f50: 30 20 7c 7c 20 28 70 45 2d 3e 70 4c 69 73 74 21  0 || (pE->pList!
6f60: 3d 30 20 26 26 20 70 45 2d 3e 70 4c 69 73 74 2d  =0 && pE->pList-
6f70: 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 20 20  >nExpr==1) );.  
6f80: 20 20 20 20 20 20 69 66 28 20 70 45 3d 3d 30 20        if( pE==0 
6f90: 7c 7c 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  || pE->iColumn==
6fa0: 46 4e 5f 53 75 6d 20 29 7b 0a 20 20 20 20 20 20  FN_Sum ){.      
6fb0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6fc0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
6fd0: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
6fe0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6ff0: 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 53 65 74  dOp(v, OP_AggSet
7000: 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  , 0, i);.       
7010: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
7020: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7030: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
7040: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
7050: 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c  mory cell to NUL
7060: 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  L.  */.  if( eDe
7070: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20  st==SRT_Mem ){. 
7080: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7090: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
70a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
70b0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
70c0: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
70d0: 6d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  m, 0);.  }..  /*
70e0: 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
70f0: 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20  ase scan.  */.  
7100: 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29  if( isDistinct )
7110: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
7120: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
7130: 54 65 6d 70 2c 20 64 69 73 74 69 6e 63 74 2c 20  Temp, distinct, 
7140: 30 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  0);.  }.  pWInfo
7150: 20 3d 20 73 71 6c 69 74 65 57 68 65 72 65 42 65   = sqliteWhereBe
7160: 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
7170: 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30 29  List, pWhere, 0)
7180: 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d  ;.  if( pWInfo==
7190: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20  0 ) return 1;.. 
71a0: 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
71b0: 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 20  dard inner loop 
71c0: 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 64 65  if we are not de
71d0: 61 6c 69 6e 67 20 77 69 74 68 0a 20 20 2a 2a 20  aling with.  ** 
71e0: 61 67 67 72 65 67 61 74 65 73 0a 20 20 2a 2f 0a  aggregates.  */.
71f0: 20 20 69 66 28 20 21 69 73 41 67 67 20 29 7b 0a    if( !isAgg ){.
7200: 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e      if( selectIn
7210: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
7220: 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
7230: 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74  rderBy, distinct
7240: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 0a  , eDest, iParm,.
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7260: 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e      pWInfo->iCon
7270: 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  tinue, pWInfo->i
7280: 42 72 65 61 6b 29 20 29 7b 0a 20 20 20 20 20 20  Break) ){.      
7290: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
72a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
72b0: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
72c0: 68 20 61 67 67 72 65 67 61 74 65 73 2c 20 74 68  h aggregates, th
72d0: 65 6e 20 74 6f 20 74 68 65 20 73 70 65 63 69 61  en to the specia
72e0: 6c 20 61 67 67 72 65 67 61 74 65 0a 20 20 2a 2a  l aggregate.  **
72f0: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 0a 20   processing.  . 
7300: 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20   */.  else{.    
7310: 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
7320: 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 31 3b 0a        int lbl1;.
7330: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
7340: 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
7350: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
7360: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
7370: 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
7380: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
7390: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
73a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
73b0: 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 47 72 6f 75  P_MakeKey, pGrou
73c0: 70 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a  pBy->nExpr, 0);.
73d0: 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c        lbl1 = sql
73e0: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
73f0: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
7400: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7410: 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 6c 62  _AggFocus, 0, lb
7420: 6c 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  l1);.      for(i
7430: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  =0; i<pParse->nA
7440: 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gg; i++){.      
7450: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 41    if( pParse->aA
7460: 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f  gg[i].isAgg ) co
7470: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
7480: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
7490: 50 61 72 73 65 2c 20 70 50 61 72 73 65 2d 3e 61  Parse, pParse->a
74a0: 41 67 67 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  Agg[i].pExpr);. 
74b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
74c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
74d0: 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20  Set, 0, i);.    
74e0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
74f0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
7500: 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 7d  (v, lbl1);.    }
7510: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7520: 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b  pParse->nAgg; i+
7530: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
7540: 70 45 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70  pE;.      int op
7550: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
7560: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41  rse->aAgg[i].isA
7570: 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  gg ) continue;. 
7580: 20 20 20 20 20 70 45 20 3d 20 70 50 61 72 73 65       pE = pParse
7590: 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 3b  ->aAgg[i].pExpr;
75a0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 3d 3d 30  .      if( pE==0
75b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
75c0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
75d0: 50 5f 41 67 67 49 6e 63 72 2c 20 31 2c 20 69 29  P_AggIncr, 1, i)
75e0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
75f0: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
7600: 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
7610: 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
7620: 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  N );.      asser
7630: 74 28 20 70 45 2d 3e 70 4c 69 73 74 21 3d 30 20  t( pE->pList!=0 
7640: 26 26 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45  && pE->pList->nE
7650: 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  xpr==1 );.      
7660: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
7670: 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74  Parse, pE->pList
7680: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
7690: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
76a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65  ddOp(v, OP_AggGe
76b0: 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20  t, 0, i);.      
76c0: 73 77 69 74 63 68 28 20 70 45 2d 3e 69 43 6f 6c  switch( pE->iCol
76d0: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  umn ){.        c
76e0: 61 73 65 20 46 4e 5f 4d 69 6e 3a 20 20 6f 70 20  ase FN_Min:  op 
76f0: 3d 20 4f 50 5f 4d 69 6e 3b 20 20 20 62 72 65 61  = OP_Min;   brea
7700: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
7710: 46 4e 5f 4d 61 78 3a 20 20 6f 70 20 3d 20 4f 50  FN_Max:  op = OP
7720: 5f 4d 61 78 3b 20 20 20 62 72 65 61 6b 3b 0a 20  _Max;   break;. 
7730: 20 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 41         case FN_A
7740: 76 67 3a 20 20 6f 70 20 3d 20 4f 50 5f 41 64 64  vg:  op = OP_Add
7750: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
7760: 20 20 20 63 61 73 65 20 46 4e 5f 53 75 6d 3a 20     case FN_Sum: 
7770: 20 6f 70 20 3d 20 4f 50 5f 41 64 64 3b 20 20 20   op = OP_Add;   
7780: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
7790: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
77a0: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30  ddOp(v, op, 0, 0
77b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
77c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
77d0: 67 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20 20  ggSet, 0, i);.  
77e0: 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 45    }.  }...  /* E
77f0: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
7800: 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a  scan loop..  */.
7810: 20 20 73 71 6c 69 74 65 57 68 65 72 65 45 6e 64    sqliteWhereEnd
7820: 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20  (pWInfo);..  /* 
7830: 49 66 20 77 65 20 61 72 65 20 70 72 6f 63 65 73  If we are proces
7840: 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 73 2c  sing aggregates,
7850: 20 77 65 20 6e 65 65 64 20 74 6f 20 73 65 74 20   we need to set 
7860: 75 70 20 61 20 73 65 63 6f 6e 64 20 6c 6f 6f 70  up a second loop
7870: 0a 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f  .  ** over all o
7880: 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
7890: 76 61 6c 75 65 73 20 61 6e 64 20 70 72 6f 63 65  values and proce
78a0: 73 73 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20  ss them..  */.  
78b0: 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
78c0: 20 69 6e 74 20 65 6e 64 61 67 67 20 3d 20 73 71   int endagg = sq
78d0: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
78e0: 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 73 74  l(v);.    int st
78f0: 61 72 74 61 67 67 3b 0a 20 20 20 20 73 74 61 72  artagg;.    star
7900: 74 61 67 67 20 3d 20 73 71 6c 69 74 65 56 64 62  tagg = sqliteVdb
7910: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
7920: 4e 65 78 74 2c 20 30 2c 20 65 6e 64 61 67 67 29  Next, 0, endagg)
7930: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73  ;.    pParse->us
7940: 65 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 69 66  eAgg = 1;.    if
7950: 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
7960: 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 46     sqliteExprIfF
7970: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
7980: 76 69 6e 67 2c 20 73 74 61 72 74 61 67 67 29 3b  ving, startagg);
7990: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
79a0: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
79b0: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 30  Parse, pEList, 0
79c0: 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64  , 0, pOrderBy, d
79d0: 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 20  istinct, eDest, 
79e0: 69 50 61 72 6d 2c 0a 20 20 20 20 20 20 20 20 20  iParm,.         
79f0: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74             start
7a00: 61 67 67 2c 20 65 6e 64 61 67 67 29 20 29 7b 0a  agg, endagg) ){.
7a10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
7a20: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7a30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7a40: 47 6f 74 6f 2c 20 30 2c 20 73 74 61 72 74 61 67  Goto, 0, startag
7a50: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  g);.    sqliteVd
7a60: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
7a70: 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 73  , endagg);.    s
7a80: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7a90: 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29  , OP_Noop, 0, 0)
7aa0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73  ;.    pParse->us
7ab0: 65 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  eAgg = 0;.  }.. 
7ac0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
7ad0: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
7ae0: 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64  se, then we need
7af0: 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73   to sort the res
7b00: 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65  ults.  ** and se
7b10: 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63  nd them to the c
7b20: 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f  allback one by o
7b30: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ne..  */.  if( p
7b40: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67  OrderBy ){.    g
7b50: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
7b60: 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  v, pEList->nExpr
7b70: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  );.  }.  pParse-
7b80: 3e 6e 54 61 62 20 3d 20 62 61 73 65 3b 0a 0a 0a  >nTab = base;...
7b90: 20 20 2f 2a 20 49 73 73 75 65 20 61 20 6e 75 6c    /* Issue a nul
7ba0: 6c 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  l callback if th
7bb0: 61 74 20 69 73 20 77 68 61 74 20 74 68 65 20 75  at is what the u
7bc0: 73 65 72 20 77 61 6e 74 73 2e 0a 20 20 2a 2f 0a  ser wants..  */.
7bd0: 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64    if( (pParse->d
7be0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
7bf0: 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 29 21  E_NullCallback)!
7c00: 3d 30 20 26 26 20 65 44 65 73 74 3d 3d 53 52 54  =0 && eDest==SRT
7c10: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
7c20: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7c30: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c 6c 62  (v, OP_NullCallb
7c40: 61 63 6b 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ack, pEList->nEx
7c50: 70 72 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72  pr, 0);.  }..  r
7c60: 65 74 75 72 6e 20 30 3b 0a 7d 0a                 eturn 0;.}.