/ Hex Artifact Content
Login

Artifact 76a8fafb29935865ddbef263ee90f1398d950d8b:


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 35 30 20  select.c,v 1.50 
0200: 32 30 30 31 2f 31 32 2f 31 36 20 32 30 3a 30 35  2001/12/16 20:05
0210: 3a 30 36 20 64 72 68 20 45 78 70 20 24 0a 2a 2f  :06 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 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  m, 1);.    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 2c 20 6b 3b 0a 20 20 49 64 4c 69 73 74 20 2a  j, k;.  IdList *
2950: 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
2960: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20  List *pEList;.. 
2970: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e   if( p==0 || p->
2980: 70 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  pSrc==0 ) return
2990: 20 31 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d   1;.  pTabList =
29a0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
29b0: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
29c0: 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
29d0: 65 72 79 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ery table in the
29e0: 20 74 61 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a   table list..  *
29f0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
2a00: 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  TabList->nId; i+
2a10: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62  +){.    if( pTab
2a20: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20  List->a[i].pTab 
2a30: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
2a40: 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e   routine has run
2a50: 20 62 65 66 6f 72 65 21 20 20 4e 6f 20 6e 65 65   before!  No nee
2a60: 64 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 2a 2f  d to continue */
2a70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
2a80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2a90: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  TabList->a[i].zN
2aa0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
2ab0: 2f 2a 20 4e 6f 20 74 61 62 6c 65 20 6e 61 6d 65  /* No table name
2ac0: 20 69 73 20 67 69 76 65 6e 2e 20 20 49 6e 73 74   is given.  Inst
2ad0: 65 61 64 2c 20 74 68 65 72 65 20 69 73 20 61 20  ead, there is a 
2ae0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 20 73 74 61  (SELECT ...) sta
2af0: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  tement.      ** 
2b00: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 77  the results of w
2b10: 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20 75  hich should be u
2b20: 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
2b30: 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 0a  the table.  The.
2b40: 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74 68 69        ** was thi
2b50: 73 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  s is implemented
2b60: 20 69 73 20 74 68 61 74 20 74 68 65 20 28 53 45   is that the (SE
2b70: 4c 45 43 54 20 2e 2e 2e 29 20 77 72 69 74 65 73  LECT ...) writes
2b80: 20 69 74 73 20 72 65 73 75 6c 74 73 0a 20 20 20   its results.   
2b90: 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 74 65 6d     ** into a tem
2ba0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 77 68 69  porary table whi
2bb0: 63 68 20 69 73 20 74 68 65 6e 20 73 63 61 6e 6e  ch is then scann
2bc0: 65 64 20 6c 69 6b 65 20 61 6e 79 20 6f 74 68 65  ed like any othe
2bd0: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a  r table..      *
2be0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  /.      sqliteSe
2bf0: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
2c00: 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20 20 20  >zErrMsg, .     
2c10: 20 20 20 20 20 22 28 53 45 4c 45 43 54 2e 2e 2e       "(SELECT...
2c20: 29 20 69 6e 20 61 20 46 52 4f 4d 20 63 6c 61 75  ) in a FROM clau
2c30: 73 65 20 69 73 20 6e 6f 74 20 79 65 74 20 69 6d  se is not yet im
2c40: 70 6c 65 6d 65 6e 74 65 64 2e 22 2c 20 30 29 3b  plemented.", 0);
2c50: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
2c60: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
2c70: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2c80: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
2c90: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e  pTab = sqliteFin
2ca0: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  dTable(pParse->d
2cb0: 62 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  b, pTabList->a[i
2cc0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
2cd0: 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  ( pTabList->a[i]
2ce0: 2e 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  .pTab==0 ){.    
2cf0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
2d00: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
2d10: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  sg, "no such tab
2d20: 6c 65 3a 20 22 2c 20 0a 20 20 20 20 20 20 20 20  le: ", .        
2d30: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
2d40: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
2d50: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
2d60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2d70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2d80: 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
2d90: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
2da0: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
2db0: 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
2dc0: 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
2dd0: 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
2de0: 73 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  s.  The parser i
2df0: 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61  nserted a specia
2e00: 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  l expression.  *
2e10: 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c  * with the TK_AL
2e20: 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65  L operator for e
2e30: 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20  ach "*" that it 
2e40: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c  found in the col
2e50: 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54  umn list..  ** T
2e60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
2e70: 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f  e just has to lo
2e80: 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20  cate the TK_ALL 
2e90: 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20  expressions and 
2ea0: 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68  expand.  ** each
2eb0: 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74   one to the list
2ec0: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
2ed0: 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20  in all tables.. 
2ee0: 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
2ef0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
2f00: 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 45  k++){.    if( pE
2f10: 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72  List->a[k].pExpr
2f20: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
2f30: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
2f40: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
2f50: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
2f60: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d  prList_item *a =
2f70: 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
2f80: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d  ExprList *pNew =
2f90: 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b   0;.    for(k=0;
2fa0: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
2fb0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; k++){.      if
2fc0: 28 20 61 5b 6b 5d 2e 70 45 78 70 72 2d 3e 6f 70  ( a[k].pExpr->op
2fd0: 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  !=TK_ALL ){.    
2fe0: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
2ff0: 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  eExprListAppend(
3000: 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
3010: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  , 0);.        pN
3020: 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
3030: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
3040: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
3050: 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
3060: 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e  .        a[k].zN
3070: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ame = 0;.      }
3080: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
3090: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
30a0: 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
30b0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
30c0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
30d0: 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[i].pTab;.     
30e0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
30f0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
3100: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
3110: 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69  pr *pExpr = sqli
3120: 74 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 30  teExpr(TK_DOT, 0
3130: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
3140: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d       if( pExpr==
3150: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
3160: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c         pExpr->pL
3170: 65 66 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  eft = sqliteExpr
3180: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29  (TK_ID, 0, 0, 0)
3190: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
31a0: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
31b0: 30 20 29 7b 20 73 71 6c 69 74 65 45 78 70 72 44  0 ){ sqliteExprD
31c0: 65 6c 65 74 65 28 70 45 78 70 72 29 3b 20 62 72  elete(pExpr); br
31d0: 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 20  eak; }.         
31e0: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
31f0: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 20 26 26 20  >a[i].zAlias && 
3200: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
3210: 41 6c 69 61 73 5b 30 5d 20 29 7b 0a 20 20 20 20  Alias[0] ){.    
3220: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
3230: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20  >pLeft->token.z 
3240: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  = pTabList->a[i]
3250: 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  .zAlias;.       
3260: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c         pExpr->pL
3270: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73  eft->token.n = s
3280: 74 72 6c 65 6e 28 70 54 61 62 4c 69 73 74 2d 3e  trlen(pTabList->
3290: 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20  a[i].zAlias);.  
32a0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
32b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
32c0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b  Expr->pLeft->tok
32d0: 65 6e 2e 7a 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  en.z = pTab->zNa
32e0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
32f0: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e    pExpr->pLeft->
3300: 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e  token.n = strlen
3310: 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pTab->zName);. 
3320: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
3330: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
3340: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 45  pRight = sqliteE
3350: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
3360: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
3370: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67   if( pExpr->pRig
3380: 68 74 3d 3d 30 20 29 7b 20 73 71 6c 69 74 65 45  ht==0 ){ sqliteE
3390: 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 29  xprDelete(pExpr)
33a0: 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
33b0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52         pExpr->pR
33c0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  ight->token.z = 
33d0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
33e0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
33f0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e   pExpr->pRight->
3400: 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e  token.n = strlen
3410: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  (pTab->aCol[j].z
3420: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
3430: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a     pExpr->span.z
3440: 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20   = "";.         
3450: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e     pExpr->span.n
3460: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
3470: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 45    pNew = sqliteE
3480: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e  xprListAppend(pN
3490: 65 77 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  ew, pExpr, 0);. 
34a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
34b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
34c0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70   }.    sqliteExp
34d0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69  rListDelete(pELi
34e0: 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69  st);.    p->pELi
34f0: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
3500: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
3510: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3520: 20 61 73 73 6f 63 69 61 74 65 73 20 65 6e 74 72   associates entr
3530: 69 65 73 20 69 6e 20 61 6e 20 4f 52 44 45 52 20  ies in an ORDER 
3540: 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  BY expression li
3550: 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d  st with.** colum
3560: 6e 73 20 69 6e 20 61 20 72 65 73 75 6c 74 2e 20  ns in a result. 
3570: 20 46 6f 72 20 65 61 63 68 20 4f 52 44 45 52 20   For each ORDER 
3580: 42 59 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  BY expression, t
3590: 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20  he opcode of.** 
35a0: 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f  the top-level no
35b0: 64 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  de is changed to
35c0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74   TK_COLUMN and t
35d0: 68 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65  he iColumn value
35e0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c   of.** the top-l
35f0: 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c  evel node is fil
3600: 6c 65 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75  led in with colu
3610: 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  mn number and th
3620: 65 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75  e iTable.** valu
3630: 65 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76  e of the top-lev
3640: 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65  el node is fille
3650: 64 20 77 69 74 68 20 69 54 61 62 6c 65 20 70 61  d with iTable pa
3660: 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  rameter..**.** I
3670: 66 20 74 68 65 72 65 20 61 72 65 20 70 72 69 6f  f there are prio
3680: 72 20 53 45 4c 45 43 54 20 63 6c 61 75 73 65 73  r SELECT clauses
3690: 2c 20 74 68 65 79 20 61 72 65 20 70 72 6f 63 65  , they are proce
36a0: 73 73 65 64 20 66 69 72 73 74 2e 20 20 41 20 6d  ssed first.  A m
36b0: 61 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61  atch.** in an ea
36c0: 72 6c 69 65 72 20 53 45 4c 45 43 54 20 74 61 6b  rlier SELECT tak
36d0: 65 73 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76  es precedence ov
36e0: 65 72 20 61 20 6c 61 74 65 72 20 53 45 4c 45 43  er a later SELEC
36f0: 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74  T..**.** Any ent
3700: 72 79 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ry that does not
3710: 20 6d 61 74 63 68 20 69 73 20 66 6c 61 67 67 65   match is flagge
3720: 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2e 20 20  d as an error.  
3730: 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
3740: 20 65 72 72 6f 72 73 20 69 73 20 72 65 74 75 72   errors is retur
3750: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
3760: 6e 74 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  nt matchOrderbyT
3770: 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65  oColumn(.  Parse
3780: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3790: 20 20 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f     /* A place to
37a0: 20 6c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73   leave error mes
37b0: 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63  sages */.  Selec
37c0: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
37d0: 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72     /* Match to r
37e0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  esult columns of
37f0: 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a   this SELECT */.
3800: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
3810: 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65  erBy,     /* The
3820: 20 4f 52 44 45 52 20 42 59 20 76 61 6c 75 65 73   ORDER BY values
3830: 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73   to match agains
3840: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
3850: 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
3860: 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74         /* Insert
3870: 20 74 68 69 73 20 74 68 69 73 20 76 61 6c 75 65   this this value
3880: 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20   in iTable */.  
3890: 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65  int mustComplete
38a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52          /* If TR
38b0: 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73  UE all ORDER BYs
38c0: 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29   must match */.)
38d0: 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  {.  int nErr = 0
38e0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
38f0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
3900: 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  ;..  if( pSelect
3910: 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d  ==0 || pOrderBy=
3920: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
3930: 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74   if( mustComplet
3940: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
3950: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
3960: 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65  xpr; i++){ pOrde
3970: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
3980: 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20   0; }.  }.  if( 
3990: 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74  fillInColumnList
39a0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
39b0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
39c0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65  1;.  }.  if( pSe
39d0: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  lect->pPrior ){.
39e0: 20 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64      if( matchOrd
39f0: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61  erbyToColumn(pPa
3a00: 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50  rse, pSelect->pP
3a10: 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20  rior, pOrderBy, 
3a20: 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20  iTable, 0) ){.  
3a30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3a40: 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74    }.  }.  pEList
3a50: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
3a60: 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
3a70: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
3a80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
3a90: 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
3aa0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
3ab0: 20 69 6e 74 20 6d 61 74 63 68 20 3d 20 30 3b 0a   int match = 0;.
3ac0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
3ad0: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f  ->a[i].done ) co
3ae0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
3af0: 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e  j=0; j<pEList->n
3b00: 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
3b10: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
3b20: 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d  j].zName && (pE-
3b30: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45  >op==TK_ID || pE
3b40: 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29  ->op==TK_STRING)
3b50: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
3b60: 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   *zName = pEList
3b70: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
3b80: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4c 61 62        char *zLab
3b90: 65 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  el = sqliteStrND
3ba0: 75 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  up(pE->token.z, 
3bb0: 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pE->token.n);.  
3bc0: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75        sqliteDequ
3bd0: 6f 74 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20  ote(zLabel);.   
3be0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53       if( sqliteS
3bf0: 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c  trICmp(zName, zL
3c00: 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20  abel)==0 ){ .   
3c10: 20 20 20 20 20 20 20 6d 61 74 63 68 20 3d 20 31         match = 1
3c20: 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
3c30: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
3c40: 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d  zLabel);.      }
3c50: 0a 20 20 20 20 20 20 69 66 28 20 6d 61 74 63 68  .      if( match
3c60: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 45 78 70  ==0 && sqliteExp
3c70: 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c  rCompare(pE, pEL
3c80: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29  ist->a[j].pExpr)
3c90: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63   ){.        matc
3ca0: 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  h = 1;.      }. 
3cb0: 20 20 20 20 20 69 66 28 20 6d 61 74 63 68 20 29       if( match )
3cc0: 7b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 6f 70  {.        pE->op
3cd0: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
3ce0: 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
3cf0: 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 70  n = j;.        p
3d00: 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  E->iTable = iTab
3d10: 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  le;.        pOrd
3d20: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
3d30: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
3d40: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3d50: 7d 0a 20 20 20 20 69 66 28 20 21 6d 61 74 63 68  }.    if( !match
3d60: 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65   && mustComplete
3d70: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a   ){.      char z
3d80: 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73  Buf[30];.      s
3d90: 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 22  printf(zBuf,"%d"
3da0: 2c 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ,i+1);.      sql
3db0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
3dc0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
3dd0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75  ORDER BY term nu
3de0: 6d 62 65 72 20 22 2c 20 7a 42 75 66 2c 20 0a 20  mber ", zBuf, . 
3df0: 20 20 20 20 20 20 20 22 20 64 6f 65 73 20 6e 6f         " does no
3e00: 74 20 6d 61 74 63 68 20 61 6e 79 20 72 65 73 75  t match any resu
3e10: 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  lt column", 0);.
3e20: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
3e30: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 6e 45 72 72  rr++;.      nErr
3e40: 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ++;.      break;
3e50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3e60: 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f  urn nErr;  .}../
3e70: 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20  *.** Get a VDBE 
3e80: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
3e90: 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43  rser context.  C
3ea0: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
3eb0: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
3ec0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
3ed0: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
3ee0: 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73   and leave a mes
3ef0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
3f00: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 47  */.Vdbe *sqliteG
3f10: 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
3f20: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
3f30: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
3f40: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
3f50: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
3f60: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 56 64  pVdbe = sqliteVd
3f70: 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d  beCreate(pParse-
3f80: 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >db);.  }.  retu
3f90: 72 6e 20 76 3b 0a 7d 0a 20 20 20 20 0a 0a 2f 2a  rn v;.}.    ../*
3fa0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3fb0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
3fc0: 6f 63 65 73 73 20 61 20 71 75 65 72 79 20 74 68  ocess a query th
3fd0: 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65  at is really the
3fe0: 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74   union.** or int
3ff0: 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f  ersection of two
4000: 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
4010: 65 20 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74  e queries..*/.st
4020: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
4030: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
4040: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
4050: 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50  nt eDest, int iP
4060: 61 72 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  arm){.  int rc; 
4070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4080: 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
4090: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
40a0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
40b0: 72 3b 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65  r;     /* Anothe
40c0: 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
40d0: 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
40e0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
40f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
4100: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
4110: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
4120: 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20   base;          
4130: 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20 76 61 6c   /* Baseline val
4140: 75 65 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 6e  ue for pParse->n
4150: 54 61 62 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b  Tab */..  /* Mak
4160: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
4170: 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
4180: 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
4190: 43 54 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 0a  CTs.  Only the .
41a0: 20 20 2a 2a 20 6c 61 73 74 20 53 45 4c 45 43 54    ** last SELECT
41b0: 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
41c0: 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
41d0: 20 42 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   BY..  */.  if( 
41e0: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f  p==0 || p->pPrio
41f0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  r==0 ) return 1;
4200: 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
4210: 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 50 72  Prior;.  if( pPr
4220: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ior->pOrderBy ){
4230: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
4240: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
4250: 72 72 4d 73 67 2c 22 4f 52 44 45 52 20 42 59 20  rrMsg,"ORDER BY 
4260: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
4270: 6d 65 20 61 66 74 65 72 20 22 2c 0a 20 20 20 20  me after ",.    
4280: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
4290: 2d 3e 6f 70 29 2c 20 22 20 6e 6f 74 20 62 65 66  ->op), " not bef
42a0: 6f 72 65 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  ore", 0);.    pP
42b0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
42c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
42d0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
42e0: 77 65 20 68 61 76 65 20 61 20 76 61 6c 69 64 20  we have a valid 
42f0: 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49  query engine.  I
4300: 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20  f not, create a 
4310: 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  new one..  */.  
4320: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
4330: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
4340: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31   v==0 ) return 1
4350: 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  ;..  /* Process 
4360: 74 68 65 20 55 4e 49 4f 4e 20 6f 72 20 49 4e 54  the UNION or INT
4370: 45 52 53 45 43 54 49 4f 4e 0a 20 20 2a 2f 0a 20  ERSECTION.  */. 
4380: 20 62 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e   base = pParse->
4390: 6e 54 61 62 3b 0a 20 20 73 77 69 74 63 68 28 20  nTab;.  switch( 
43a0: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
43b0: 65 20 54 4b 5f 41 4c 4c 3a 0a 20 20 20 20 63 61  e TK_ALL:.    ca
43c0: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20  se TK_EXCEPT:.  
43d0: 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
43e0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69   {.      int uni
43f0: 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72  onTab;    /* Cur
4400: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
4410: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
4420: 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  e holding result
4430: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   */.      int op
4440: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ;          /* On
4450: 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70  e of the SRT_ op
4460: 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c  erations to appl
4470: 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20  y to self */.   
4480: 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20     int priorOp; 
4490: 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20      /* The SRT_ 
44a0: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70  operation to app
44b0: 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65  ly to prior sele
44c0: 63 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20 70 72  cts */..      pr
44d0: 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54  iorOp = p->op==T
44e0: 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c  K_ALL ? SRT_Tabl
44f0: 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  e : SRT_Union;. 
4500: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
4510: 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
4520: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
4530: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
4540: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
4550: 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
4560: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
4570: 68 74 2e 20 20 54 68 69 73 20 61 6c 73 6f 20 6d  ht.  This also m
4580: 65 61 6e 73 20 77 65 20 61 72 65 20 6e 6f 74 20  eans we are not 
4590: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73  the right-most s
45a0: 65 6c 65 63 74 20 61 6e 64 20 73 6f 0a 20 20 20  elect and so.   
45b0: 20 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f       ** we canno
45c0: 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  t have an ORDER 
45d0: 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  BY clause.      
45e0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
45f0: 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20  onTab = iParm;. 
4600: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
4610: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
4620: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4630: 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
4640: 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
4650: 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
4660: 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
4670: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
4680: 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
4690: 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
46a0: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
46b0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
46c0: 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  +;.        if( p
46d0: 2d 3e 70 4f 72 64 65 72 42 79 20 0a 20 20 20 20  ->pOrderBy .    
46e0: 20 20 20 20 26 26 20 6d 61 74 63 68 4f 72 64 65      && matchOrde
46f0: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
4700: 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72  se, p, p->pOrder
4710: 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29  By, unionTab, 1)
4720: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
4730: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
4740: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
4750: 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20  >op!=TK_ALL ){. 
4760: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
4770: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
4780: 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61  penTemp, unionTa
4790: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  b, 0);.         
47a0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
47b0: 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61  (v, OP_KeyAsData
47c0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a  , unionTab, 1);.
47d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
47e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
47f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
4800: 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61  penTemp, unionTa
4810: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, 0);.        }
4820: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
4830: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
4840: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
4850: 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20   our left.      
4860: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
4870: 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73  liteSelect(pPars
4880: 65 2c 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72  e, pPrior, prior
4890: 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20  Op, unionTab);. 
48a0: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
48b0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
48c0: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
48d0: 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
48e0: 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
48f0: 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f      switch( p->o
4900: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61  p ){.         ca
4910: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f  se TK_EXCEPT:  o
4920: 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20  p = SRT_Except; 
4930: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4940: 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
4950: 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f     op = SRT_Unio
4960: 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  n;    break;.   
4970: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c        case TK_AL
4980: 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f  L:     op = SRT_
4990: 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b  Table;    break;
49a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
49b0: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
49c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53      rc = sqliteS
49d0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
49e0: 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a   op, unionTab);.
49f0: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
4a00: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
4a10: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
4a20: 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  rc;..      /* Co
4a30: 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69  nvert the data i
4a40: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
4a50: 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65  table into whate
4a60: 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a  ver form.      *
4a70: 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20  * it is that we 
4a80: 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a  currently need..
4a90: 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20        */      . 
4aa0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 21 3d       if( eDest!=
4ab0: 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
4ac0: 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
4ad0: 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
4ae0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
4af0: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
4b00: 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
4b10: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
4b20: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
4b30: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
4b40: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
4b50: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
4b60: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62  Cont = sqliteVdb
4b70: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
4b80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
4b90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
4ba0: 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
4bb0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
4bc0: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 56  iStart = sqliteV
4bd0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
4be0: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
4bf0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
4c00: 70 50 61 72 73 65 2c 20 30 2c 20 75 6e 69 6f 6e  pParse, 0, union
4c10: 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Tab, p->pEList->
4c20: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c40: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c      p->pOrderBy,
4c50: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
4c60: 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c80: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
4c90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
4ca0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
4cb0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
4cc0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
4cd0: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
4ce0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4cf0: 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54   OP_Next, unionT
4d00: 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  ab, iStart);.   
4d10: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
4d20: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
4d30: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
4d40: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4d50: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
4d60: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
4d70: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
4d80: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
4d90: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
4da0: 28 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  (v, p->pEList->n
4db0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
4dc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4dd0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4de0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
4df0: 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  T: {.      int t
4e00: 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20  ab1, tab2;.     
4e10: 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
4e20: 61 6b 2c 20 69 53 74 61 72 74 3b 0a 0a 20 20 20  ak, iStart;..   
4e30: 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20     /* INTERSECT 
4e40: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
4e50: 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e  m the others sin
4e60: 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20  ce it requires. 
4e70: 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70       ** two temp
4e80: 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48  orary tables.  H
4e90: 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20  ence it has its 
4ea0: 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e  own case.  Begin
4eb0: 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c  .      ** by all
4ec0: 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c  ocating the tabl
4ed0: 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e  es we will need.
4ee0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
4ef0: 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
4f00: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62  Tab++;.      tab
4f10: 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  2 = pParse->nTab
4f20: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
4f30: 3e 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74  >pOrderBy && mat
4f40: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
4f50: 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e 70 4f  n(pParse,p,p->pO
4f60: 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29 20 29  rderBy,tab1,1) )
4f70: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
4f80: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
4f90: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4fa0: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
4fb0: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
4fc0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4fd0: 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74  p(v, OP_KeyAsDat
4fe0: 61 2c 20 74 61 62 31 2c 20 31 29 3b 0a 0a 20 20  a, tab1, 1);..  
4ff0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
5000: 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c  SELECTs to our l
5010: 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  eft into tempora
5020: 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e  ry table "tab1".
5030: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5040: 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63  rc = sqliteSelec
5050: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
5060: 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
5070: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
5080: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5090: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
50a0: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
50b0: 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
50c0: 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
50d0: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
50e0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
50f0: 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 32 2c  _OpenTemp, tab2,
5100: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
5110: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5120: 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62 32  _KeyAsData, tab2
5130: 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  , 1);.      p->p
5140: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
5150: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
5160: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53 52  ct(pParse, p, SR
5170: 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 29 3b 0a  T_Union, tab2);.
5180: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
5190: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
51a0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
51b0: 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  rc;..      /* Ge
51c0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
51d0: 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
51e0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
51f0: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
5200: 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
5210: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
5220: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
5230: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
5240: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
5250: 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a   0, p->pEList);.
5260: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
5270: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
5280: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
5290: 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nt = sqliteVdbeM
52a0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
52b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
52c0: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
52d0: 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a   tab1, iBreak);.
52e0: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
52f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5300: 2c 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61  , OP_FullKey, ta
5310: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b1, 0);.      sq
5320: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5330: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
5340: 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  b2, iCont);.    
5350: 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e    rc = selectInn
5360: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 30  erLoop(pParse, 0
5370: 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73  , tab1, p->pELis
5380: 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  t->nExpr,.      
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72         p->pOrder
53b0: 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69  By, -1, eDest, i
53c0: 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20  Parm, .         
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53e0: 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61      iCont, iBrea
53f0: 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
5400: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
5410: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
5420: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
5430: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
5440: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5450: 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
5460: 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
5470: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
5480: 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
5490: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
54a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
54b0: 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
54c0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
54d0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  p(v, OP_Close, t
54e0: 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ab1, 0);.      i
54f0: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
5500: 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61  {.        genera
5510: 74 65 53 6f 72 74 54 61 69 6c 28 76 2c 20 70 2d  teSortTail(v, p-
5520: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
5530: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5540: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
5550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
5560: 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
5570: 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70  EList );.  if( p
5580: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
5590: 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d  =pPrior->pEList-
55a0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
55b0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
55c0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
55d0: 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
55e0: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
55f0: 66 20 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  f ",.      selec
5600: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 2c 20  tOpName(p->op), 
5610: 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68  " do not have th
5620: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
5630: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22   result columns"
5640: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
5650: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
5660: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 50  turn 1;.  }.  pP
5670: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 62 61 73  arse->nTab = bas
5680: 65 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  e;.  return 0;.}
5690: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
56a0: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69   code for the gi
56b0: 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65  ven SELECT state
56c0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
56d0: 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74  results are dist
56e0: 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f  ributed in vario
56f0: 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e  us ways dependin
5700: 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75  g on the.** valu
5710: 65 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 69  e of eDest and i
5720: 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
5730: 65 44 65 73 74 20 56 61 6c 75 65 20 20 20 20 20  eDest Value     
5740: 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20    Result.**     
5750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
5790: 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20     SRT_Callback 
57a0: 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61     Invoke the ca
57b0: 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20  llback for each 
57c0: 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
57d0: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  t..**.**     SRT
57e0: 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f  _Mem         Sto
57f0: 72 65 20 66 69 72 73 74 20 72 65 73 75 6c 74 20  re first result 
5800: 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  in memory cell i
5810: 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
5820: 52 54 5f 53 65 74 20 20 20 20 20 20 20 20 20 53  RT_Set         S
5830: 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20  tore results as 
5840: 6b 65 79 73 20 6f 66 20 61 20 74 61 62 6c 65 20  keys of a table 
5850: 77 69 74 68 20 63 75 72 73 6f 72 20 69 50 61 72  with cursor iPar
5860: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
5870: 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72  Union       Stor
5880: 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b  e results as a k
5890: 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ey in a temporar
58a0: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a  y table iParm.**
58b0: 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65  .**     SRT_Exce
58c0: 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72  pt      Remove r
58d0: 65 73 75 6c 74 73 20 66 6f 72 6d 20 74 68 65 20  esults form the 
58e0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
58f0: 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
5900: 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20   SRT_Table      
5910: 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
5920: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
5930: 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68  e iParm.**.** Th
5940: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
5950: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
5960: 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
5970: 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
5980: 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
5990: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
59a0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
59b0: 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
59c0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
59d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
59e0: 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
59f0: 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
5a00: 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
5a10: 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
5a20: 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
5a30: 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20  do that..*/.int 
5a40: 73 71 6c 69 74 65 53 65 6c 65 63 74 28 0a 20 20  sqliteSelect(.  
5a50: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5a60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
5a70: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
5a80: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
5a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5aa0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
5ab0: 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
5ac0: 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20  .  int eDest,   
5ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
5ae0: 20 6f 66 3a 20 53 52 54 5f 43 61 6c 6c 62 61 63   of: SRT_Callbac
5af0: 6b 20 4d 65 6d 20 53 65 74 20 55 6e 69 6f 6e 20  k Mem Set Union 
5b00: 45 78 63 65 70 74 20 2a 2f 0a 20 20 69 6e 74 20  Except */.  int 
5b10: 69 50 61 72 6d 20 20 20 20 20 20 20 20 20 20 20  iParm           
5b20: 20 20 20 2f 2a 20 53 61 76 65 20 72 65 73 75 6c     /* Save resul
5b30: 74 20 69 6e 20 74 68 69 73 20 6d 65 6d 6f 72 79  t in this memory
5b40: 20 6c 6f 63 61 74 69 6f 6e 2c 20 69 66 20 3e 3d   location, if >=
5b50: 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  0 */.){.  int i;
5b60: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
5b70: 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b  Info;.  Vdbe *v;
5b80: 0a 20 20 69 6e 74 20 69 73 41 67 67 20 3d 20 30  .  int isAgg = 0
5b90: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
5ba0: 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73  e for select lis
5bb0: 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a  ts like "count(*
5bc0: 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  )" */.  ExprList
5bd0: 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f   *pEList;      /
5be0: 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
5bf0: 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 20 4e  s to extract.  N
5c00: 55 4c 4c 20 6d 65 61 6e 73 20 22 2a 22 20 2a 2f  ULL means "*" */
5c10: 0a 20 20 49 64 4c 69 73 74 20 2a 70 54 61 62 4c  .  IdList *pTabL
5c20: 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist;      /* Lis
5c30: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  t of tables to s
5c40: 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  elect from */.  
5c50: 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
5c60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
5c70: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
5c80: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
5c90: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
5ca0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  ;    /* The ORDE
5cb0: 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  R BY clause.  Ma
5cc0: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
5cd0: 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
5ce0: 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
5cf0: 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
5d00: 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
5d10: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
5d20: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
5d30: 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
5d40: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
5d50: 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20  nt isDistinct;  
5d60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
5d70: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
5d80: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
5d90: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
5da0: 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ct;          /* 
5db0: 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72  Table to use for
5dc0: 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
5dd0: 74 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 3b  t */.  int base;
5de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5df0: 20 46 69 72 73 74 20 63 75 72 73 6f 72 20 61 76   First cursor av
5e00: 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
5e10: 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  */..  if( sqlite
5e20: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c  _malloc_failed |
5e30: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
5e40: 7c 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  | p==0 ) return 
5e50: 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  1;..  /* If ther
5e60: 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65  e is are a seque
5e70: 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20  nce of queries, 
5e80: 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f  do the earlier o
5e90: 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a  nes first..  */.
5ea0: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
5eb0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75  ){.    return mu
5ec0: 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
5ed0: 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72  , p, eDest, iPar
5ee0: 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  m);.  }..  /* Ma
5ef0: 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20  ke local copies 
5f00: 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  of the parameter
5f10: 73 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  s for this query
5f20: 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73  ..  */.  pTabLis
5f30: 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
5f40: 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
5f50: 65 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  e;.  pOrderBy = 
5f60: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70  p->pOrderBy;.  p
5f70: 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
5f80: 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67  oupBy;.  pHaving
5f90: 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
5fa0: 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d   isDistinct = p-
5fb0: 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20  >isDistinct;..  
5fc0: 2f 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  /* Save the curr
5fd0: 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ent value of pPa
5fe0: 72 73 65 2d 3e 6e 54 61 62 2e 20 20 52 65 73 74  rse->nTab.  Rest
5ff0: 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65 20 62  ore this value b
6000: 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20 65 78  efore.  ** we ex
6010: 69 74 2e 0a 20 20 2a 2f 0a 20 20 62 61 73 65 20  it..  */.  base 
6020: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
6030: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e  .  /* .  ** Do n
6040: 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20  ot even attempt 
6050: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20  to generate any 
6060: 63 6f 64 65 20 69 66 20 77 65 20 68 61 76 65 20  code if we have 
6070: 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a  already seen.  *
6080: 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20  * errors before 
6090: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61  this routine sta
60a0: 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rts..  */.  if( 
60b0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
60c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 73 71 6c   return 1;.  sql
60d0: 69 74 65 50 61 72 73 65 49 6e 66 6f 52 65 73 65  iteParseInfoRese
60e0: 74 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a  t(pParse);..  /*
60f0: 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74   Look up every t
6100: 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c  able in the tabl
6110: 65 20 6c 69 73 74 20 61 6e 64 20 63 72 65 61 74  e list and creat
6120: 65 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  e an appropriate
6130: 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 6c 69 73 74  .  ** columnlist
6140: 20 69 6e 20 70 45 4c 69 73 74 20 69 66 20 74 68   in pEList if th
6150: 65 72 65 20 69 73 6e 27 74 20 6f 6e 65 20 61 6c  ere isn't one al
6160: 72 65 61 64 79 2e 20 20 28 54 68 65 20 70 61 72  ready.  (The par
6170: 73 65 72 20 6c 65 61 76 65 73 0a 20 20 2a 2a 20  ser leaves.  ** 
6180: 61 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 70 2d  a NULL in the p-
6190: 3e 70 45 4c 69 73 74 20 69 66 20 74 68 65 20 53  >pEList if the S
61a0: 51 4c 20 73 61 69 64 20 22 53 45 4c 45 43 54 20  QL said "SELECT 
61b0: 2a 20 46 52 4f 4d 20 2e 2e 2e 22 29 0a 20 20 2a  * FROM ...").  *
61c0: 2f 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f  /.  if( fillInCo
61d0: 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c  lumnList(pParse,
61e0: 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   p) ){.    retur
61f0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 45 4c 69 73  n 1;.  }.  pELis
6200: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
6210: 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29   if( pEList==0 )
6220: 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a   return 1;..  /*
6230: 20 41 6c 6c 6f 63 61 74 65 20 61 20 74 65 6d 70   Allocate a temp
6240: 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 75  orary table to u
6250: 73 65 20 66 6f 72 20 74 68 65 20 44 49 53 54 49  se for the DISTI
6260: 4e 43 54 20 73 65 74 2c 20 69 66 0a 20 20 2a 2a  NCT set, if.  **
6270: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 69   necessary.  Thi
6280: 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 65  s must be done e
6290: 61 72 6c 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65  arly to allocate
62a0: 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 66 6f   the cursor befo
62b0: 72 65 0a 20 20 2a 2a 20 61 6e 79 20 63 61 6c 6c  re.  ** any call
62c0: 73 20 74 6f 20 73 71 6c 69 74 65 45 78 70 72 52  s to sqliteExprR
62d0: 65 73 6f 6c 76 65 49 64 73 28 29 2e 0a 20 20 2a  esolveIds()..  *
62e0: 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e  /.  if( isDistin
62f0: 63 74 20 29 7b 0a 20 20 20 20 64 69 73 74 69 6e  ct ){.    distin
6300: 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
6310: 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b++;.  }else{.  
6320: 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b    distinct = -1;
6330: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 72  .  }..  /* If wr
6340: 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
6350: 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
6360: 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
6370: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
6380: 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
6390: 2f 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d  /.  if( (eDest==
63a0: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
63b0: 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70 45  ==SRT_Set) && pE
63c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b  List->nExpr>1 ){
63d0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
63e0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
63f0: 72 72 4d 73 67 2c 20 22 6f 6e 6c 79 20 61 20 73  rrMsg, "only a s
6400: 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c  ingle result all
6410: 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20  owed for ".     
6420: 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61 74    "a SELECT that
6430: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
6440: 78 70 72 65 73 73 69 6f 6e 22 2c 20 30 29 3b 0a  xpression", 0);.
6450: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
6460: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ++;.    return 1
6470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 52 44 45  ;.  }..  /* ORDE
6480: 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20  R BY is ignored 
6490: 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 73 65  if we are not se
64a0: 6e 64 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nding the result
64b0: 20 74 6f 20 61 20 63 61 6c 6c 62 61 63 6b 2e 0a   to a callback..
64c0: 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
64d0: 21 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  !=SRT_Callback )
64e0: 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d  {.    pOrderBy =
64f0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c   0;.  }..  /* Al
6500: 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 66  locate cursors f
6510: 6f 72 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  or "expr IN (SEL
6520: 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72  ECT ...)" constr
6530: 75 63 74 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ucts..  */.  for
6540: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
6550: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
6560: 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
6570: 76 65 49 6e 53 65 6c 65 63 74 28 70 50 61 72 73  veInSelect(pPars
6580: 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  e, pEList->a[i].
6590: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66  pExpr);.  }.  if
65a0: 28 20 70 57 68 65 72 65 20 29 20 73 71 6c 69 74  ( pWhere ) sqlit
65b0: 65 45 78 70 72 52 65 73 6f 6c 76 65 49 6e 53 65  eExprResolveInSe
65c0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 57 68  lect(pParse, pWh
65d0: 65 72 65 29 3b 0a 20 20 69 66 28 20 70 4f 72 64  ere);.  if( pOrd
65e0: 65 72 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28  erBy ){.    for(
65f0: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
6600: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
6610: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 52 65      sqliteExprRe
6620: 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28 70 50  solveInSelect(pP
6630: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  arse, pOrderBy->
6640: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
6650: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 47 72   }.  }.  if( pGr
6660: 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 66 6f 72  oupBy ){.    for
6670: 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79  (i=0; i<pGroupBy
6680: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
6690: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 52       sqliteExprR
66a0: 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28 70  esolveInSelect(p
66b0: 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
66c0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
66d0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 48    }.  }.  if( pH
66e0: 61 76 69 6e 67 20 29 20 73 71 6c 69 74 65 45 78  aving ) sqliteEx
66f0: 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63  prResolveInSelec
6700: 74 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  t(pParse, pHavin
6710: 67 29 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  g);..  /* At thi
6720: 73 20 70 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75  s point, we shou
6730: 6c 64 20 68 61 76 65 20 61 6c 6c 6f 63 61 74 65  ld have allocate
6740: 64 20 61 6c 6c 20 74 68 65 20 63 75 72 73 6f 72  d all the cursor
6750: 73 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e  s that we.  ** n
6760: 65 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 73 75  eed to handle su
6770: 62 71 75 65 72 79 73 20 61 6e 64 20 74 65 6d 70  bquerys and temp
6780: 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 46  orary tables.  F
6790: 72 6f 6d 20 68 65 72 65 20 6f 6e 20 77 65 0a 20  rom here on we. 
67a0: 20 2a 2a 20 61 72 65 20 63 6f 6d 6d 69 74 74 65   ** are committe
67b0: 64 20 74 6f 20 6b 65 65 70 69 6e 67 20 74 68 65  d to keeping the
67c0: 20 73 61 6d 65 20 76 61 6c 75 65 20 66 6f 72 20   same value for 
67d0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2e 0a 20 20  pParse->nTab..  
67e0: 2a 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76 65 20  **.  ** Resolve 
67f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
6800: 20 61 6e 64 20 64 6f 20 61 20 73 65 6d 61 6e 74   and do a semant
6810: 69 63 73 20 63 68 65 63 6b 20 6f 6e 20 61 6c 6c  ics check on all
6820: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
6830: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
6840: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
6850: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
6860: 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
6870: 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54  veIds(pParse, pT
6880: 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2d 3e  abList, pEList->
6890: 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
68a0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
68b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
68c0: 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61  iteExprCheck(pPa
68d0: 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  rse, pEList->a[i
68e0: 5d 2e 70 45 78 70 72 2c 20 31 2c 20 26 69 73 41  ].pExpr, 1, &isA
68f0: 67 67 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  gg) ){.      ret
6900: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
6910: 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 29 7b  .  if( pWhere ){
6920: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
6930: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
6940: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
6950: 70 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20  pWhere) ){.     
6960: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
6970: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
6980: 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
6990: 20 70 57 68 65 72 65 2c 20 30 2c 20 30 29 20 29   pWhere, 0, 0) )
69a0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
69b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
69c0: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
69d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
69e0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
69f0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
6a00: 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
6a10: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
6a20: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52   if( sqliteExprR
6a30: 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
6a40: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 29 20  , pTabList, pE) 
6a50: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
6a60: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
6a70: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
6a80: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
6a90: 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a  E, isAgg, 0) ){.
6aa0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
6ab0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6ac0: 20 20 7d 0a 20 20 69 66 28 20 70 47 72 6f 75 70    }.  if( pGroup
6ad0: 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  By ){.    for(i=
6ae0: 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; i<pGroupBy->n
6af0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
6b00: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 47 72    Expr *pE = pGr
6b10: 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  oupBy->a[i].pExp
6b20: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  r;.      if( sql
6b30: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
6b40: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
6b50: 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20  st, pE) ){.     
6b60: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
6b70: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
6b80: 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70  qliteExprCheck(p
6b90: 50 61 72 73 65 2c 20 70 45 2c 20 69 73 41 67 67  Parse, pE, isAgg
6ba0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
6bb0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
6bc0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
6bd0: 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
6be0: 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30   if( pGroupBy==0
6bf0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6c00: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
6c10: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 61 20 47  e->zErrMsg, "a G
6c20: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69  ROUP BY clause i
6c30: 73 20 72 65 71 75 69 72 65 64 20 22 0a 20 20 20  s required ".   
6c40: 20 20 20 20 20 20 22 62 65 66 6f 72 65 20 48 41        "before HA
6c50: 56 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20 20  VING", 0);.     
6c60: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
6c70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
6c80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
6c90: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
6ca0: 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  Ids(pParse, pTab
6cb0: 4c 69 73 74 2c 20 70 48 61 76 69 6e 67 29 20 29  List, pHaving) )
6cc0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
6cd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6ce0: 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
6cf0: 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
6d00: 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20   isAgg, 0) ){.  
6d10: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
6d20: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f    }.  }..  /* Do
6d30: 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20   an analysis of 
6d40: 61 67 67 72 65 67 61 74 65 20 65 78 70 72 65 73  aggregate expres
6d50: 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sions..  */.  if
6d60: 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 61  ( isAgg ){.    a
6d70: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
6d80: 41 67 67 3d 3d 30 20 26 26 20 70 50 61 72 73 65  Agg==0 && pParse
6d90: 2d 3e 69 41 67 67 43 6f 75 6e 74 3c 30 20 29 3b  ->iAggCount<0 );
6da0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6db0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
6dc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
6dd0: 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65  qliteExprAnalyze
6de0: 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73  Aggregates(pPars
6df0: 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  e, pEList->a[i].
6e00: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
6e10: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
6e20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
6e30: 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
6e40: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
6e50: 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
6e60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
6e70: 28 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c  ( sqliteExprAnal
6e80: 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50  yzeAggregates(pP
6e90: 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
6ea0: 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
6eb0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
6ec0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
6ed0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
6ee0: 66 28 20 70 48 61 76 69 6e 67 20 26 26 20 73 71  f( pHaving && sq
6ef0: 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
6f00: 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
6f10: 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  , pHaving) ){.  
6f20: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
6f30: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 72 64    }.    if( pOrd
6f40: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f  erBy ){.      fo
6f50: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
6f60: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
6f70: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
6f80: 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  teExprAnalyzeAgg
6f90: 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
6fa0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
6fb0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
6fc0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
6fd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6fe0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42     }.  }..  /* B
6ff0: 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
7000: 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  code..  */.  v =
7010: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
7020: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
7030: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a  =0 ) return 1;..
7040: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d    /* Set the lim
7050: 69 74 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20  iter.  */.  if( 
7060: 70 2d 3e 6e 4c 69 6d 69 74 3c 3d 30 20 29 7b 0a  p->nLimit<=0 ){.
7070: 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d      p->nOffset =
7080: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
7090: 20 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3c   if( p->nOffset<
70a0: 30 20 29 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d  0 ) p->nOffset =
70b0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   0;.    sqliteVd
70c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 69  beAddOp(v, OP_Li
70d0: 6d 69 74 2c 20 70 2d 3e 6e 4c 69 6d 69 74 2c 20  mit, p->nLimit, 
70e0: 70 2d 3e 6e 4f 66 66 73 65 74 29 3b 0a 20 20 7d  p->nOffset);.  }
70f0: 0a 20 20 20 20 0a 0a 20 20 2f 2a 20 49 64 65 6e  .    ..  /* Iden
7100: 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
7110: 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20  s if we will be 
7120: 75 73 69 6e 67 20 69 6e 20 74 68 65 20 63 61 6c  using in the cal
7130: 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a  lback.  This.  *
7140: 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  * step is skippe
7150: 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
7160: 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61  is going to a ta
7170: 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20  ble or a memory 
7180: 63 65 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  cell..  */.  if(
7190: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
71a0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65  back ){.    gene
71b0: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
71c0: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
71d0: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
71e0: 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 61    /* Reset the a
71f0: 67 67 72 65 67 61 74 6f 72 0a 20 20 2a 2f 0a 20  ggregator.  */. 
7200: 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
7210: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7220: 70 28 76 2c 20 4f 50 5f 41 67 67 52 65 73 65 74  p(v, OP_AggReset
7230: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 41 67  , 0, pParse->nAg
7240: 67 29 3b 0a 20 20 20 20 69 66 28 20 70 47 72 6f  g);.    if( pGro
7250: 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  upBy==0 ){.     
7260: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7270: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
7280: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
7290: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
72a0: 2c 20 2d 31 2c 20 22 22 2c 20 50 33 5f 53 54 41  , -1, "", P3_STA
72b0: 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TIC);.      sqli
72c0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
72d0: 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 30  P_AggFocus, 0, 0
72e0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
72f0: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
7300: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
7310: 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20  Expr *pE;.      
7320: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 61    if( !pParse->a
7330: 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63  Agg[i].isAgg ) c
7340: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
7350: 20 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 41   pE = pParse->aA
7360: 67 67 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  gg[i].pExpr;.   
7370: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 3d       assert( pE=
7380: 3d 30 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b  =0 || pE->op==TK
7390: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
73a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
73b0: 20 70 45 3d 3d 30 20 7c 7c 20 28 70 45 2d 3e 70   pE==0 || (pE->p
73c0: 4c 69 73 74 21 3d 30 20 26 26 20 70 45 2d 3e 70  List!=0 && pE->p
73d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 29 20  List->nExpr==1) 
73e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
73f0: 45 3d 3d 30 20 7c 7c 20 70 45 2d 3e 69 43 6f 6c  E==0 || pE->iCol
7400: 75 6d 6e 3d 3d 46 4e 5f 53 75 6d 20 29 7b 0a 20  umn==FN_Sum ){. 
7410: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
7420: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
7430: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
7440: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
7450: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
7460: 67 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20 20  ggSet, 0, i);.  
7470: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
7480: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7490: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
74a0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
74b0: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  he memory cell t
74c0: 6f 20 4e 55 4c 4c 0a 20 20 2a 2f 0a 20 20 69 66  o NULL.  */.  if
74d0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  ( eDest==SRT_Mem
74e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
74f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
7500: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
7510: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7520: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
7530: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a   iParm, 1);.  }.
7540: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20  .  /* Begin the 
7550: 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20  database scan.  
7560: 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69  */.  if( isDisti
7570: 6e 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nct ){.    sqlit
7580: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7590: 5f 4f 70 65 6e 54 65 6d 70 2c 20 64 69 73 74 69  _OpenTemp, disti
75a0: 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70  nct, 0);.  }.  p
75b0: 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 57 68  WInfo = sqliteWh
75c0: 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
75d0: 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
75e0: 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 57 49  e, 0);.  if( pWI
75f0: 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  nfo==0 ) return 
7600: 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68 65  1;..  /* Use the
7610: 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
7620: 6c 6f 6f 70 20 69 66 20 77 65 20 61 72 65 20 6e  loop if we are n
7630: 6f 74 20 64 65 61 6c 69 6e 67 20 77 69 74 68 0a  ot dealing with.
7640: 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73 0a    ** aggregates.
7650: 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67    */.  if( !isAg
7660: 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 65 6c  g ){.    if( sel
7670: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
7680: 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20  rse, pEList, 0, 
7690: 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73  0, pOrderBy, dis
76a0: 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 20 69 50  tinct, eDest, iP
76b0: 61 72 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  arm,.           
76c0: 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
76d0: 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e  >iContinue, pWIn
76e0: 66 6f 2d 3e 69 42 72 65 61 6b 29 20 29 7b 0a 20  fo->iBreak) ){. 
76f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
7700: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
7710: 49 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  If we are dealin
7720: 67 20 77 69 74 68 20 61 67 67 72 65 67 61 74 65  g with aggregate
7730: 73 2c 20 74 68 65 6e 20 74 6f 20 74 68 65 20 73  s, then to the s
7740: 70 65 63 69 61 6c 20 61 67 67 72 65 67 61 74 65  pecial aggregate
7750: 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  .  ** processing
7760: 2e 20 20 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  .  .  */.  else{
7770: 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
7780: 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  y ){.      int l
7790: 62 6c 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  bl1;.      for(i
77a0: 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; i<pGroupBy->
77b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
77c0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
77d0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ode(pParse, pGro
77e0: 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  upBy->a[i].pExpr
77f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7800: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7810: 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20  (v, OP_MakeKey, 
7820: 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
7830: 20 30 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20   0);.      lbl1 
7840: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
7850: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
7860: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7870: 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20  v, OP_AggFocus, 
7880: 30 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20  0, lbl1);.      
7890: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
78a0: 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20  e->nAgg; i++){. 
78b0: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
78c0: 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  e->aAgg[i].isAgg
78d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
78e0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
78f0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 50 61 72  ode(pParse, pPar
7900: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70  se->aAgg[i].pExp
7910: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
7920: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7930: 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69 29 3b  P_AggSet, 0, i);
7940: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
7950: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
7960: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a  Label(v, lbl1);.
7970: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
7980: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67  0; i<pParse->nAg
7990: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  g; i++){.      E
79a0: 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69  xpr *pE;.      i
79b0: 6e 74 20 6f 70 3b 0a 20 20 20 20 20 20 69 66 28  nt op;.      if(
79c0: 20 21 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69   !pParse->aAgg[i
79d0: 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e  ].isAgg ) contin
79e0: 75 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70  ue;.      pE = p
79f0: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
7a00: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
7a10: 70 45 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pE==0 ){.       
7a20: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7a30: 28 76 2c 20 4f 50 5f 41 67 67 49 6e 63 72 2c 20  (v, OP_AggIncr, 
7a40: 31 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 63  1, i);.        c
7a50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
7a60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7a70: 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  E->op==TK_AGG_FU
7a80: 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  NCTION );.      
7a90: 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 69 73  assert( pE->pLis
7aa0: 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 69 73  t!=0 && pE->pLis
7ab0: 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20  t->nExpr==1 );. 
7ac0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
7ad0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  ode(pParse, pE->
7ae0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
7af0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
7b00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7b10: 41 67 67 47 65 74 2c 20 30 2c 20 69 29 3b 0a 20  AggGet, 0, i);. 
7b20: 20 20 20 20 20 73 77 69 74 63 68 28 20 70 45 2d       switch( pE-
7b30: 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
7b40: 20 20 20 20 63 61 73 65 20 46 4e 5f 4d 69 6e 3a      case FN_Min:
7b50: 20 20 6f 70 20 3d 20 4f 50 5f 4d 69 6e 3b 20 20    op = OP_Min;  
7b60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7b70: 63 61 73 65 20 46 4e 5f 4d 61 78 3a 20 20 6f 70  case FN_Max:  op
7b80: 20 3d 20 4f 50 5f 4d 61 78 3b 20 20 20 62 72 65   = OP_Max;   bre
7b90: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
7ba0: 20 46 4e 5f 41 76 67 3a 20 20 6f 70 20 3d 20 4f   FN_Avg:  op = O
7bb0: 50 5f 41 64 64 3b 20 20 20 62 72 65 61 6b 3b 0a  P_Add;   break;.
7bc0: 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f          case FN_
7bd0: 53 75 6d 3a 20 20 6f 70 20 3d 20 4f 50 5f 41 64  Sum:  op = OP_Ad
7be0: 64 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  d;   break;.    
7bf0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
7c00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
7c10: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
7c20: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7c30: 20 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69   OP_AggSet, 0, i
7c40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20  );.    }.  }... 
7c50: 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
7c60: 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a  base scan loop..
7c70: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 57 68 65    */.  sqliteWhe
7c80: 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a  reEnd(pWInfo);..
7c90: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 70    /* If we are p
7ca0: 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
7cb0: 61 74 65 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  ates, we need to
7cc0: 20 73 65 74 20 75 70 20 61 20 73 65 63 6f 6e 64   set up a second
7cd0: 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72 20   loop.  ** over 
7ce0: 61 6c 6c 20 6f 66 20 74 68 65 20 61 67 67 72 65  all of the aggre
7cf0: 67 61 74 65 20 76 61 6c 75 65 73 20 61 6e 64 20  gate values and 
7d00: 70 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20 20  process them..  
7d10: 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29  */.  if( isAgg )
7d20: 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64 61 67 67  {.    int endagg
7d30: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
7d40: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
7d50: 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20 20 20  nt startagg;.   
7d60: 20 73 74 61 72 74 61 67 67 20 3d 20 73 71 6c 69   startagg = sqli
7d70: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7d80: 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20 65 6e  P_AggNext, 0, en
7d90: 64 61 67 67 29 3b 0a 20 20 20 20 70 50 61 72 73  dagg);.    pPars
7da0: 65 2d 3e 75 73 65 41 67 67 20 3d 20 31 3b 0a 20  e->useAgg = 1;. 
7db0: 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
7dc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
7dd0: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
7de0: 2c 20 70 48 61 76 69 6e 67 2c 20 73 74 61 72 74  , pHaving, start
7df0: 61 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  agg);.    }.    
7e00: 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  if( selectInnerL
7e10: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 45 4c 69  oop(pParse, pELi
7e20: 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72  st, 0, 0, pOrder
7e30: 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44  By, distinct, eD
7e40: 65 73 74 2c 20 69 50 61 72 6d 2c 0a 20 20 20 20  est, iParm,.    
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e60: 73 74 61 72 74 61 67 67 2c 20 65 6e 64 61 67 67  startagg, endagg
7e70: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
7e80: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  n 1;.    }.    s
7e90: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7ea0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74  , OP_Goto, 0, st
7eb0: 61 72 74 61 67 67 29 3b 0a 20 20 20 20 73 71 6c  artagg);.    sql
7ec0: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
7ed0: 62 65 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a  bel(v, endagg);.
7ee0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
7ef0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20  dOp(v, OP_Noop, 
7f00: 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  0, 0);.    pPars
7f10: 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 20  e->useAgg = 0;. 
7f20: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
7f30: 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
7f40: 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65   clause, then we
7f50: 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68   need to sort th
7f60: 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61  e results.  ** a
7f70: 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20  nd send them to 
7f80: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65  the callback one
7f90: 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   by one..  */.  
7fa0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
7fb0: 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
7fc0: 54 61 69 6c 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Tail(v, pEList->
7fd0: 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 70 50  nExpr);.  }.  pP
7fe0: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 62 61 73  arse->nTab = bas
7ff0: 65 3b 0a 0a 0a 20 20 2f 2a 20 49 73 73 75 65 20  e;...  /* Issue 
8000: 61 20 6e 75 6c 6c 20 63 61 6c 6c 62 61 63 6b 20  a null callback 
8010: 69 66 20 74 68 61 74 20 69 73 20 77 68 61 74 20  if that is what 
8020: 74 68 65 20 75 73 65 72 20 77 61 6e 74 73 2e 0a  the user wants..
8030: 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 61 72    */.  if( (pPar
8040: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
8050: 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62  SQLITE_NullCallb
8060: 61 63 6b 29 21 3d 30 20 26 26 20 65 44 65 73 74  ack)!=0 && eDest
8070: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
8080: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
8090: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
80a0: 43 61 6c 6c 62 61 63 6b 2c 20 70 45 4c 69 73 74  Callback, pEList
80b0: 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  ->nExpr, 0);.  }
80c0: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.