/ Hex Artifact Content
Login

Artifact d0b54f5f5a2bb6cd5aebc24c192dea4d4dbaeb84:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 31 39 39 39 2c 20 32 30 30 30 20 44  (c) 1999, 2000 D
0020: 2e 20 52 69 63 68 61 72 64 20 48 69 70 70 0a 2a  . Richard Hipp.*
0030: 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61  *.** This progra
0040: 6d 20 69 73 20 66 72 65 65 20 73 6f 66 74 77 61  m is free softwa
0050: 72 65 3b 20 79 6f 75 20 63 61 6e 20 72 65 64 69  re; you can redi
0060: 73 74 72 69 62 75 74 65 20 69 74 20 61 6e 64 2f  stribute it and/
0070: 6f 72 0a 2a 2a 20 6d 6f 64 69 66 79 20 69 74 20  or.** modify it 
0080: 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d 73 20  under the terms 
0090: 6f 66 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72  of the GNU Gener
00a0: 61 6c 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63  al Public.** Lic
00b0: 65 6e 73 65 20 61 73 20 70 75 62 6c 69 73 68 65  ense as publishe
00c0: 64 20 62 79 20 74 68 65 20 46 72 65 65 20 53 6f  d by the Free So
00d0: 66 74 77 61 72 65 20 46 6f 75 6e 64 61 74 69 6f  ftware Foundatio
00e0: 6e 3b 20 65 69 74 68 65 72 0a 2a 2a 20 76 65 72  n; either.** ver
00f0: 73 69 6f 6e 20 32 20 6f 66 20 74 68 65 20 4c 69  sion 2 of the Li
0100: 63 65 6e 73 65 2c 20 6f 72 20 28 61 74 20 79 6f  cense, or (at yo
0110: 75 72 20 6f 70 74 69 6f 6e 29 20 61 6e 79 20 6c  ur option) any l
0120: 61 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a 2a 2a  ater version..**
0130: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d  .** This program
0140: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
0150: 69 6e 20 74 68 65 20 68 6f 70 65 20 74 68 61 74  in the hope that
0160: 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66   it will be usef
0170: 75 6c 2c 0a 2a 2a 20 62 75 74 20 57 49 54 48 4f  ul,.** but WITHO
0180: 55 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b  UT ANY WARRANTY;
0190: 20 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68   without even th
01a0: 65 20 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e  e implied warran
01b0: 74 79 20 6f 66 0a 2a 2a 20 4d 45 52 43 48 41 4e  ty of.** MERCHAN
01c0: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
01d0: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
01e0: 55 4c 41 52 20 50 55 52 50 4f 53 45 2e 20 20 53  ULAR PURPOSE.  S
01f0: 65 65 20 74 68 65 20 47 4e 55 0a 2a 2a 20 47 65  ee the GNU.** Ge
0200: 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63  neral Public Lic
0210: 65 6e 73 65 20 66 6f 72 20 6d 6f 72 65 20 64 65  ense for more de
0220: 74 61 69 6c 73 2e 0a 2a 2a 20 0a 2a 2a 20 59 6f  tails..** .** Yo
0230: 75 20 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65  u should have re
0240: 63 65 69 76 65 64 20 61 20 63 6f 70 79 20 6f 66  ceived a copy of
0250: 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c   the GNU General
0260: 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e   Public.** Licen
0270: 73 65 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  se along with th
0280: 69 73 20 6c 69 62 72 61 72 79 3b 20 69 66 20 6e  is library; if n
0290: 6f 74 2c 20 77 72 69 74 65 20 74 6f 20 74 68 65  ot, write to the
02a0: 0a 2a 2a 20 46 72 65 65 20 53 6f 66 74 77 61 72  .** Free Softwar
02b0: 65 20 46 6f 75 6e 64 61 74 69 6f 6e 2c 20 49 6e  e Foundation, In
02c0: 63 2e 2c 20 35 39 20 54 65 6d 70 6c 65 20 50 6c  c., 59 Temple Pl
02d0: 61 63 65 20 2d 20 53 75 69 74 65 20 33 33 30 2c  ace - Suite 330,
02e0: 0a 2a 2a 20 42 6f 73 74 6f 6e 2c 20 4d 41 20 20  .** Boston, MA  
02f0: 30 32 31 31 31 2d 31 33 30 37 2c 20 55 53 41 2e  02111-1307, USA.
0300: 0a 2a 2a 0a 2a 2a 20 41 75 74 68 6f 72 20 63 6f  .**.** Author co
0310: 6e 74 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  ntact informatio
0320: 6e 3a 0a 2a 2a 20 20 20 64 72 68 40 68 77 61 63  n:.**   drh@hwac
0330: 69 2e 63 6f 6d 0a 2a 2a 20 20 20 68 74 74 70 3a  i.com.**   http:
0340: 2f 2f 77 77 77 2e 68 77 61 63 69 2e 63 6f 6d 2f  //www.hwaci.com/
0350: 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  drh/.**.********
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03a0: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
03b0: 6f 6e 74 61 69 6e 73 20 43 20 63 6f 64 65 20 72  ontains C code r
03c0: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 61 72 65  outines that are
03d0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
03e0: 61 72 73 65 72 0a 2a 2a 20 74 6f 20 68 61 6e 64  arser.** to hand
03f0: 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  le SELECT statem
0400: 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  ents..**.** $Id:
0410: 20 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 32 31   select.c,v 1.21
0420: 20 32 30 30 30 2f 30 36 2f 30 38 20 31 31 3a 32   2000/06/08 11:2
0430: 35 3a 30 31 20 64 72 68 20 45 78 70 20 24 0a 2a  5:01 drh Exp $.*
0440: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0450: 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  teInt.h"../*.** 
0460: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53  Allocate a new S
0470: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0480: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
0490: 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a 20  nter to that.** 
04a0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53 65  structure..*/.Se
04b0: 6c 65 63 74 20 2a 73 71 6c 69 74 65 53 65 6c 65  lect *sqliteSele
04c0: 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c 69 73  ctNew(.  ExprLis
04d0: 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 49 64 4c  t *pEList,.  IdL
04e0: 69 73 74 20 2a 70 53 72 63 2c 0a 20 20 45 78 70  ist *pSrc,.  Exp
04f0: 72 20 2a 70 57 68 65 72 65 2c 0a 20 20 45 78 70  r *pWhere,.  Exp
0500: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c  rList *pGroupBy,
0510: 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
0520: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ,.  ExprList *pO
0530: 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 69 73  rderBy,.  int is
0540: 44 69 73 74 69 6e 63 74 0a 29 7b 0a 20 20 53 65  Distinct.){.  Se
0550: 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70 4e  lect *pNew;.  pN
0560: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
0570: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
0580: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
0590: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
05a0: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pNew->pEList = p
05b0: 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  EList;.  pNew->p
05c0: 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e  Src = pSrc;.  pN
05d0: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  ew->pWhere = pWh
05e0: 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  ere;.  pNew->pGr
05f0: 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
0600: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
0610: 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70  g = pHaving;.  p
0620: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
0630: 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77  pOrderBy;.  pNew
0640: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 69  ->isDistinct = i
0650: 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65  sDistinct;.  pNe
0660: 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43  w->op = TK_SELEC
0670: 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  T;.  return pNew
0680: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
0690: 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65  e the given Sele
06a0: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
06b0: 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73   all of its subs
06c0: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
06d0: 69 64 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44  id sqliteSelectD
06e0: 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70 29  elete(Select *p)
06f0: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
0700: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 45  eturn;.  sqliteE
0710: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  xprListDelete(p-
0720: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  >pEList);.  sqli
0730: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
0740: 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74  ->pSrc);.  sqlit
0750: 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  eExprDelete(p->p
0760: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
0770: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
0780: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 73  ->pGroupBy);.  s
0790: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
07a0: 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 73  p->pHaving);.  s
07b0: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c  qliteExprListDel
07c0: 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  ete(p->pOrderBy)
07d0: 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74  ;.  sqliteSelect
07e0: 44 65 6c 65 74 65 28 70 2d 3e 70 50 72 69 6f 72  Delete(p->pPrior
07f0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
0800: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  p);.}../*.** Del
0810: 65 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ete the aggregat
0820: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  e information fr
0830: 6f 6d 20 74 68 65 20 70 61 72 73 65 20 73 74 72  om the parse str
0840: 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  ucture..*/.void 
0850: 73 71 6c 69 74 65 50 61 72 73 65 49 6e 66 6f 52  sqliteParseInfoR
0860: 65 73 65 74 28 50 61 72 73 65 20 2a 70 50 61 72  eset(Parse *pPar
0870: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65  se){.  sqliteFre
0880: 65 28 70 50 61 72 73 65 2d 3e 61 41 67 67 29 3b  e(pParse->aAgg);
0890: 0a 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20  .  pParse->aAgg 
08a0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
08b0: 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Agg = 0;.  pPars
08c0: 65 2d 3e 69 41 67 67 43 6f 75 6e 74 20 3d 20 2d  e->iAggCount = -
08d0: 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e 75 73 65  1;.  pParse->use
08e0: 41 67 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Agg = 0;.}../*.*
08f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
0900: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
0910: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
0920: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
0930: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
0940: 54 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 4c  T..**.** The pEL
0950: 69 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64  ist is used to d
0960: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c  etermine the val
0970: 75 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  ues for each col
0980: 75 6d 6e 20 69 6e 20 74 68 65 0a 2a 2a 20 72 65  umn in the.** re
0990: 73 75 6c 74 20 72 6f 77 2e 20 20 45 78 63 65 70  sult row.  Excep
09a0: 74 20 20 69 66 20 70 45 4c 69 73 74 3d 3d 4e 55  t  if pEList==NU
09b0: 4c 4c 2c 20 74 68 65 6e 20 77 65 20 6a 75 73 74  LL, then we just
09c0: 20 72 65 61 64 20 6e 46 69 65 6c 64 0a 2a 2a 20   read nField.** 
09d0: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  elements from th
09e0: 65 20 73 72 63 54 61 62 20 74 61 62 6c 65 2e 0a  e srcTab table..
09f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
0a00: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
0a10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
0a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0a30: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
0a40: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
0a50: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c  List,       /* L
0a60: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65  ist of values be
0a70: 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f  ing extracted */
0a80: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
0a90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
0aa0: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
0ab0: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  s table */.  int
0ac0: 20 6e 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20   nField,        
0ad0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0ae0: 66 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  f fields in the 
0af0: 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a  source table */.
0b00: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
0b10: 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20  erBy,     /* If 
0b20: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72  not NULL, sort r
0b30: 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69  esults using thi
0b40: 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64  s key */.  int d
0b50: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20  istinct,        
0b60: 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61     /* If >=0, ma
0b70: 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74 73 20  ke sure results 
0b80: 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  are distinct */.
0b90: 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
0ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
0bb0: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
0bc0: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
0bd0: 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20  int iParm,      
0be0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 72          /* An ar
0bf0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 69  gument to the di
0c00: 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f  sposal method */
0c10: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
0c20: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ,          /* Ju
0c30: 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
0c40: 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f  nue with next ro
0c50: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  w */.  int iBrea
0c60: 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
0c70: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
0c80: 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
0c90: 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b  inner loop */.){
0ca0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
0cb0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
0cc0: 74 20 69 3b 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20  t i;..  /* Pull 
0cd0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 66 69  the requested fi
0ce0: 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  elds..  */.  if(
0cf0: 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 66   pEList ){.    f
0d00: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
0d10: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
0d20: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
0d30: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ode(pParse, pELi
0d40: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
0d50: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 46 69 65 6c  .    }.    nFiel
0d60: 64 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  d = pEList->nExp
0d70: 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  r;.  }else{.    
0d80: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c  for(i=0; i<nFiel
0d90: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  d; i++){.      s
0da0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
0db0: 2c 20 4f 50 5f 46 69 65 6c 64 2c 20 73 72 63 54  , OP_Field, srcT
0dc0: 61 62 2c 20 69 2c 20 30 2c 20 30 29 3b 0a 20 20  ab, i, 0, 0);.  
0dd0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
0de0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73   the current res
0df0: 75 6c 74 20 69 73 20 6e 6f 74 20 64 69 73 74 69  ult is not disti
0e00: 6e 63 74 2c 20 73 6b 69 70 20 74 68 65 20 72 65  nct, skip the re
0e10: 73 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  st.  ** of the p
0e20: 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68  rocessing for th
0e30: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 0a 20  e current row.. 
0e40: 20 2a 2f 0a 20 20 69 66 28 20 64 69 73 74 69 6e   */.  if( distin
0e50: 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ct>=0 ){.    int
0e60: 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 56 64 62   lbl = sqliteVdb
0e70: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
0e80: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
0e90: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79  Op(v, OP_MakeKey
0ea0: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
0eb0: 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   1, 0, 0);.    s
0ec0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
0ed0: 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20 64  , OP_Distinct, d
0ee0: 69 73 74 69 6e 63 74 2c 20 6c 62 6c 2c 20 30 2c  istinct, lbl, 0,
0ef0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
0f00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
0f10: 6f 70 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  op, pEList->nExp
0f20: 72 2b 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  r+1, 0, 0, 0);. 
0f30: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
0f40: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
0f50: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 30 2c 20  , iContinue, 0, 
0f60: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
0f70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
0f80: 72 69 6e 67 2c 20 30 2c 20 30 2c 20 22 22 2c 20  ring, 0, 0, "", 
0f90: 6c 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lbl);.    sqlite
0fa0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
0fb0: 50 75 74 2c 20 64 69 73 74 69 6e 63 74 2c 20 30  Put, distinct, 0
0fc0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
0fd0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
0fe0: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
0ff0: 65 2c 20 74 68 65 6e 20 73 74 6f 72 65 20 74 68  e, then store th
1000: 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 69  e results.  ** i
1010: 6e 20 61 20 73 6f 72 74 65 72 2e 0a 20 20 2a 2f  n a sorter..  */
1020: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
1030: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 6f  ){.    char *zSo
1040: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 73 71 6c  rtOrder;.    sql
1050: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
1060: 4f 50 5f 53 6f 72 74 4d 61 6b 65 52 65 63 2c 20  OP_SortMakeRec, 
1070: 6e 46 69 65 6c 64 2c 20 30 2c 20 30 2c 20 30 29  nField, 0, 0, 0)
1080: 3b 0a 20 20 20 20 7a 53 6f 72 74 4f 72 64 65 72  ;.    zSortOrder
1090: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
10a0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
10b0: 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20   + 1 );.    if( 
10c0: 7a 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 29 20  zSortOrder==0 ) 
10d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 66 6f  return 1;.    fo
10e0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
10f0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
1100: 20 20 20 20 20 20 7a 53 6f 72 74 4f 72 64 65 72        zSortOrder
1110: 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  [i] = pOrderBy->
1120: 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3f  a[i].sortOrder ?
1130: 20 27 2d 27 20 3a 20 27 2b 27 3b 0a 20 20 20 20   '-' : '+';.    
1140: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
1150: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
1160: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
1170: 20 20 20 20 7d 0a 20 20 20 20 7a 53 6f 72 74 4f      }.    zSortO
1180: 72 64 65 72 5b 70 4f 72 64 65 72 42 79 2d 3e 6e  rder[pOrderBy->n
1190: 45 78 70 72 5d 20 3d 20 30 3b 0a 20 20 20 20 73  Expr] = 0;.    s
11a0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
11b0: 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 4b 65 79  , OP_SortMakeKey
11c0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
11d0: 72 2c 20 30 2c 20 7a 53 6f 72 74 4f 72 64 65 72  r, 0, zSortOrder
11e0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
11f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1200: 53 6f 72 74 50 75 74 2c 20 30 2c 20 30 2c 20 30  SortPut, 0, 0, 0
1210: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 0a 0a  , 0);.  }else ..
1220: 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64    /* In this mod
1230: 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75  e, write each qu
1240: 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68  ery result to th
1250: 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d  e key of the tem
1260: 70 6f 72 61 72 79 0a 20 20 2a 2a 20 74 61 62 6c  porary.  ** tabl
1270: 65 20 69 50 61 72 6d 2e 0a 20 20 2a 2f 0a 20 20  e iParm..  */.  
1280: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 55  if( eDest==SRT_U
1290: 6e 69 6f 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  nion ){.    sqli
12a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
12b0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 46  P_MakeRecord, nF
12c0: 69 65 6c 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ield, 0, 0, 0);.
12d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
12e0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
12f0: 2c 20 69 50 61 72 6d 2c 20 30 2c 20 22 22 2c 20  , iParm, 0, "", 
1300: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
1310: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
1320: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
1330: 30 29 3b 0a 20 20 7d 65 6c 73 65 20 0a 0a 20 20  0);.  }else ..  
1340: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
1350: 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
1360: 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
1370: 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
1380: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20  ==SRT_Table ){. 
1390: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
13a0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
13b0: 6f 72 64 2c 20 6e 46 69 65 6c 64 2c 20 30 2c 20  ord, nField, 0, 
13c0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
13d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
13e0: 5f 4e 65 77 2c 20 69 50 61 72 6d 2c 20 30 2c 20  _New, iParm, 0, 
13f0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1400: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
1410: 5f 50 75 6c 6c 2c 20 31 2c 20 30 2c 20 30 2c 20  _Pull, 1, 0, 0, 
1420: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
1430: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
1440: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
1450: 30 29 3b 0a 20 20 7d 65 6c 73 65 20 0a 0a 20 20  0);.  }else ..  
1460: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
1470: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
1480: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
1490: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a   instead of.  **
14a0: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
14b0: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
14c0: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
14d0: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 2a  lements from.  *
14e0: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
14f0: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 2a  table iParm..  *
1500: 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
1510: 52 54 5f 45 78 63 65 70 74 20 29 7b 0a 20 20 20  RT_Except ){.   
1520: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1530: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
1540: 64 2c 20 6e 46 69 65 6c 64 2c 20 30 2c 20 30 2c  d, nField, 0, 0,
1550: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
1560: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
1570: 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 30 2c  elete, iParm, 0,
1580: 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20   0, 0);.  }else 
1590: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
15a0: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
15b0: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
15c0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
15d0: 6e 73 74 72 75 63 74 2c 0a 20 20 2a 2a 20 74 68  nstruct,.  ** th
15e0: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
15f0: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
1600: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
1610: 57 72 69 74 65 20 74 68 69 73 0a 20 20 2a 2a 20  Write this.  ** 
1620: 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65  item into the se
1630: 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67  t table with bog
1640: 75 73 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20  us data..  */.  
1650: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
1660: 65 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  et ){.    assert
1670: 28 20 6e 46 69 65 6c 64 3d 3d 31 20 29 3b 0a 20  ( nField==1 );. 
1680: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
1690: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
16a0: 20 30 2c 20 30 2c 20 22 22 2c 20 30 29 3b 0a 20   0, 0, "", 0);. 
16b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
16c0: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 2c 20 69 50  Op(v, OP_Put, iP
16d0: 61 72 6d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  arm, 0, 0, 0);. 
16e0: 20 7d 65 6c 73 65 20 0a 0a 0a 20 20 2f 2a 20 49   }else ...  /* I
16f0: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
1700: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
1710: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
1720: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
1730: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
1740: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
1750: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
1760: 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  ell and break ou
1770: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63  t.  ** of the sc
1780: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20  an loop..  */.  
1790: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d  if( eDest==SRT_M
17a0: 65 6d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  em ){.    assert
17b0: 28 20 6e 46 69 65 6c 64 3d 3d 31 20 29 3b 0a 20  ( nField==1 );. 
17c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
17d0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
17e0: 65 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  e, iParm, 0, 0, 
17f0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
1800: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
1810: 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 2c 20 30  to, 0, iBreak, 0
1820: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  , 0);.  }else.. 
1830: 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74   /* If none of t
1840: 68 65 20 61 62 6f 76 65 2c 20 73 65 6e 64 20 74  he above, send t
1850: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63  he data to the c
1860: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
1870: 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 73  ..  */.  {.    s
1880: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
1890: 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e  , OP_Callback, n
18a0: 46 69 65 6c 64 2c 20 30 2c 20 30 2c 20 30 29 3b  Field, 0, 0, 0);
18b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
18c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
18d0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20   inner loop was 
18e0: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
18f0: 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65  a non-null pOrde
1900: 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  rBy argument,.**
1910: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
1920: 73 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e  s were placed in
1930: 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65   a sorter.  Afte
1940: 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65  r the loop is te
1950: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e  rminated.** we n
1960: 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73  eed to run the s
1970: 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74  orter and output
1980: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
1990: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
19a0: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
19b0: 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65  s the code neede
19c0: 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  d to do that..*/
19d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
19e0: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 56 64  erateSortTail(Vd
19f0: 62 65 20 2a 76 2c 20 69 6e 74 20 6e 46 69 65 6c  be *v, int nFiel
1a00: 64 29 7b 0a 20 20 69 6e 74 20 65 6e 64 20 3d 20  d){.  int end = 
1a10: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
1a20: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64  bel(v);.  int ad
1a30: 64 72 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65  dr;.  sqliteVdbe
1a40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
1a50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
1a60: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
1a70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
1a80: 72 74 4e 65 78 74 2c 20 30 2c 20 65 6e 64 2c 20  rtNext, 0, end, 
1a90: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 56  0, 0);.  sqliteV
1aa0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
1ab0: 6f 72 74 43 61 6c 6c 62 61 63 6b 2c 20 6e 46 69  ortCallback, nFi
1ac0: 65 6c 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  eld, 0, 0, 0);. 
1ad0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1ae0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1af0: 61 64 64 72 2c 20 30 2c 20 30 29 3b 0a 20 20 73  addr, 0, 0);.  s
1b00: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
1b10: 2c 20 4f 50 5f 53 6f 72 74 43 6c 6f 73 65 2c 20  , OP_SortClose, 
1b20: 30 2c 20 30 2c 20 30 2c 20 65 6e 64 29 3b 0a 7d  0, 0, 0, end);.}
1b30: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1b40: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1b50: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 68 6f  tell the VDBE ho
1b60: 77 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 74  w many columns t
1b70: 68 65 72 65 0a 2a 2a 20 61 72 65 20 69 6e 20 74  here.** are in t
1b80: 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20 74 68  he result and th
1b90: 65 20 6e 61 6d 65 20 66 6f 72 20 65 61 63 68 20  e name for each 
1ba0: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 69 6e  column.  This in
1bb0: 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69 73 20  formation.** is 
1bc0: 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  used to provide 
1bd0: 22 61 72 67 63 22 20 61 6e 64 20 22 61 7a 43 6f  "argc" and "azCo
1be0: 6c 5b 5d 22 20 76 61 6c 75 65 73 20 69 6e 20 74  l[]" values in t
1bf0: 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  he callback..*/.
1c00: 73 74 61 74 69 63 20 0a 76 6f 69 64 20 67 65 6e  static .void gen
1c10: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
1c20: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c30: 49 64 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  IdList *pTabList
1c40: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
1c50: 73 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  st){.  Vdbe *v =
1c60: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1c70: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1c80: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
1c90: 65 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  et ) return;.  p
1ca0: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
1cb0: 65 74 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65  et = 1;.  sqlite
1cc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1cd0: 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 70 45 4c  ColumnCount, pEL
1ce0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 20 30  ist->nExpr, 0, 0
1cf0: 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  , 0);.  for(i=0;
1d00: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
1d10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
1d20: 20 2a 70 3b 0a 20 20 20 20 69 66 28 20 70 45 4c   *p;.    if( pEL
1d30: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
1d40: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
1d50: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
1d60: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
1d70: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1d80: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d  (v, OP_ColumnNam
1d90: 65 2c 20 69 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20  e, i, 0, zName, 
1da0: 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  0);.      contin
1db0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20  ue;.    }.    p 
1dc0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
1dd0: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 2d  Expr;.    if( p-
1de0: 3e 6f 70 21 3d 54 4b 5f 46 49 45 4c 44 20 7c 7c  >op!=TK_FIELD ||
1df0: 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a   pTabList==0 ){.
1e00: 20 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65        char zName
1e10: 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73 70 72 69  [30];.      spri
1e20: 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75  ntf(zName, "colu
1e30: 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20  mn%d", i+1);.   
1e40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
1e50: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e  Op(v, OP_ColumnN
1e60: 61 6d 65 2c 20 69 2c 20 30 2c 20 7a 4e 61 6d 65  ame, i, 0, zName
1e70: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1e80: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 4c  .      if( pTabL
1e90: 69 73 74 2d 3e 6e 49 64 3e 31 20 29 7b 0a 20 20  ist->nId>1 ){.  
1ea0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
1eb0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  e = 0;.        T
1ec0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
1ed0: 62 4c 69 73 74 2d 3e 61 5b 70 2d 3e 69 54 61 62  bList->a[p->iTab
1ee0: 6c 65 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  le].pTab;.      
1ef0: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a    char *zTab;. .
1f00: 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70          zTab = p
1f10: 54 61 62 4c 69 73 74 2d 3e 61 5b 70 2d 3e 69 54  TabList->a[p->iT
1f20: 61 62 6c 65 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20  able].zAlias;.  
1f30: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 3d 3d        if( zTab==
1f40: 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d  0 ) zTab = pTab-
1f50: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
1f60: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
1f70: 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e  &zName, zTab, ".
1f80: 22 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d  ", pTab->aCol[p-
1f90: 3e 69 46 69 65 6c 64 5d 2e 7a 4e 61 6d 65 2c 20  >iField].zName, 
1fa0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
1fb0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1fc0: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c  P_ColumnName, i,
1fd0: 20 30 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20   0, zName, 0);. 
1fe0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
1ff0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  e(zName);.      
2000: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54  }else{.        T
2010: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
2020: 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62  bList->a[0].pTab
2030: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
2040: 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
2050: 6f 6c 5b 70 2d 3e 69 46 69 65 6c 64 5d 2e 7a 4e  ol[p->iField].zN
2060: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ame;.        sql
2070: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
2080: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69  OP_ColumnName, i
2090: 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  , 0, zName, 0);.
20a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20  }.}../*.** Name 
20c0: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
20d0: 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64  n operator, used
20e0: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
20f0: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ges..*/.static c
2100: 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63  onst char *selec
2110: 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b  tOpName(int id){
2120: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77  .  char *z;.  sw
2130: 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20  itch( id ){.    
2140: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
2150: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c     z = "UNION AL
2160: 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  L";   break;.   
2170: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
2180: 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45  CT: z = "INTERSE
2190: 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  CT";   break;.  
21a0: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
21b0: 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54  :    z = "EXCEPT
21c0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
21d0: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
21e0: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
21f0: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
2200: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
2210: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  }../*.** For the
2220: 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74   given SELECT st
2230: 61 74 65 6d 65 6e 74 2c 20 64 6f 20 74 77 6f 20  atement, do two 
2240: 74 68 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  things..**.**   
2250: 20 28 31 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (1)  Fill in th
2260: 65 20 70 54 61 62 20 66 69 65 6c 64 73 20 6f 66  e pTab fields of
2270: 20 74 68 65 20 49 64 4c 69 73 74 20 74 68 61 74   the IdList that
2280: 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 65 74   defines the set
2290: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74  .**         of t
22a0: 61 62 6c 65 73 20 77 65 20 61 72 65 20 73 63 61  ables we are sca
22b0: 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  nning..**.**    
22c0: 28 32 29 20 20 49 66 20 74 68 65 20 63 6f 6c 75  (2)  If the colu
22d0: 6d 6e 73 20 74 6f 20 62 65 20 65 78 74 72 61 63  mns to be extrac
22e0: 74 65 64 20 76 61 72 69 61 62 6c 65 20 28 70 45  ted variable (pE
22f0: 4c 69 73 74 29 20 69 73 20 4e 55 4c 4c 0a 2a 2a  List) is NULL.**
2300: 20 20 20 20 20 20 20 20 20 28 6d 65 61 6e 69 6e           (meanin
2310: 67 20 74 68 61 74 20 61 20 22 2a 22 20 77 61 73  g that a "*" was
2320: 20 75 73 65 64 20 69 6e 20 74 68 65 20 53 51 4c   used in the SQL
2330: 20 73 74 61 74 65 6d 65 6e 74 29 20 74 68 65 6e   statement) then
2340: 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 72 65 61  .**         crea
2350: 74 65 20 61 20 66 61 6b 65 20 70 45 4c 69 73 74  te a fake pEList
2360: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2370: 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 6f 6c  names of all col
2380: 75 6d 6e 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  umns.**         
2390: 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 2a  of all tables..*
23a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e  *.** Return 0 on
23b0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
23c0: 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73  ere are problems
23d0: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
23e0: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70   message.** in p
23f0: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
2400: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74   non-zero..*/.st
2410: 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
2420: 6f 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73 65 20  olumnList(Parse 
2430: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
2440: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  *p){.  int i, j;
2450: 0a 20 20 49 64 4c 69 73 74 20 2a 70 54 61 62 4c  .  IdList *pTabL
2460: 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
2470: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
2480: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a  t = p->pEList;..
2490: 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
24a0: 72 79 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ry table in the 
24b0: 74 61 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a 2f  table list..  */
24c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
24d0: 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  abList->nId; i++
24e0: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c  ){.    if( pTabL
24f0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 29  ist->a[i].pTab )
2500: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
2510: 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20  routine has run 
2520: 62 65 66 6f 72 65 21 20 20 4e 6f 20 6e 65 65 64  before!  No need
2530: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a   to continue */.
2540: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
2550: 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69      }.    pTabLi
2560: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20  st->a[i].pTab = 
2570: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
2580: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
2590: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
25a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c  );.    if( pTabL
25b0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3d 3d  ist->a[i].pTab==
25c0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
25d0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
25e0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f  se->zErrMsg, "no
25f0: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20   such table: ", 
2600: 0a 20 20 20 20 20 20 20 20 20 70 54 61 62 4c 69  .         pTabLi
2610: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
2620: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
2630: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
2640: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2650: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2660: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
2670: 20 74 6f 20 72 65 74 72 69 65 76 65 20 69 73 20   to retrieve is 
2680: 22 2a 22 20 74 68 65 6e 20 72 65 70 6c 61 63 65  "*" then replace
2690: 20 69 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 20   it with.  ** a 
26a0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
26b0: 6d 6e 73 20 66 72 6f 6d 20 61 6c 6c 20 74 61 62  mns from all tab
26c0: 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
26d0: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
26e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
26f0: 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
2700: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
2710: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
2720: 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [i].pTab;.      
2730: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
2740: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
2750: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
2760: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
2770: 5f 44 4f 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  _DOT, 0, 0, 0);.
2780: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
2790: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45 78 70  Left = sqliteExp
27a0: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30  r(TK_ID, 0, 0, 0
27b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
27c0: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a  ->pLeft->token.z
27d0: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
27e0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
27f0: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  Left->token.n = 
2800: 73 74 72 6c 65 6e 28 70 54 61 62 2d 3e 7a 4e 61  strlen(pTab->zNa
2810: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  me);.        pEx
2820: 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  pr->pRight = sql
2830: 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  iteExpr(TK_ID, 0
2840: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
2850: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e   pExpr->pRight->
2860: 74 6f 6b 65 6e 2e 7a 20 3d 20 70 54 61 62 2d 3e  token.z = pTab->
2870: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
2880: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52         pExpr->pR
2890: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  ight->token.n = 
28a0: 73 74 72 6c 65 6e 28 70 54 61 62 2d 3e 61 43 6f  strlen(pTab->aCo
28b0: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[j].zName);.   
28c0: 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71       pEList = sq
28d0: 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65  liteExprListAppe
28e0: 6e 64 28 70 45 4c 69 73 74 2c 20 70 45 78 70 72  nd(pEList, pExpr
28f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
2900: 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73    }.    p->pELis
2910: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 7d 0a  t = pEList;.  }.
2920: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2930: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2940: 65 20 61 73 73 6f 63 69 61 74 65 73 20 65 6e 74  e associates ent
2950: 72 69 65 73 20 69 6e 20 61 6e 20 4f 52 44 45 52  ries in an ORDER
2960: 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   BY expression l
2970: 69 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75  ist with.** colu
2980: 6d 6e 73 20 69 6e 20 61 20 72 65 73 75 6c 74 2e  mns in a result.
2990: 20 20 46 6f 72 20 65 61 63 68 20 4f 52 44 45 52    For each ORDER
29a0: 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   BY expression, 
29b0: 74 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a  the opcode of.**
29c0: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e   the top-level n
29d0: 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ode is changed t
29e0: 6f 20 54 4b 5f 46 49 45 4c 44 20 61 6e 64 20 74  o TK_FIELD and t
29f0: 68 65 20 69 46 69 65 6c 64 20 76 61 6c 75 65 20  he iField value 
2a00: 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65  of.** the top-le
2a10: 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c  vel node is fill
2a20: 65 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d  ed in with colum
2a30: 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  n number and the
2a40: 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65   iTable.** value
2a50: 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65   of the top-leve
2a60: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
2a70: 20 77 69 74 68 20 69 54 61 62 6c 65 20 70 61 72   with iTable par
2a80: 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ameter..**.** If
2a90: 20 74 68 65 72 65 20 61 72 65 20 70 72 69 6f 72   there are prior
2aa0: 20 53 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c   SELECT clauses,
2ab0: 20 74 68 65 79 20 61 72 65 20 70 72 6f 63 65 73   they are proces
2ac0: 73 65 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61  sed first.  A ma
2ad0: 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72  tch.** in an ear
2ae0: 6c 69 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65  lier SELECT take
2af0: 73 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  s precedence ove
2b00: 72 20 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54  r a later SELECT
2b10: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72  ..**.** Any entr
2b20: 79 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  y that does not 
2b30: 6d 61 74 63 68 20 69 73 20 66 6c 61 67 67 65 64  match is flagged
2b40: 20 61 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54   as an error.  T
2b50: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
2b60: 65 72 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e  errors is return
2b70: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2b80: 74 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  t matchOrderbyTo
2b90: 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
2ba0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2bb0: 20 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20    /* A place to 
2bc0: 6c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  leave error mess
2bd0: 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ages */.  Select
2be0: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
2bf0: 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65    /* Match to re
2c00: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  sult columns of 
2c10: 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  this SELECT */. 
2c20: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
2c30: 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rBy,     /* The 
2c40: 4f 52 44 45 52 20 42 59 20 76 61 6c 75 65 73 20  ORDER BY values 
2c50: 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  to match against
2c60: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
2c70: 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
2c80: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
2c90: 74 68 69 73 20 74 68 69 73 20 76 61 6c 75 65 20  this this value 
2ca0: 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69  in iTable */.  i
2cb0: 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  nt mustComplete 
2cc0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55         /* If TRU
2cd0: 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20  E all ORDER BYs 
2ce0: 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b  must match */.){
2cf0: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
2d00: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45  .  int i, j;.  E
2d10: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
2d20: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  ..  assert( pSel
2d30: 65 63 74 20 26 26 20 70 4f 72 64 65 72 42 79 20  ect && pOrderBy 
2d40: 29 3b 0a 20 20 69 66 28 20 6d 75 73 74 43 6f 6d  );.  if( mustCom
2d50: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 66 6f 72  plete ){.    for
2d60: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
2d70: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70  ->nExpr; i++){ p
2d80: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
2d90: 6e 65 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20  ne = 0; }.  }.  
2da0: 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e  if( fillInColumn
2db0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
2dc0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74  lect) ){.    ret
2dd0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
2de0: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
2df0: 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 74 63   ){.    if( matc
2e00: 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e  hOrderbyToColumn
2e10: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
2e20: 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65 72  ->pPrior, pOrder
2e30: 42 79 2c 20 69 54 61 62 6c 65 2c 20 30 29 20 29  By, iTable, 0) )
2e40: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
2e50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45  ;.    }.  }.  pE
2e60: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
2e70: 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d  pEList;.  for(i=
2e80: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
2e90: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
2ea0: 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65  Expr *pE = pOrde
2eb0: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
2ec0: 0a 20 20 20 20 69 6e 74 20 6d 61 74 63 68 20 3d  .    int match =
2ed0: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64   0;.    if( pOrd
2ee0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
2ef0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2f00: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73  for(j=0; j<pELis
2f10: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
2f20: 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74        if( pEList
2f30: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 26 26 20  ->a[i].zName && 
2f40: 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c  (pE->op==TK_ID |
2f50: 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  | pE->op==TK_STR
2f60: 49 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ING) ){.        
2f70: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
2f80: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
2f90: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
2fa0: 7a 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 20 20  zLabel = 0;.    
2fb0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
2fc0: 72 69 6e 67 28 26 7a 4c 61 62 65 6c 2c 20 70 45  ring(&zLabel, pE
2fd0: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 2d 3e 74  ->token.z, pE->t
2fe0: 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20  oken.n, 0);.    
2ff0: 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74      sqliteDequot
3000: 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  e(zLabel);.     
3010: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
3020: 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62  ICmp(zName, zLab
3030: 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20  el)==0 ){ .     
3040: 20 20 20 20 20 6d 61 74 63 68 20 3d 20 31 3b 20       match = 1; 
3050: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3060: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61 74   }.      if( mat
3070: 63 68 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 45  ch==0 && sqliteE
3080: 78 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70  xprCompare(pE, p
3090: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
30a0: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  r) ){.        ma
30b0: 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  tch = 1;.      }
30c0: 0a 20 20 20 20 20 20 69 66 28 20 6d 61 74 63 68  .      if( match
30d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e   ){.        pE->
30e0: 6f 70 20 3d 20 54 4b 5f 46 49 45 4c 44 3b 0a 20  op = TK_FIELD;. 
30f0: 20 20 20 20 20 20 20 70 45 2d 3e 69 46 69 65 6c         pE->iFiel
3100: 64 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 70  d = j;.        p
3110: 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  E->iTable = iTab
3120: 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  le;.        pOrd
3130: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
3140: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
3150: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3160: 7d 0a 20 20 20 20 69 66 28 20 21 6d 61 74 63 68  }.    if( !match
3170: 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65   && mustComplete
3180: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a   ){.      char z
3190: 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73  Buf[30];.      s
31a0: 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 22  printf(zBuf,"%d"
31b0: 2c 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ,i+1);.      sql
31c0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
31d0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
31e0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75  ORDER BY term nu
31f0: 6d 62 65 72 20 22 2c 20 7a 42 75 66 2c 20 0a 20  mber ", zBuf, . 
3200: 20 20 20 20 20 20 20 22 20 64 6f 65 73 20 6e 6f         " does no
3210: 74 20 6d 61 74 63 68 20 61 6e 79 20 72 65 73 75  t match any resu
3220: 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  lt column", 0);.
3230: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
3240: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 6e 45 72 72  rr++;.      nErr
3250: 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ++;.      break;
3260: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3270: 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f  urn nErr;  .}../
3280: 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20  *.** Get a VDBE 
3290: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
32a0: 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43  rser context.  C
32b0: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
32c0: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
32d0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
32e0: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
32f0: 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73   and leave a mes
3300: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
3310: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 47  */.Vdbe *sqliteG
3320: 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
3330: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
3340: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
3350: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
3360: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
3370: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 56 64  pVdbe = sqliteVd
3380: 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d  beCreate(pParse-
3390: 3e 64 62 2d 3e 70 42 65 29 3b 0a 20 20 7d 0a 20  >db->pBe);.  }. 
33a0: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
33b0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
33c0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
33d0: 67 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  g, "out of memor
33e0: 79 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  y", 0);.    pPar
33f0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a  se->nErr++;.  }.
3400: 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 20 20    return v;.}.  
3410: 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72    ../*.** This r
3420: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3430: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75   to process a qu
3440: 65 72 79 20 74 68 61 74 20 69 73 20 72 65 61 6c  ery that is real
3450: 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20  ly the union.** 
3460: 6f 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  or intersection 
3470: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  of two or more s
3480: 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 2e  eparate queries.
3490: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
34a0: 75 6c 74 69 53 65 6c 65 63 74 28 50 61 72 73 65  ultiSelect(Parse
34b0: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
34c0: 20 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20   *p, int eDest, 
34d0: 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 69 6e  int iParm){.  in
34e0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
34f0: 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64    /* Success cod
3500: 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74  e from a subrout
3510: 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ine */.  Select 
3520: 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 2f 2a 20  *pPrior;     /* 
3530: 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
3540: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
3550: 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
3560: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
3570: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
3580: 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
3590: 0a 20 20 69 6e 74 20 62 61 73 65 3b 20 20 20 20  .  int base;    
35a0: 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 6c 69         /* Baseli
35b0: 6e 65 20 76 61 6c 75 65 20 66 6f 72 20 70 50 61  ne value for pPa
35c0: 72 73 65 2d 3e 6e 54 61 62 20 2a 2f 0a 0a 20 20  rse->nTab */..  
35d0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
35e0: 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
35f0: 59 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f  Y clause on prio
3600: 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79  r SELECTs.  Only
3610: 20 74 68 65 20 0a 20 20 2a 2a 20 6c 61 73 74 20   the .  ** last 
3620: 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65  SELECT in the se
3630: 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e  ries may have an
3640: 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 2a 2f 0a   ORDER BY..  */.
3650: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
3660: 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 50 72 69  ior!=0 );.  pPri
3670: 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
3680: 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f    if( pPrior->pO
3690: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
36a0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
36b0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 22  Parse->zErrMsg,"
36c0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
36d0: 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
36e0: 72 20 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  r ",.      selec
36f0: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 2c 20  tOpName(p->op), 
3700: 22 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 20 30  " not before", 0
3710: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
3720: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
3730: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  n 1;.  }..  /* M
3740: 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
3750: 20 61 20 76 61 6c 69 64 20 71 75 65 72 79 20 65   a valid query e
3760: 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20  ngine.  If not, 
3770: 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  create a new one
3780: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
3790: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
37a0: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
37b0: 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a   return 1;..  /*
37c0: 20 50 72 6f 63 65 73 73 20 74 68 65 20 55 4e 49   Process the UNI
37d0: 4f 4e 20 6f 72 20 49 4e 54 45 52 53 45 43 54 49  ON or INTERSECTI
37e0: 4f 4e 0a 20 20 2a 2f 0a 20 20 62 61 73 65 20 3d  ON.  */.  base =
37f0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
3800: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
3810: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
3820: 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  L:.    case TK_E
3830: 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20  XCEPT:.    case 
3840: 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
3850: 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
3860: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
3870: 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
3880: 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69  rary table holdi
3890: 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
38a0: 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20     int op;      
38b0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
38c0: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
38d0: 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
38e0: 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lf */.      int 
38f0: 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
3900: 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
3910: 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
3920: 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
3930: 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d  .      priorOp =
3940: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f   p->op==TK_ALL ?
3950: 20 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54   SRT_Table : SRT
3960: 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66  _Union;.      if
3970: 28 20 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70  ( eDest==priorOp
3980: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
3990: 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
39a0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
39b0: 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
39c0: 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
39d0: 20 20 20 2a 2a 20 72 69 67 68 74 2e 20 20 54 68     ** right.  Th
39e0: 69 73 20 61 6c 73 6f 20 6d 65 61 6e 73 20 77 65  is also means we
39f0: 20 61 72 65 20 6e 6f 74 20 74 68 65 20 72 69 67   are not the rig
3a00: 68 74 2d 6d 6f 73 74 20 73 65 6c 65 63 74 20 61  ht-most select a
3a10: 6e 64 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a  nd so.        **
3a20: 20 77 65 20 63 61 6e 6e 6f 74 20 68 61 76 65 20   we cannot have 
3a30: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
3a40: 73 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  se.        */.  
3a50: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
3a60: 20 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20   iParm;.        
3a70: 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
3a80: 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
3a90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
3aa0: 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  * We will need t
3ab0: 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
3ac0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
3ad0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20   to hold the.   
3ae0: 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
3af0: 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
3b00: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
3b10: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72   unionTab = pPar
3b20: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
3b30: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
3b40: 72 42 79 20 0a 20 20 20 20 20 20 20 20 26 26 20  rBy .        && 
3b50: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
3b60: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20  lumn(pParse, p, 
3b70: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75 6e 69  p->pOrderBy, uni
3b80: 6f 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20 20 20  onTab, 1) ){.   
3b90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
3ba0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3bb0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3bc0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20 75  Op(v, OP_Open, u
3bd0: 6e 69 6f 6e 54 61 62 2c 20 31 2c 20 30 2c 20 30  nionTab, 1, 0, 0
3be0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
3bf0: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ->op!=TK_ALL ){.
3c00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3c10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3c20: 4b 65 79 41 73 44 61 74 61 2c 20 75 6e 69 6f 6e  KeyAsData, union
3c30: 54 61 62 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20  Tab, 1, 0, 0);. 
3c40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
3c50: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
3c60: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
3c70: 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66  ments to our lef
3c80: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
3c90: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
3ca0: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
3cb0: 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f  r, priorOp, unio
3cc0: 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 69 66 28  nTab);.      if(
3cd0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
3ce0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
3cf0: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
3d00: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
3d10: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74     */.      swit
3d20: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
3d30: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58        case TK_EX
3d40: 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f  CEPT:  op = SRT_
3d50: 45 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b  Except;   break;
3d60: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
3d70: 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20  K_UNION:   op = 
3d80: 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72  SRT_Union;    br
3d90: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61  eak;.         ca
3da0: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f  se TK_ALL:     o
3db0: 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20  p = SRT_Table;  
3dc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3dd0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
3de0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
3df0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
3e00: 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69  arse, p, op, uni
3e10: 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 70 2d  onTab);.      p-
3e20: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
3e30: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
3e40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
3e50: 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
3e60: 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65  e data in the te
3e70: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e  mporary table in
3e80: 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
3e90: 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
3ea0: 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c  that we currentl
3eb0: 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  y need..      */
3ec0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
3ed0: 20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20   eDest!=priorOp 
3ee0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
3ef0: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 3b 0a 20 20  Cont, iBreak;.  
3f00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
3f10: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
3f20: 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
3f30: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
3f40: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
3f50: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
3f60: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
3f70: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3f80: 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4f 70 65  Op(v, OP_SortOpe
3f90: 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  n, 0, 0, 0, 0);.
3fa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3fb0: 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
3fc0: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
3fd0: 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74  );.        iCont
3fe0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
3ff0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75  Op(v, OP_Next, u
4000: 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 2c  nionTab, iBreak,
4010: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
4020: 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72  rc = selectInner
4030: 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 30 2c 20  Loop(pParse, 0, 
4040: 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c  unionTab, p->pEL
4050: 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  ist->nExpr,.    
4060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4070: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64           p->pOrd
4080: 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c  erBy, -1, eDest,
4090: 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20   iParm, .       
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40b0: 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72        iCont, iBr
40c0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  eak);.        if
40d0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 31 3b  ( rc ) return 1;
40e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
40f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
4100: 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 2c 20 30  oto, 0, iCont, 0
4110: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
4120: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4130: 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
4140: 54 61 62 2c 20 30 2c 20 30 2c 20 69 42 72 65 61  Tab, 0, 0, iBrea
4150: 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k);.        if( 
4160: 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
4170: 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74           generat
4180: 65 53 6f 72 74 54 61 69 6c 28 76 2c 20 70 2d 3e  eSortTail(v, p->
4190: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
41a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
41b0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
41c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
41d0: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20  _INTERSECT: {.  
41e0: 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
41f0: 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
4200: 6f 6e 74 2c 20 69 42 72 65 61 6b 3b 0a 0a 20 20  ont, iBreak;..  
4210: 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54      /* INTERSECT
4220: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
4230: 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69  om the others si
4240: 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a  nce it requires.
4250: 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
4260: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
4270: 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
4280: 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
4290: 6e 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  ne.      ** by a
42a0: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
42b0: 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
42c0: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
42d0: 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
42e0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
42f0: 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
4300: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
4310: 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 6d  p->pOrderBy && m
4320: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
4330: 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e  umn(pParse,p,p->
4340: 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29  pOrderBy,tab1,1)
4350: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4360: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
4370: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4380: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20  dOp(v, OP_Open, 
4390: 74 61 62 31 2c 20 31 2c 20 30 2c 20 30 29 3b 0a  tab1, 1, 0, 0);.
43a0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
43b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41  AddOp(v, OP_KeyA
43c0: 73 44 61 74 61 2c 20 74 61 62 31 2c 20 31 2c 20  sData, tab1, 1, 
43d0: 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  0, 0);..      /*
43e0: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
43f0: 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
4400: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
4410: 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
4420: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
4430: 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72  qliteSelect(pPar
4440: 73 65 2c 20 70 50 72 69 6f 72 2c 20 53 52 54 5f  se, pPrior, SRT_
4450: 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20  Union, tab1);.  
4460: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
4470: 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f  urn rc;..      /
4480: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
4490: 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
44a0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
44b0: 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
44c0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
44d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 2c  ddOp(v, OP_Open,
44e0: 20 74 61 62 32 2c 20 31 2c 20 30 2c 20 30 29 3b   tab2, 1, 0, 0);
44f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4500: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79  eAddOp(v, OP_Key
4510: 41 73 44 61 74 61 2c 20 74 61 62 32 2c 20 31 2c  AsData, tab2, 1,
4520: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d   0, 0);.      p-
4530: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
4540: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65     rc = sqliteSe
4550: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
4560: 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 29  SRT_Union, tab2)
4570: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
4580: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
4590: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
45a0: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  n rc;..      /* 
45b0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
45c0: 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73   take the inters
45d0: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77  ection of the tw
45e0: 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  o temporary.    
45f0: 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20    ** tables..   
4600: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
4610: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
4620: 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43  .      generateC
4630: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
4640: 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29  e, 0, p->pEList)
4650: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
4660: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
4670: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4680: 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4f 70 65  Op(v, OP_SortOpe
4690: 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  n, 0, 0, 0, 0);.
46a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42        }.      iB
46b0: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 56 64 62  reak = sqliteVdb
46c0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
46d0: 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
46e0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
46f0: 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
4700: 42 72 65 61 6b 2c 20 30 2c 20 30 29 3b 0a 20 20  Break, 0, 0);.  
4710: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4720: 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 2c 20 74  dOp(v, OP_Key, t
4730: 61 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ab1, 0, 0, 0);. 
4740: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4750: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  ddOp(v, OP_NotFo
4760: 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74  und, tab2, iCont
4770: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  , 0, 0);.      r
4780: 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  c = selectInnerL
4790: 6f 6f 70 28 70 50 61 72 73 65 2c 20 30 2c 20 74  oop(pParse, 0, t
47a0: 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ab1, p->pEList->
47b0: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47d0: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c      p->pOrderBy,
47e0: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
47f0: 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
4800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4810: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
4820: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
4830: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
4840: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4850: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
4860: 43 6f 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Cont, 0, 0);.   
4870: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4880: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
4890: 74 61 62 32 2c 20 30 2c 20 30 2c 20 69 42 72 65  tab2, 0, 0, iBre
48a0: 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
48b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
48c0: 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 2c  _Close, tab1, 0,
48d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
48e0: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
48f0: 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74  .        generat
4900: 65 53 6f 72 74 54 61 69 6c 28 76 2c 20 70 2d 3e  eSortTail(v, p->
4910: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
4920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4930: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
4940: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
4950: 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
4960: 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d  List );.  if( p-
4970: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
4980: 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
4990: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
49a0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
49b0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
49c0: 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c  SELECTs to the l
49d0: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66  eft and right of
49e0: 20 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74   ",.      select
49f0: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 2c 20 22  OpName(p->op), "
4a00: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
4a10: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
4a20: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c  result columns",
4a30: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
4a40: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
4a50: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61  urn 1;.  }.  pPa
4a60: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 62 61 73 65  rse->nTab = base
4a70: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
4a80: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
4a90: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69 76  code for the giv
4aa0: 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  en SELECT statem
4ab0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ent..**.** The r
4ac0: 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 72  esults are distr
4ad0: 69 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75  ibuted in variou
4ae0: 73 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67  s ways depending
4af0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65   on the.** value
4b00: 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 69 50   of eDest and iP
4b10: 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65  arm..**.**     e
4b20: 44 65 73 74 20 56 61 6c 75 65 20 20 20 20 20 20  Dest Value      
4b30: 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d   Result.**     -
4b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
4b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
4b80: 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20    SRT_Callback  
4b90: 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c    Invoke the cal
4ba0: 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72  lback for each r
4bb0: 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
4bc0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
4bd0: 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72  Mem         Stor
4be0: 65 20 66 69 72 73 74 20 72 65 73 75 6c 74 20 69  e first result i
4bf0: 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50  n memory cell iP
4c00: 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  arm.**.**     SR
4c10: 54 5f 53 65 74 20 20 20 20 20 20 20 20 20 53 74  T_Set         St
4c20: 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b  ore results as k
4c30: 65 79 73 20 6f 66 20 61 20 74 61 62 6c 65 20 77  eys of a table w
4c40: 69 74 68 20 63 75 72 73 6f 72 20 69 50 61 72 6d  ith cursor iParm
4c50: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55  .**.**     SRT_U
4c60: 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65  nion       Store
4c70: 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65   results as a ke
4c80: 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  y in a temporary
4c90: 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a   table iParm.**.
4ca0: 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70  **     SRT_Excep
4cb0: 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65  t      Remove re
4cc0: 73 75 6c 74 73 20 66 6f 72 6d 20 74 68 65 20 74  sults form the t
4cd0: 65 6d 70 6f 72 61 72 79 20 74 61 6c 62 65 20 69  emporary talbe i
4ce0: 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  Parm..**.** This
4cf0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
4d00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
4d10: 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65  rrors.  If any e
4d20: 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63  rrors are.** enc
4d30: 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61  ountered, then a
4d40: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
4d50: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c  ror message is l
4d60: 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  eft in.** pParse
4d70: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
4d80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
4d90: 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20  es NOT free the 
4da0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
4db0: 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65   passed in.  The
4dc0: 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  .** calling func
4dd0: 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f  tion needs to do
4de0: 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71   that..*/.int sq
4df0: 6c 69 74 65 53 65 6c 65 63 74 28 0a 20 20 50 61  liteSelect(.  Pa
4e00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4e10: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
4e20: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
4e30: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
4e40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
4e50: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
4e60: 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
4e70: 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20   int eDest,     
4e80: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
4e90: 66 3a 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  f: SRT_Callback 
4ea0: 4d 65 6d 20 53 65 74 20 55 6e 69 6f 6e 20 45 78  Mem Set Union Ex
4eb0: 63 65 70 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50  cept */.  int iP
4ec0: 61 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  arm             
4ed0: 20 2f 2a 20 53 61 76 65 20 72 65 73 75 6c 74 20   /* Save result 
4ee0: 69 6e 20 74 68 69 73 20 6d 65 6d 6f 72 79 20 6c  in this memory l
4ef0: 6f 63 61 74 69 6f 6e 2c 20 69 66 20 3e 3d 30 20  ocation, if >=0 
4f00: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
4f10: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
4f20: 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  fo;.  Vdbe *v;. 
4f30: 20 69 6e 74 20 69 73 41 67 67 20 3d 20 30 3b 20   int isAgg = 0; 
4f40: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
4f50: 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
4f60: 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
4f70: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
4f80: 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20  pEList;      /* 
4f90: 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 73 20 74  List of fields t
4fa0: 6f 20 65 78 74 72 61 63 74 2e 20 20 4e 55 4c 4c  o extract.  NULL
4fb0: 20 6d 65 61 6e 73 20 22 2a 22 20 2a 2f 0a 20 20   means "*" */.  
4fc0: 49 64 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  IdList *pTabList
4fd0: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
4fe0: 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
4ff0: 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
5000: 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
5010: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
5020: 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
5030: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
5040: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
5050: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
5060: 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
5070: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
5080: 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
5090: 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
50a0: 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
50b0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
50c0: 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
50d0: 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
50e0: 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
50f0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
5100: 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  isDistinct;     
5110: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
5120: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
5130: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
5140: 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b  .  int distinct;
5150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
5160: 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  le to use for th
5170: 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a  e distinct set *
5180: 2f 0a 20 20 69 6e 74 20 62 61 73 65 3b 20 20 20  /.  int base;   
5190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
51a0: 72 73 74 20 63 75 72 73 6f 72 20 61 76 61 69 6c  rst cursor avail
51b0: 61 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a  able for use */.
51c0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
51d0: 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65  s are a sequence
51e0: 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20   of queries, do 
51f0: 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73  the earlier ones
5200: 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69   first..  */.  i
5210: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
5220: 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
5230: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
5240: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b  , eDest, iParm);
5250: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
5260: 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20  local copies of 
5270: 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 66  the parameters f
5280: 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20  or this query.. 
5290: 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d   */.  pTabList =
52a0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68 65   p->pSrc;.  pWhe
52b0: 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
52c0: 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
52d0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 47 72 6f  pOrderBy;.  pGro
52e0: 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
52f0: 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
5300: 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73  p->pHaving;.  is
5310: 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
5320: 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20  Distinct;..  /* 
5330: 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
5340: 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65   value of pParse
5350: 2d 3e 6e 54 61 62 2e 20 20 52 65 73 74 6f 72 65  ->nTab.  Restore
5360: 20 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f   this value befo
5370: 72 65 0a 20 20 2a 2a 20 77 65 20 65 78 69 74 2e  re.  ** we exit.
5380: 0a 20 20 2a 2f 0a 20 20 62 61 73 65 20 3d 20 70  .  */.  base = p
5390: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 0a 20 20  Parse->nTab;..  
53a0: 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  /* .  ** Do not 
53b0: 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  even attempt to 
53c0: 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64  generate any cod
53d0: 65 20 69 66 20 77 65 20 68 61 76 65 20 61 6c 72  e if we have alr
53e0: 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65  eady seen.  ** e
53f0: 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69  rrors before thi
5400: 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
5410: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
5420: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 72 65  rse->nErr>0 ) re
5430: 74 75 72 6e 20 31 3b 0a 20 20 73 71 6c 69 74 65  turn 1;.  sqlite
5440: 50 61 72 73 65 49 6e 66 6f 52 65 73 65 74 28 70  ParseInfoReset(p
5450: 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  Parse);..  /* Lo
5460: 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
5470: 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c  e in the table l
5480: 69 73 74 20 61 6e 64 20 63 72 65 61 74 65 20 61  ist and create a
5490: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 20 20  n appropriate.  
54a0: 2a 2a 20 63 6f 6c 75 6d 6e 6c 69 73 74 20 69 6e  ** columnlist in
54b0: 20 70 45 4c 69 73 74 20 69 66 20 74 68 65 72 65   pEList if there
54c0: 20 69 73 6e 27 74 20 6f 6e 65 20 61 6c 72 65 61   isn't one alrea
54d0: 64 79 2e 20 20 28 54 68 65 20 70 61 72 73 65 72  dy.  (The parser
54e0: 20 6c 65 61 76 65 73 0a 20 20 2a 2a 20 61 20 4e   leaves.  ** a N
54f0: 55 4c 4c 20 69 6e 20 74 68 65 20 70 45 4c 69 73  ULL in the pELis
5500: 74 20 66 69 65 6c 64 20 69 66 20 74 68 65 20 53  t field if the S
5510: 51 4c 20 73 61 69 64 20 22 53 45 4c 45 43 54 20  QL said "SELECT 
5520: 2a 20 46 52 4f 4d 20 2e 2e 2e 22 29 0a 20 20 2a  * FROM ...").  *
5530: 2f 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f  /.  if( fillInCo
5540: 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c  lumnList(pParse,
5550: 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   p) ){.    retur
5560: 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 45 4c 69 73  n 1;.  }.  pELis
5570: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a  t = p->pEList;..
5580: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
5590: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
55a0: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 44  to use for the D
55b0: 49 53 54 49 4e 43 54 20 73 65 74 2c 20 69 66 0a  ISTINCT set, if.
55c0: 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 20    ** necessary. 
55d0: 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f   This must be do
55e0: 6e 65 20 65 61 72 6c 79 20 74 6f 20 61 6c 6c 6f  ne early to allo
55f0: 63 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20  cate the cursor 
5600: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 6e 79 20  before.  ** any 
5610: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 45  calls to sqliteE
5620: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 29 2e  xprResolveIds().
5630: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69  .  */.  if( isDi
5640: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 64 69  stinct ){.    di
5650: 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
5660: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65  >nTab++;.  }else
5670: 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  {.    distinct =
5680: 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
5690: 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d  f writing to mem
56a0: 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e  ory or generatin
56b0: 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c  g a set.  ** onl
56c0: 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  y a single colum
56d0: 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e  n may be output.
56e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 44 65  .  */.  if( (eDe
56f0: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
5700: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 26  Dest==SRT_Set) &
5710: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
5720: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  1 ){.    sqliteS
5730: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
5740: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6f 6e 6c 79  ->zErrMsg, "only
5750: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
5760: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20   allowed for ". 
5770: 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20        "a SELECT 
5780: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
5790: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 2c 20  an expression", 
57a0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
57b0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
57c0: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
57d0: 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f  ORDER BY is igno
57e0: 72 65 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f  red if we are no
57f0: 74 20 73 65 6e 64 69 6e 67 20 74 68 65 20 72 65  t sending the re
5800: 73 75 6c 74 20 74 6f 20 61 20 63 61 6c 6c 62 61  sult to a callba
5810: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ck..  */.  if( e
5820: 44 65 73 74 21 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest!=SRT_Callba
5830: 63 6b 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72  ck ){.    pOrder
5840: 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  By = 0;.  }..  /
5850: 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f  * Allocate curso
5860: 72 73 20 66 6f 72 20 22 65 78 70 72 20 49 4e 20  rs for "expr IN 
5870: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
5880: 6e 73 74 72 75 63 74 73 2e 0a 20 20 2a 2f 0a 20  nstructs..  */. 
5890: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
58a0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
58b0: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 52  .    sqliteExprR
58c0: 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28 70  esolveInSelect(p
58d0: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
58e0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [i].pExpr);.  }.
58f0: 20 20 69 66 28 20 70 57 68 65 72 65 20 29 20 73    if( pWhere ) s
5900: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
5910: 49 6e 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  InSelect(pParse,
5920: 20 70 57 68 65 72 65 29 3b 0a 20 20 69 66 28 20   pWhere);.  if( 
5930: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
5940: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
5950: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
5960: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
5970: 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63  prResolveInSelec
5980: 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  t(pParse, pOrder
5990: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
59a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
59b0: 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
59c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f   for(i=0; i<pGro
59d0: 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
59e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  ){.      sqliteE
59f0: 78 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65  xprResolveInSele
5a00: 63 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  ct(pParse, pGrou
5a10: 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  pBy->a[i].pExpr)
5a20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
5a30: 28 20 70 48 61 76 69 6e 67 20 29 20 73 71 6c 69  ( pHaving ) sqli
5a40: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 6e 53  teExprResolveInS
5a50: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 48  elect(pParse, pH
5a60: 61 76 69 6e 67 29 3b 0a 0a 20 20 2f 2a 20 41 74  aving);..  /* At
5a70: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
5a80: 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 6c 6f  should have allo
5a90: 63 61 74 65 64 20 61 6c 6c 20 74 68 65 20 63 75  cated all the cu
5aa0: 72 73 6f 72 73 20 74 68 61 74 20 77 65 0a 20 20  rsors that we.  
5ab0: 2a 2a 20 6e 65 65 64 20 74 6f 20 68 61 6e 64 6c  ** need to handl
5ac0: 65 20 73 75 62 71 75 65 72 79 73 20 61 6e 64 20  e subquerys and 
5ad0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
5ae0: 2e 20 20 46 72 6f 6d 20 68 65 72 65 20 6f 6e 20  .  From here on 
5af0: 77 65 0a 20 20 2a 2a 20 61 72 65 20 63 6f 6d 6d  we.  ** are comm
5b00: 69 74 74 65 64 20 74 6f 20 6b 65 65 70 69 6e 67  itted to keeping
5b10: 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
5b20: 66 6f 72 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  for pParse->nTab
5b30: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 73 6f  ..  **.  ** Reso
5b40: 6c 76 65 20 74 68 65 20 66 69 65 6c 64 20 6e 61  lve the field na
5b50: 6d 65 73 20 61 6e 64 20 64 6f 20 61 20 73 65 6d  mes and do a sem
5b60: 61 6e 74 69 63 73 20 63 68 65 63 6b 20 6f 6e 20  antics check on 
5b70: 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69  all the expressi
5b80: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ons..  */.  for(
5b90: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
5ba0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
5bb0: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65  if( sqliteExprRe
5bc0: 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
5bd0: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
5be0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
5bf0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
5c00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5c10: 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
5c20: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
5c30: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 31 2c 20 26  a[i].pExpr, 1, &
5c40: 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20  isAgg) ){.      
5c50: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
5c60: 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65 72 65    }.  if( pWhere
5c70: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
5c80: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  teExprResolveIds
5c90: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
5ca0: 74 2c 20 70 57 68 65 72 65 29 20 29 7b 0a 20 20  t, pWhere) ){.  
5cb0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
5cc0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
5cd0: 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
5ce0: 73 65 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30  se, pWhere, 0, 0
5cf0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
5d00: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
5d10: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
5d20: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
5d30: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
5d40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
5d50: 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79  r *pE = pOrderBy
5d60: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
5d70: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
5d80: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
5d90: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
5da0: 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  E) ){.        re
5db0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
5dc0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5dd0: 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
5de0: 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20  , pE, isAgg, 0) 
5df0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
5e00: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
5e10: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 47 72   }.  }.  if( pGr
5e20: 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 66 6f 72  oupBy ){.    for
5e30: 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79  (i=0; i<pGroupBy
5e40: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
5e50: 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
5e60: 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70  pGroupBy->a[i].p
5e70: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
5e80: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
5e90: 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61  eIds(pParse, pTa
5ea0: 62 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20  bList, pE) ){.  
5eb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
5ec0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
5ed0: 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63  ( sqliteExprChec
5ee0: 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73  k(pParse, pE, is
5ef0: 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  Agg, 0) ){.     
5f00: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
5f10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
5f20: 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
5f30: 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
5f40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
5f50: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
5f60: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
5f70: 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
5f80: 65 20 69 73 20 72 65 71 75 69 72 65 64 20 22 0a  e is required ".
5f90: 20 20 20 20 20 20 20 20 20 22 62 65 66 6f 72 65           "before
5fa0: 20 48 41 56 49 4e 47 22 2c 20 30 29 3b 0a 20 20   HAVING", 0);.  
5fb0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
5fc0: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
5fd0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
5fe0: 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  ( sqliteExprReso
5ff0: 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
6000: 54 61 62 4c 69 73 74 2c 20 70 48 61 76 69 6e 67  TabList, pHaving
6010: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
6020: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
6030: 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
6040: 63 6b 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  ck(pParse, pHavi
6050: 6e 67 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b  ng, isAgg, 0) ){
6060: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
6070: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
6080: 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20   Do an analysis 
6090: 6f 66 20 61 67 67 72 65 67 61 74 65 20 65 78 70  of aggregate exp
60a0: 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
60b0: 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
60c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
60d0: 2d 3e 6e 41 67 67 3d 3d 30 20 26 26 20 70 50 61  ->nAgg==0 && pPa
60e0: 72 73 65 2d 3e 69 41 67 67 43 6f 75 6e 74 3c 30  rse->iAggCount<0
60f0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
6100: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
6110: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
6120: 28 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c  ( sqliteExprAnal
6130: 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50  yzeAggregates(pP
6140: 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
6150: 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
6160: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
6170: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6180: 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
6190: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
61a0: 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  i<pGroupBy->nExp
61b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
61c0: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 41   if( sqliteExprA
61d0: 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
61e0: 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
61f0: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  y->a[i].pExpr) )
6200: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
6210: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
6220: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6230: 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 26 26    if( pHaving &&
6240: 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79   sqliteExprAnaly
6250: 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61  zeAggregates(pPa
6260: 72 73 65 2c 20 70 48 61 76 69 6e 67 29 20 29 7b  rse, pHaving) ){
6270: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
6280: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
6290: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
62a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
62b0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
62c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
62d0: 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65  qliteExprAnalyze
62e0: 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73  Aggregates(pPars
62f0: 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
6300: 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
6310: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
6320: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6330: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
6340: 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
6350: 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng code..  */.  
6360: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
6370: 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  e;.  if( v==0 ){
6380: 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d  .    v = pParse-
6390: 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 56  >pVdbe = sqliteV
63a0: 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65  dbeCreate(pParse
63b0: 2d 3e 64 62 2d 3e 70 42 65 29 3b 0a 20 20 7d 0a  ->db->pBe);.  }.
63c0: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
63d0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
63e0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
63f0: 73 67 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  sg, "out of memo
6400: 72 79 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ry", 0);.    pPa
6410: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
6420: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
6430: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
6440: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
6450: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4f  ddOp(v, OP_SortO
6460: 70 65 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  pen, 0, 0, 0, 0)
6470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e  ;.  }..  /* Iden
6480: 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
6490: 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20  s if we will be 
64a0: 75 73 69 6e 67 20 69 6e 20 74 68 65 20 63 61 6c  using in the cal
64b0: 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a  lback.  This.  *
64c0: 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  * step is skippe
64d0: 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
64e0: 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61  is going to a ta
64f0: 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20  ble or a memory 
6500: 63 65 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  cell..  */.  if(
6510: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
6520: 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65  back ){.    gene
6530: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
6540: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
6550: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
6560: 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 61    /* Reset the a
6570: 67 67 72 65 67 61 74 6f 72 0a 20 20 2a 2f 0a 20  ggregator.  */. 
6580: 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
6590: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
65a0: 70 28 76 2c 20 4f 50 5f 41 67 67 52 65 73 65 74  p(v, OP_AggReset
65b0: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 41 67  , 0, pParse->nAg
65c0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  g, 0, 0);.  }.. 
65d0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
65e0: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  he memory cell t
65f0: 6f 20 4e 55 4c 4c 0a 20 20 2a 2f 0a 20 20 69 66  o NULL.  */.  if
6600: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  ( eDest==SRT_Mem
6610: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
6620: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75  beAddOp(v, OP_Nu
6630: 6c 6c 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  ll, 0, 0, 0, 0);
6640: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
6650: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
6660: 6f 72 65 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30  ore, iParm, 0, 0
6670: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
6680: 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
6690: 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 69  se scan.  */.  i
66a0: 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b  f( isDistinct ){
66b0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
66c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 2c  ddOp(v, OP_Open,
66d0: 20 64 69 73 74 69 6e 63 74 2c 20 31 2c 20 30 2c   distinct, 1, 0,
66e0: 20 30 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66   0);.  }.  pWInf
66f0: 6f 20 3d 20 73 71 6c 69 74 65 57 68 65 72 65 42  o = sqliteWhereB
6700: 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
6710: 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30  bList, pWhere, 0
6720: 29 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  );.  if( pWInfo=
6730: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a  =0 ) return 1;..
6740: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
6750: 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
6760: 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 64   if we are not d
6770: 65 61 6c 69 6e 67 20 77 69 74 68 0a 20 20 2a 2a  ealing with.  **
6780: 20 61 67 67 72 65 67 61 74 65 73 0a 20 20 2a 2f   aggregates.  */
6790: 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 29 7b  .  if( !isAgg ){
67a0: 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49  .    if( selectI
67b0: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
67c0: 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70   pEList, 0, 0, p
67d0: 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63  OrderBy, distinc
67e0: 74 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  t, eDest, iParm,
67f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6800: 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f       pWInfo->iCo
6810: 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e  ntinue, pWInfo->
6820: 69 42 72 65 61 6b 29 20 29 7b 0a 20 20 20 20 20  iBreak) ){.     
6830: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
6840: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  }.  }..  /* If w
6850: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
6860: 74 68 20 61 67 67 72 65 67 61 74 65 73 2c 20 74  th aggregates, t
6870: 68 65 6e 20 74 6f 20 74 68 65 20 73 70 65 63 69  hen to the speci
6880: 61 6c 20 61 67 67 72 65 67 61 74 65 0a 20 20 2a  al aggregate.  *
6890: 2a 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 0a  * processing.  .
68a0: 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20    */.  else{.   
68b0: 20 69 6e 74 20 64 6f 46 6f 63 75 73 3b 0a 20 20   int doFocus;.  
68c0: 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
68d0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
68e0: 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
68f0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
6900: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
6910: 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
6920: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
6930: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
6940: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6950: 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 47 72   OP_MakeKey, pGr
6960: 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 30 2c  oupBy->nExpr, 0,
6970: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 6f   0, 0);.      do
6980: 46 6f 63 75 73 20 3d 20 31 3b 0a 20 20 20 20 7d  Focus = 1;.    }
6990: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 46 6f  else{.      doFo
69a0: 63 75 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  cus = 0;.      f
69b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
69c0: 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAgg; i++){.  
69d0: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
69e0: 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  e->aAgg[i].isAgg
69f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f   ){.          do
6a00: 46 6f 63 75 73 20 3d 20 31 3b 0a 20 20 20 20 20  Focus = 1;.     
6a10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6a20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6a30: 20 20 20 20 69 66 28 20 64 6f 46 6f 63 75 73 20      if( doFocus 
6a40: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6a50: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6a60: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 22  _String, 0, 0, "
6a70: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ", 0);.      }. 
6a80: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 46     }.    if( doF
6a90: 6f 63 75 73 20 29 7b 0a 20 20 20 20 20 20 69 6e  ocus ){.      in
6aa0: 74 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 56  t lbl1 = sqliteV
6ab0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
6ac0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6ad0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
6ae0: 46 6f 63 75 73 2c 20 30 2c 20 6c 62 6c 31 2c 20  Focus, 0, lbl1, 
6af0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72  0, 0);.      for
6b00: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
6b10: 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAgg; i++){.    
6b20: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
6b30: 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20  aAgg[i].isAgg ) 
6b40: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6b50: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
6b60: 28 70 50 61 72 73 65 2c 20 70 50 61 72 73 65 2d  (pParse, pParse-
6b70: 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 29 3b  >aAgg[i].pExpr);
6b80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
6b90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
6ba0: 67 67 53 65 74 2c 20 30 2c 20 69 2c 20 30 2c 20  ggSet, 0, i, 0, 
6bb0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
6bc0: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
6bd0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 31  lveLabel(v, lbl1
6be0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
6bf0: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
6c00: 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAgg; i++){.    
6c10: 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
6c20: 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20 20 20    int op;.      
6c30: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 61 41 67  if( !pParse->aAg
6c40: 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e  g[i].isAgg ) con
6c50: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 20  tinue;.      pE 
6c60: 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69  = pParse->aAgg[i
6c70: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
6c80: 66 28 20 70 45 3d 3d 30 20 29 7b 0a 20 20 20 20  f( pE==0 ){.    
6c90: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6ca0: 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 49 6e 63  dOp(v, OP_AggInc
6cb0: 72 2c 20 31 2c 20 69 2c 20 30 2c 20 30 29 3b 0a  r, 1, i, 0, 0);.
6cc0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
6cd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6ce0: 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 3d 3d  assert( pE->op==
6cf0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
6d00: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
6d10: 20 70 45 2d 3e 70 4c 69 73 74 21 3d 30 20 26 26   pE->pList!=0 &&
6d20: 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70   pE->pList->nExp
6d30: 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  r==1 );.      sq
6d40: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
6d50: 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e  rse, pE->pList->
6d60: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
6d70: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6d80: 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c  Op(v, OP_AggGet,
6d90: 20 30 2c 20 69 2c 20 30 2c 20 30 29 3b 0a 20 20   0, i, 0, 0);.  
6da0: 20 20 20 20 73 77 69 74 63 68 28 20 70 45 2d 3e      switch( pE->
6db0: 69 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 20 20  iField ){.      
6dc0: 20 20 63 61 73 65 20 46 4e 5f 4d 69 6e 3a 20 20    case FN_Min:  
6dd0: 6f 70 20 3d 20 4f 50 5f 4d 69 6e 3b 20 20 20 62  op = OP_Min;   b
6de0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
6df0: 73 65 20 46 4e 5f 4d 61 78 3a 20 20 6f 70 20 3d  se FN_Max:  op =
6e00: 20 4f 50 5f 4d 61 78 3b 20 20 20 62 72 65 61 6b   OP_Max;   break
6e10: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 46  ;.        case F
6e20: 4e 5f 41 76 67 3a 20 20 6f 70 20 3d 20 4f 50 5f  N_Avg:  op = OP_
6e30: 41 64 64 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  Add;   break;.  
6e40: 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 53 75        case FN_Su
6e50: 6d 3a 20 20 6f 70 20 3d 20 4f 50 5f 41 64 64 3b  m:  op = OP_Add;
6e60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6e70: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  }.      sqliteVd
6e80: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30  beAddOp(v, op, 0
6e90: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
6ea0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6eb0: 70 28 76 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20  p(v, OP_AggSet, 
6ec0: 30 2c 20 69 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, i, 0, 0);.   
6ed0: 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 45 6e   }.  }...  /* En
6ee0: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
6ef0: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20  can loop..  */. 
6f00: 20 73 71 6c 69 74 65 57 68 65 72 65 45 6e 64 28   sqliteWhereEnd(
6f10: 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49  pWInfo);..  /* I
6f20: 66 20 77 65 20 61 72 65 20 70 72 6f 63 65 73 73  f we are process
6f30: 69 6e 67 20 61 67 67 72 65 67 61 74 65 73 2c 20  ing aggregates, 
6f40: 77 65 20 6e 65 65 64 20 74 6f 20 73 65 74 20 75  we need to set u
6f50: 70 20 61 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a  p a second loop.
6f60: 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66    ** over all of
6f70: 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 76   the aggregate v
6f80: 61 6c 75 65 73 20 61 6e 64 20 70 72 6f 63 65 73  alues and proces
6f90: 73 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69  s them..  */.  i
6fa0: 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
6fb0: 69 6e 74 20 65 6e 64 61 67 67 20 3d 20 73 71 6c  int endagg = sql
6fc0: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
6fd0: 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 73 74 61  (v);.    int sta
6fe0: 72 74 61 67 67 3b 0a 20 20 20 20 73 74 61 72 74  rtagg;.    start
6ff0: 61 67 67 20 3d 20 73 71 6c 69 74 65 56 64 62 65  agg = sqliteVdbe
7000: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 4e  AddOp(v, OP_AggN
7010: 65 78 74 2c 20 30 2c 20 65 6e 64 61 67 67 2c 20  ext, 0, endagg, 
7020: 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  0, 0);.    pPars
7030: 65 2d 3e 75 73 65 41 67 67 20 3d 20 31 3b 0a 20  e->useAgg = 1;. 
7040: 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
7050: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
7060: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
7070: 2c 20 70 48 61 76 69 6e 67 2c 20 73 74 61 72 74  , pHaving, start
7080: 61 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  agg);.    }.    
7090: 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  if( selectInnerL
70a0: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 45 4c 69  oop(pParse, pELi
70b0: 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72  st, 0, 0, pOrder
70c0: 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44  By, distinct, eD
70d0: 65 73 74 2c 20 69 50 61 72 6d 2c 0a 20 20 20 20  est, iParm,.    
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 73 74 61 72 74 61 67 67 2c 20 65 6e 64 61 67 67  startagg, endagg
7100: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
7110: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  n 1;.    }.    s
7120: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7130: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74  , OP_Goto, 0, st
7140: 61 72 74 61 67 67 2c 20 30 2c 20 30 29 3b 0a 20  artagg, 0, 0);. 
7150: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7160: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30  Op(v, OP_Noop, 0
7170: 2c 20 30 2c 20 30 2c 20 65 6e 64 61 67 67 29 3b  , 0, 0, endagg);
7180: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65  .    pParse->use
7190: 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Agg = 0;.  }..  
71a0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
71b0: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
71c0: 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20  e, then we need 
71d0: 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75  to sort the resu
71e0: 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e  lts.  ** and sen
71f0: 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61  d them to the ca
7200: 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e  llback one by on
7210: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  e..  */.  if( pO
7220: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65  rderBy ){.    ge
7230: 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 76  nerateSortTail(v
7240: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
7250: 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
7260: 6e 54 61 62 20 3d 20 62 61 73 65 3b 0a 20 20 72  nTab = base;.  r
7270: 65 74 75 72 6e 20 30 3b 0a 7d 0a                 eturn 0;.}.