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

Artifact 4834ab68a3308871f17fe8e22d903fcdf1b42420:


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 31 35   select.c,v 1.15
0420: 20 32 30 30 30 2f 30 36 2f 30 37 20 31 34 3a 34   2000/06/07 14:4
0430: 32 3a 32 37 20 64 72 68 20 45 78 70 20 24 0a 2a  2:27 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: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30  pEList->nExpr, 0
1080: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 53 6f  , 0, 0);.    zSo
1090: 72 74 4f 72 64 65 72 20 3d 20 73 71 6c 69 74 65  rtOrder = sqlite
10a0: 4d 61 6c 6c 6f 63 28 20 70 4f 72 64 65 72 42 79  Malloc( pOrderBy
10b0: 2d 3e 6e 45 78 70 72 20 2b 20 31 20 29 3b 0a 20  ->nExpr + 1 );. 
10c0: 20 20 20 69 66 28 20 7a 53 6f 72 74 4f 72 64 65     if( zSortOrde
10d0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  r==0 ) return 1;
10e0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10f0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
1100: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 6f   i++){.      zSo
1110: 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72  rtOrder[i] = pOr
1120: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 69 64 78 20  derBy->a[i].idx 
1130: 3f 20 27 2d 27 20 3a 20 27 2b 27 3b 0a 20 20 20  ? '-' : '+';.   
1140: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
1150: 65 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  e(pParse, pOrder
1160: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
1170: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 6f 72 74  .    }.    zSort
1180: 4f 72 64 65 72 5b 70 4f 72 64 65 72 42 79 2d 3e  Order[pOrderBy->
1190: 6e 45 78 70 72 5d 20 3d 20 30 3b 0a 20 20 20 20  nExpr] = 0;.    
11a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
11b0: 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 4b 65  v, OP_SortMakeKe
11c0: 79 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  y, pOrderBy->nEx
11d0: 70 72 2c 20 30 2c 20 7a 53 6f 72 74 4f 72 64 65  pr, 0, zSortOrde
11e0: 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
11f0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
1200: 5f 53 6f 72 74 50 75 74 2c 20 30 2c 20 30 2c 20  _SortPut, 0, 0, 
1210: 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 0a  0, 0);.  }else .
1220: 0a 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f  .  /* In this mo
1230: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
1240: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
1250: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
1260: 6d 70 6f 72 61 72 79 0a 20 20 2a 2a 20 74 61 62  mporary.  ** tab
1270: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 2a 2f 0a 20  le iParm..  */. 
1280: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
1290: 55 6e 69 6f 6e 20 29 7b 0a 20 20 20 20 73 71 6c  Union ){.    sql
12a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
12b0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e  OP_MakeRecord, n
12c0: 46 69 65 6c 64 2c 20 30 2c 20 30 2c 20 30 29 3b  Field, 0, 0, 0);
12d0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
12e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
12f0: 67 2c 20 69 50 61 72 6d 2c 20 30 2c 20 22 22 2c  g, iParm, 0, "",
1300: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
1310: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
1320: 75 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c  ut, iParm, 0, 0,
1330: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 0a 0a 20   0);.  }else .. 
1340: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
1350: 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
1360: 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
1370: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
1380: 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a  t==SRT_Table ){.
1390: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
13a0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
13b0: 63 6f 72 64 2c 20 6e 46 69 65 6c 64 2c 20 30 2c  cord, nField, 0,
13c0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13d0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
13e0: 50 5f 4e 65 77 2c 20 69 50 61 72 6d 2c 20 30 2c  P_New, iParm, 0,
13f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1400: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1410: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 2c 20 30 2c  P_Pull, 1, 0, 0,
1420: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
1430: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
1440: 75 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c  ut, iParm, 0, 0,
1450: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 0a 0a 20   0);.  }else .. 
1460: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
1470: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
1480: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
1490: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a  t instead of.  *
14a0: 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65  * saving that re
14b0: 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20  cord, use it as 
14c0: 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20  a key to delete 
14d0: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20  elements from.  
14e0: 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ** the temporary
14f0: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
1500: 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
1510: 53 52 54 5f 45 78 63 65 70 74 20 29 7b 0a 20 20  SRT_Except ){.  
1520: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
1530: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
1540: 72 64 2c 20 6e 46 69 65 6c 64 2c 20 30 2c 20 30  rd, nField, 0, 0
1550: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1560: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1570: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 30  Delete, iParm, 0
1580: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 0);.  }else
1590: 20 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72   ..  /* If we ar
15a0: 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
15b0: 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
15c0: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63   (SELECT ...)" c
15d0: 6f 6e 73 74 72 75 63 74 2c 0a 20 20 2a 2a 20 74  onstruct,.  ** t
15e0: 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64  hen there should
15f0: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65   be a single ite
1600: 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
1610: 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 2a 2a   Write this.  **
1620: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
1630: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
1640: 67 75 73 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20  gus data..  */. 
1650: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
1660: 53 65 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Set ){.    asser
1670: 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t( pEList->nExpr
1680: 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==1 );.    sqlit
1690: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
16a0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 22  _String, 0, 0, "
16b0: 22 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", 0);.    sqlit
16c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
16d0: 5f 50 75 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20  _Put, iParm, 0, 
16e0: 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 0a  0, 0);.  }else .
16f0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1700: 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
1710: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
1720: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
1730: 20 74 68 65 6e 0a 20 20 2a 2a 20 73 74 6f 72 65   then.  ** store
1740: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
1750: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
1760: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
1770: 62 72 65 61 6b 20 6f 75 74 0a 20 20 2a 2a 20 6f  break out.  ** o
1780: 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
1790: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
17a0: 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20  t==SRT_Mem ){.  
17b0: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
17c0: 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
17d0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
17e0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
17f0: 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30  , iParm, 0, 0, 0
1800: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
1810: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
1820: 6f 2c 20 30 2c 20 69 42 72 65 61 6b 2c 20 30 2c  o, 0, iBreak, 0,
1830: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20   0);.  }else..  
1840: 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  /* If none of th
1850: 65 20 61 62 6f 76 65 2c 20 73 65 6e 64 20 74 68  e above, send th
1860: 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61  e data to the ca
1870: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e  llback function.
1880: 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 73 71  .  */.  {.    sq
1890: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
18a0: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 46   OP_Callback, nF
18b0: 69 65 6c 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ield, 0, 0, 0);.
18c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
18d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
18e0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
18f0: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 68   tell the VDBE h
1900: 6f 77 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  ow many columns 
1910: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 69 6e 20  there.** are in 
1920: 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20 74  the result and t
1930: 68 65 20 6e 61 6d 65 20 66 6f 72 20 65 61 63 68  he name for each
1940: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 69   column.  This i
1950: 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69 73  nformation.** is
1960: 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65   used to provide
1970: 20 22 61 72 67 63 22 20 61 6e 64 20 22 61 7a 43   "argc" and "azC
1980: 6f 6c 5b 5d 22 20 76 61 6c 75 65 73 20 69 6e 20  ol[]" values in 
1990: 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  the callback..*/
19a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
19b0: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
19c0: 28 56 64 62 65 20 2a 76 2c 20 49 64 4c 69 73 74  (Vdbe *v, IdList
19d0: 20 2a 70 54 61 62 4c 69 73 74 2c 20 45 78 70 72   *pTabList, Expr
19e0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20  List *pEList){. 
19f0: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
1a00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1a10: 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 70 45 4c  ColumnCount, pEL
1a20: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 20 30  ist->nExpr, 0, 0
1a30: 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  , 0);.  for(i=0;
1a40: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
1a50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
1a60: 20 2a 70 3b 0a 20 20 20 20 69 66 28 20 70 45 4c   *p;.    if( pEL
1a70: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
1a80: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
1a90: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
1aa0: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
1ab0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1ac0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1ad0: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c  P_ColumnName, i,
1ae0: 20 30 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20   0, zName, 0);. 
1af0: 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 30       if( zName[0
1b00: 5d 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4e 61 6d 65  ]=='\'' || zName
1b10: 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20  [0]=='"' ){.    
1b20: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65      sqliteVdbeDe
1b30: 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29  quoteP3(v, addr)
1b40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b50: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1b60: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
1b70: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
1b80: 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 46 49  if( p->op!=TK_FI
1b90: 45 4c 44 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d  ELD || pTabList=
1ba0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
1bb0: 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20   zName[30];.    
1bc0: 20 20 73 70 72 69 6e 74 66 28 7a 4e 61 6d 65 2c    sprintf(zName,
1bd0: 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31   "column%d", i+1
1be0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
1bf0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
1c00: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 2c  olumnName, i, 0,
1c10: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   zName, 0);.    
1c20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
1c30: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3e 31   pTabList->nId>1
1c40: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
1c50: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
1c60: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
1c70: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70   = pTabList->a[p
1c80: 2d 3e 69 54 61 62 6c 65 5d 2e 70 54 61 62 3b 0a  ->iTable].pTab;.
1c90: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
1ca0: 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54  ab;. .        zT
1cb0: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
1cc0: 5b 70 2d 3e 69 54 61 62 6c 65 5d 2e 7a 41 6c 69  [p->iTable].zAli
1cd0: 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  as;.        if( 
1ce0: 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d  zTab==0 ) zTab =
1cf0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
1d00: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
1d10: 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54  tring(&zName, zT
1d20: 61 62 2c 20 22 2e 22 2c 20 70 54 61 62 2d 3e 61  ab, ".", pTab->a
1d30: 43 6f 6c 5b 70 2d 3e 69 46 69 65 6c 64 5d 2e 7a  Col[p->iField].z
1d40: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
1d50: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
1d60: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61  p(v, OP_ColumnNa
1d70: 6d 65 2c 20 69 2c 20 30 2c 20 7a 4e 61 6d 65 2c  me, i, 0, zName,
1d80: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
1d90: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
1da0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1db0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
1dc0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30   = pTabList->a[0
1dd0: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ].pTab;.        
1de0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
1df0: 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 46 69 65  ab->aCol[p->iFie
1e00: 6c 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ld].zName;.     
1e10: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
1e20: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e  Op(v, OP_ColumnN
1e30: 61 6d 65 2c 20 69 2c 20 30 2c 20 7a 4e 61 6d 65  ame, i, 0, zName
1e40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1e50: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1e60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1e70: 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
1e80: 73 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20  ss a query that 
1e90: 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75 6e  is really the un
1ea0: 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73  ion.** or inters
1eb0: 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72  ection of two or
1ec0: 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71   more separate q
1ed0: 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ueries..*/.stati
1ee0: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
1ef0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
1f00: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
1f10: 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d  eDest, int iParm
1f20: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 53  ){.  int rc;.  S
1f30: 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20  elect *pPrior;. 
1f40: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
1f50: 69 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  i;..  /* Make su
1f60: 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61 6c  re we have a val
1f70: 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65 2e  id query engine.
1f80: 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74 65    If not, create
1f90: 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f   a new one..  */
1fa0: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
1fb0: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
1fc0: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
1fd0: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
1fe0: 74 65 56 64 62 65 43 72 65 61 74 65 28 70 50 61  teVdbeCreate(pPa
1ff0: 72 73 65 2d 3e 64 62 2d 3e 70 42 65 29 3b 0a 20  rse->db->pBe);. 
2000: 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b   }.  if( v==0 ){
2010: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
2020: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
2030: 72 72 4d 73 67 2c 20 22 6f 75 74 20 6f 66 20 6d  rrMsg, "out of m
2040: 65 6d 6f 72 79 22 2c 20 30 29 3b 0a 20 20 20 20  emory", 0);.    
2050: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
2060: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2070: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  }..  assert( p->
2080: 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70  pPrior!=0 );.  p
2090: 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
20a0: 72 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  r;.  switch( p->
20b0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
20c0: 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72  K_ALL: {.      r
20d0: 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74  c = sqliteSelect
20e0: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
20f0: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a   eDest, iParm);.
2100: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2110: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2120: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
2130: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2140: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
2150: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b  , eDest, iParm);
2160: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
2170: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
2180: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2190: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
21a0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e  :.    case TK_UN
21b0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
21c0: 20 75 6e 69 6f 6e 54 61 62 3b 0a 20 20 20 20 20   unionTab;.     
21d0: 20 69 6e 74 20 6f 70 3b 0a 0a 20 20 20 20 20 20   int op;..      
21e0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 55  if( eDest==SRT_U
21f0: 6e 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  nion ){.        
2200: 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d  unionTab = iParm
2210: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2220: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
2230: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2240: 3b 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  ;          .    
2250: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
2260: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20  dOp(v, OP_Open, 
2270: 75 6e 69 6f 6e 54 61 62 2c 20 31 2c 20 30 2c 20  unionTab, 1, 0, 
2280: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
2290: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
22a0: 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 75 6e 69  P_KeyAsData, uni
22b0: 6f 6e 54 61 62 2c 20 31 2c 20 30 2c 20 30 29 3b  onTab, 1, 0, 0);
22c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
22d0: 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74  c = sqliteSelect
22e0: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
22f0: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 75 6e 69 6f   SRT_Union, unio
2300: 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 69 66 28  nTab);.      if(
2310: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2320: 0a 20 20 20 20 20 20 6f 70 20 3d 20 70 2d 3e 6f  .      op = p->o
2330: 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 3f 20 53  p==TK_EXCEPT ? S
2340: 52 54 5f 45 78 63 65 70 74 20 3a 20 53 52 54 5f  RT_Except : SRT_
2350: 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 70 2d 3e  Union;.      p->
2360: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
2370: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c    rc = sqliteSel
2380: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f  ect(pParse, p, o
2390: 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20  p, unionTab);.  
23a0: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
23b0: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66  pPrior;.      if
23c0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
23d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
23e0: 74 21 3d 53 52 54 5f 55 6e 69 6f 6e 20 29 7b 0a  t!=SRT_Union ){.
23f0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
2400: 74 2c 20 69 42 72 65 61 6b 3b 0a 20 20 20 20 20  t, iBreak;.     
2410: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
2420: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
2430: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
2440: 6d 65 73 28 76 2c 20 30 2c 20 70 2d 3e 70 45 4c  mes(v, 0, p->pEL
2450: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 42  ist);.        iB
2460: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 56 64 62  reak = sqliteVdb
2470: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2480: 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
2490: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
24a0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e  , OP_Next, union
24b0: 54 61 62 2c 20 69 42 72 65 61 6b 2c 20 30 2c 20  Tab, iBreak, 0, 
24c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  0);.        rc =
24d0: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
24e0: 28 70 50 61 72 73 65 2c 20 30 2c 20 75 6e 69 6f  (pParse, 0, unio
24f0: 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  nTab, p->pEList-
2500: 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 20 20 20 20 20 30 2c 20 2d 31 2c 20 65 44 65 73       0, -1, eDes
2530: 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20  t, iParm, .     
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69          iCont, i
2560: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
2570: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2580: 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
2590: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
25a0: 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 2c  _Goto, 0, iCont,
25b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
25c0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
25d0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
25e0: 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 69 42 72  onTab, 0, 0, iBr
25f0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eak);.      }.  
2600: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2610: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
2620: 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  ERSECT: {.      
2630: 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a  int tab1, tab2;.
2640: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
2650: 20 69 42 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20   iBreak;..      
2660: 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
2670: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62  Tab++;.      tab
2680: 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  2 = pParse->nTab
2690: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
26a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
26b0: 4f 70 65 6e 2c 20 74 61 62 31 2c 20 31 2c 20 30  Open, tab1, 1, 0
26c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
26d0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
26e0: 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62  P_KeyAsData, tab
26f0: 31 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 20  1, 1, 0, 0);.   
2700: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65     rc = sqliteSe
2710: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
2720: 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  ior, SRT_Union, 
2730: 74 61 62 31 29 3b 0a 20 20 20 20 20 20 69 66 28  tab1);.      if(
2740: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
2760: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
2770: 6e 2c 20 74 61 62 32 2c 20 31 2c 20 30 2c 20 30  n, tab2, 1, 0, 0
2780: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
2790: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b  dbeAddOp(v, OP_K
27a0: 65 79 41 73 44 61 74 61 2c 20 74 61 62 32 2c 20  eyAsData, tab2, 
27b0: 31 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  1, 0, 0);.      
27c0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
27d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27e0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
27f0: 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
2800: 32 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  2);.      p->pPr
2810: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
2820: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2830: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 61 73  urn rc;.      as
2840: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
2850: 29 3b 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74  );.      generat
2860: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20  eColumnNames(v, 
2870: 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  0, p->pEList);. 
2880: 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
2890: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
28a0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
28b0: 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  t = sqliteVdbeAd
28c0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
28d0: 74 61 62 31 2c 20 69 42 72 65 61 6b 2c 20 30 2c  tab1, iBreak, 0,
28e0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
28f0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
2900: 5f 4b 65 79 2c 20 74 61 62 31 2c 20 30 2c 20 30  _Key, tab1, 0, 0
2910: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
2920: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
2930: 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32  P_NotFound, tab2
2940: 2c 20 69 43 6f 6e 74 2c 20 30 2c 20 30 29 3b 0a  , iCont, 0, 0);.
2950: 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63        rc = selec
2960: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
2970: 65 2c 20 30 2c 20 74 61 62 31 2c 20 70 2d 3e 70  e, 0, tab1, p->p
2980: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 2d 31             0, -1
29b0: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
29c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
29e0: 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
29f0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2a00: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  urn 1;.      sql
2a10: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
2a20: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
2a30: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
2a40: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
2a50: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
2a60: 32 2c 20 30 2c 20 30 2c 20 69 42 72 65 61 6b 29  2, 0, 0, iBreak)
2a70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
2a80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
2a90: 6f 73 65 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c  ose, tab1, 0, 0,
2aa0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
2ab0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
2ac0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
2ad0: 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  && pPrior->pELis
2ae0: 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45  t );.  if( p->pE
2af0: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72  List->nExpr!=pPr
2b00: 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ior->pEList->nEx
2b10: 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
2b20: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
2b30: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 53 45 4c  e->zErrMsg, "SEL
2b40: 45 43 54 73 20 68 61 76 65 20 64 69 66 66 65 72  ECTs have differ
2b50: 65 6e 74 20 6e 75 6d 62 65 72 73 20 22 0a 20 20  ent numbers ".  
2b60: 20 20 20 20 20 22 6f 66 20 63 6f 6c 75 6d 6e 73       "of columns
2b70: 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 63   and therefore c
2b80: 61 6e 6e 6f 74 20 62 65 20 6a 6f 69 6e 65 64 22  annot be joined"
2b90: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
2ba0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
2bb0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
2bc0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2bd0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
2be0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c  or the given SEL
2bf0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
2c00: 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
2c10: 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64   are distributed
2c20: 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73   in various ways
2c30: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
2c40: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65 44  e.** value of eD
2c50: 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a 2a  est and iParm..*
2c60: 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74 20 56  *.**     eDest V
2c70: 61 6c 75 65 20 20 20 20 20 20 20 52 65 73 75 6c  alue       Resul
2c80: 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  t.**     -------
2c90: 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
2ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cc0: 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ----.**     SRT_
2cd0: 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f  Callback    Invo
2ce0: 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ke the callback 
2cf0: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20  for each row of 
2d00: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
2d10: 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20  *     SRT_Mem   
2d20: 20 20 20 20 20 20 53 74 6f 72 65 20 66 69 72 73        Store firs
2d30: 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f  t result in memo
2d40: 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a  ry cell iParm.**
2d50: 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20  .**     SRT_Set 
2d60: 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65          Store re
2d70: 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66  sults as keys of
2d80: 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 63 75   a table with cu
2d90: 72 73 6f 72 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  rsor iParm.**.**
2da0: 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20       SRT_Union  
2db0: 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
2dc0: 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61  ts as a key in a
2dd0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
2de0: 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20   iParm.**.**    
2df0: 20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20   SRT_Except     
2e00: 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20   Remove results 
2e10: 66 6f 72 6d 20 74 68 65 20 74 65 6d 70 6f 72 61  form the tempora
2e20: 72 79 20 74 61 6c 62 65 20 69 50 61 72 6d 2e 0a  ry talbe iParm..
2e30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2e40: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
2e50: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
2e60: 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20    If any errors 
2e70: 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72  are.** encounter
2e80: 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72  ed, then an appr
2e90: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65  opriate error me
2ea0: 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e  ssage is left in
2eb0: 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72  .** pParse->zErr
2ec0: 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Msg..**.** This 
2ed0: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54  routine does NOT
2ee0: 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74   free the Select
2ef0: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
2f00: 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61  d in.  The.** ca
2f10: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  lling function n
2f20: 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e  eeds to do that.
2f30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 53 65  .*/.int sqliteSe
2f40: 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
2f50: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
2f60: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
2f70: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
2f80: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2f90: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
2fa0: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
2fb0: 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65  oded. */.  int e
2fc0: 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Dest,           
2fd0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 3a 20 53 52 54    /* One of: SRT
2fe0: 5f 43 61 6c 6c 62 61 63 6b 20 4d 65 6d 20 53 65  _Callback Mem Se
2ff0: 74 20 55 6e 69 6f 6e 20 45 78 63 65 70 74 20 2a  t Union Except *
3000: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 20 20  /.  int iParm   
3010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61             /* Sa
3020: 76 65 20 72 65 73 75 6c 74 20 69 6e 20 74 68 69  ve result in thi
3030: 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
3040: 6e 2c 20 69 66 20 3e 3d 30 20 2a 2f 0a 29 7b 0a  n, if >=0 */.){.
3050: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 57 68    int i, j;.  Wh
3060: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
3070: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
3080: 74 20 69 73 41 67 67 20 3d 20 30 3b 20 20 20 20  t isAgg = 0;    
3090: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
30a0: 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
30b0: 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
30c0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
30d0: 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist;      /* Lis
30e0: 74 20 6f 66 20 66 69 65 6c 64 73 20 74 6f 20 65  t of fields to e
30f0: 78 74 72 61 63 74 2e 20 20 4e 55 4c 4c 20 6d 65  xtract.  NULL me
3100: 61 6e 73 20 22 2a 22 20 2a 2f 0a 20 20 49 64 4c  ans "*" */.  IdL
3110: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
3120: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
3130: 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
3140: 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
3150: 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
3160: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
3170: 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
3180: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
3190: 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f   *pOrderBy;    /
31a0: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
31b0: 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
31c0: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
31d0: 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
31e0: 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
31f0: 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
3200: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
3210: 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20  pHaving;        
3220: 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63   /* The HAVING c
3230: 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
3240: 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  ULL */.  int isD
3250: 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
3260: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
3270: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
3280: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
3290: 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20  int distinct;   
32a0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
32b0: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
32c0: 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 0a  istinct set */..
32d0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
32e0: 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20   are a sequence 
32f0: 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74  of queries, do t
3300: 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20  he earlier ones 
3310: 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  first..  */.  if
3320: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
3330: 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
3340: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
3350: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a   eDest, iParm);.
3360: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c    }..  /* Make l
3370: 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74  ocal copies of t
3380: 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f  he parameters fo
3390: 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20  r this query..  
33a0: 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
33b0: 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54 61 62 4c  >pEList;.  pTabL
33c0: 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
33d0: 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
33e0: 65 72 65 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  ere;.  pOrderBy 
33f0: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
3400: 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
3410: 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69  GroupBy;.  pHavi
3420: 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
3430: 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20  .  isDistinct = 
3440: 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a  p->isDistinct;..
3450: 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f    /* .  ** Do no
3460: 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74  t even attempt t
3470: 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63  o generate any c
3480: 6f 64 65 20 69 66 20 77 65 20 68 61 76 65 20 61  ode if we have a
3490: 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a  lready seen.  **
34a0: 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74   errors before t
34b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
34c0: 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ts..  */.  if( p
34d0: 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20  Parse->nErr>0 ) 
34e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
34f0: 74 65 50 61 72 73 65 49 6e 66 6f 52 65 73 65 74  teParseInfoReset
3500: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20  (pParse);..  /* 
3510: 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61  Look up every ta
3520: 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ble in the table
3530: 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f   list..  */.  fo
3540: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
3550: 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
3560: 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
3570: 2e 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69  .pTab = sqliteFi
3580: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
3590: 64 62 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  db, pTabList->a[
35a0: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  i].zName);.    i
35b0: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  f( pTabList->a[i
35c0: 5d 2e 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ].pTab==0 ){.   
35d0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
35e0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
35f0: 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  Msg, "no such ta
3600: 62 6c 65 3a 20 22 2c 20 0a 20 20 20 20 20 20 20  ble: ", .       
3610: 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
3620: 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  .zName, 0);.    
3630: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
3640: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
3650: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
3660: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 74 65 6d  * Allocate a tem
3670: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
3680: 75 73 65 20 66 6f 72 20 74 68 65 20 44 49 53 54  use for the DIST
3690: 49 4e 43 54 20 73 65 74 2c 20 69 66 0a 20 20 2a  INCT set, if.  *
36a0: 2a 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  * necessary.  Th
36b0: 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20  is must be done 
36c0: 65 61 72 6c 79 20 74 6f 20 61 6c 6c 6f 63 61 74  early to allocat
36d0: 65 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 66  e the cursor bef
36e0: 6f 72 65 0a 20 20 2a 2a 20 61 6e 79 20 63 61 6c  ore.  ** any cal
36f0: 6c 73 20 74 6f 20 73 71 6c 69 74 65 45 78 70 72  ls to sqliteExpr
3700: 52 65 73 6f 6c 76 65 49 64 73 28 29 2e 0a 20 20  ResolveIds()..  
3710: 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69  */.  if( isDisti
3720: 6e 63 74 20 29 7b 0a 20 20 20 20 64 69 73 74 69  nct ){.    disti
3730: 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
3740: 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ab++;.  }else{. 
3750: 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31     distinct = -1
3760: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
3770: 68 65 20 6c 69 73 74 20 6f 66 20 66 69 65 6c 64  he list of field
3780: 73 20 74 6f 20 72 65 74 72 69 65 76 65 20 69 73  s to retrieve is
3790: 20 22 2a 22 20 74 68 65 6e 20 72 65 70 6c 61 63   "*" then replac
37a0: 65 20 69 74 20 77 69 74 68 0a 20 20 2a 2a 20 61  e it with.  ** a
37b0: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 66 69 65   list of all fie
37c0: 6c 64 73 20 66 72 6f 6d 20 61 6c 6c 20 74 61 62  lds from all tab
37d0: 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
37e0: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
37f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
3800: 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
3810: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
3820: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
3830: 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [i].pTab;.      
3840: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
3850: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
3860: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
3870: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
3880: 5f 46 49 45 4c 44 2c 20 30 2c 20 30 2c 20 30 29  _FIELD, 0, 0, 0)
3890: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
38a0: 3e 69 54 61 62 6c 65 20 3d 20 69 20 2b 20 70 50  >iTable = i + pP
38b0: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20  arse->nTab;.    
38c0: 20 20 20 20 70 45 78 70 72 2d 3e 69 46 69 65 6c      pExpr->iFiel
38d0: 64 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 70  d = j;.        p
38e0: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  ->pEList = pELis
38f0: 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69  t = sqliteExprLi
3900: 73 74 41 70 70 65 6e 64 28 70 45 4c 69 73 74 2c  stAppend(pEList,
3910: 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
3920: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
3930: 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74   /* If writing t
3940: 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65  o memory or gene
3950: 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a  rating a set.  *
3960: 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
3970: 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75  column may be ou
3980: 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tput..  */.  if(
3990: 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d   (eDest==SRT_Mem
39a0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53   || eDest==SRT_S
39b0: 65 74 29 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  et) && pEList->n
39c0: 45 78 70 72 3e 31 20 29 7b 0a 20 20 20 20 73 71  Expr>1 ){.    sq
39d0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
39e0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
39f0: 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72  "only a single r
3a00: 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f  esult allowed fo
3a10: 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45  r ".       "a SE
3a20: 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72  LECT that is par
3a30: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
3a40: 6f 6e 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  on", 0);.    pPa
3a50: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
3a60: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
3a70: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73    /* ORDER BY is
3a80: 20 69 67 6e 6f 72 65 64 20 69 66 20 77 65 20 61   ignored if we a
3a90: 72 65 20 6e 6f 74 20 73 65 6e 64 69 6e 67 20 74  re not sending t
3aa0: 68 65 20 72 65 73 75 6c 74 20 74 6f 20 61 20 63  he result to a c
3ab0: 61 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  allback..  */.  
3ac0: 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 43  if( eDest!=SRT_C
3ad0: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 70  allback ){.    p
3ae0: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
3af0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
3b00: 63 75 72 73 6f 72 73 20 66 6f 72 20 22 65 78 70  cursors for "exp
3b10: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
3b20: 29 22 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 20  )" constructs.. 
3b30: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
3b40: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
3b50: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
3b60: 45 78 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c  ExprResolveInSel
3b70: 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ect(pParse, pELi
3b80: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
3b90: 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65 72  .  }.  if( pWher
3ba0: 65 20 29 20 73 71 6c 69 74 65 45 78 70 72 52 65  e ) sqliteExprRe
3bb0: 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28 70 50  solveInSelect(pP
3bc0: 61 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  arse, pWhere);. 
3bd0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
3be0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3bf0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
3c00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
3c10: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 6e  iteExprResolveIn
3c20: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
3c30: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
3c40: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
3c50: 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
3c60: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
3c70: 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
3c80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
3c90: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
3ca0: 6e 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  nSelect(pParse, 
3cb0: 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70  pGroupBy->a[i].p
3cc0: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
3cd0: 0a 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29  .  if( pHaving )
3ce0: 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
3cf0: 76 65 49 6e 53 65 6c 65 63 74 28 70 50 61 72 73  veInSelect(pPars
3d00: 65 2c 20 70 48 61 76 69 6e 67 29 3b 0a 0a 20 20  e, pHaving);..  
3d10: 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 66  /* Resolve the f
3d20: 69 65 6c 64 20 6e 61 6d 65 73 20 61 6e 64 20 64  ield names and d
3d30: 6f 20 61 20 73 65 6d 61 6e 74 69 63 73 20 63 68  o a semantics ch
3d40: 65 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 65 20 65  eck on all the e
3d50: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
3d60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
3d70: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
3d80: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
3d90: 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
3da0: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
3db0: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
3dc0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 72  Expr) ){.      r
3dd0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
3de0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
3df0: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
3e00: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
3e10: 72 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29 7b  r, 1, &isAgg) ){
3e20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
3e30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
3e40: 20 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 69   pWhere ){.    i
3e50: 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  f( sqliteExprRes
3e60: 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
3e70: 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
3e80: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
3e90: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
3ea0: 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
3eb0: 63 6b 28 70 50 61 72 73 65 2c 20 70 57 68 65 72  ck(pParse, pWher
3ec0: 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  e, 0, 0) ){.    
3ed0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3ee0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 72 64  }.  }.  if( pOrd
3ef0: 65 72 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28  erBy ){.    for(
3f00: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
3f10: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
3f20: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
3f30: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
3f40: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73  xpr;.      if( s
3f50: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
3f60: 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  Ids(pParse, pTab
3f70: 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20  List, pE) ){.   
3f80: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
3f90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
3fa0: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
3fb0: 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73 41  (pParse, pE, isA
3fc0: 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  gg, 0) ){.      
3fd0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3fe0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
3ff0: 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
4000: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4010: 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
4020: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
4030: 20 2a 70 45 20 3d 20 70 47 72 6f 75 70 42 79 2d   *pE = pGroupBy-
4040: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
4050: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
4060: 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
4070: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
4080: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
4090: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
40a0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
40b0: 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
40c0: 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29   pE, isAgg, 0) )
40d0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
40e0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
40f0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 48 61 76  }.  }.  if( pHav
4100: 69 6e 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ing ){.    if( p
4110: 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
4120: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
4130: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
4140: 72 4d 73 67 2c 20 22 61 20 47 52 4f 55 50 20 42  rMsg, "a GROUP B
4150: 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75  Y clause is requ
4160: 69 72 65 64 20 22 0a 20 20 20 20 20 20 20 20 20  ired ".         
4170: 22 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22 2c  "before HAVING",
4180: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
4190: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
41a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
41b0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
41c0: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
41d0: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
41e0: 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20  pHaving) ){.    
41f0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
4200: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
4210: 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
4220: 2c 20 70 48 61 76 69 6e 67 2c 20 69 73 41 67 67  , pHaving, isAgg
4230: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  , 0) ){.      re
4240: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
4250: 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e 20 61 6e  }..  /* Do an an
4260: 61 6c 79 73 69 73 20 6f 66 20 61 67 67 72 65 67  alysis of aggreg
4270: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  ate expressions.
4280: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67  .  */.  if( isAg
4290: 67 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  g ){.    for(i=0
42a0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
42b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
42c0: 66 28 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61  f( sqliteExprAna
42d0: 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
42e0: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
42f0: 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
4300: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
4310: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4320: 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
4330: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
4340: 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
4350: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
4360: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
4370: 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
4380: 73 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  s(pParse, pGroup
4390: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  By->a[i].pExpr) 
43a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
43b0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
43c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
43d0: 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 26     if( pHaving &
43e0: 26 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c  & sqliteExprAnal
43f0: 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50  yzeAggregates(pP
4400: 61 72 73 65 2c 20 70 48 61 76 69 6e 67 29 20 29  arse, pHaving) )
4410: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
4420: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
4430: 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
4440: 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng code..  */.  
4450: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
4460: 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  e;.  if( v==0 ){
4470: 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d  .    v = pParse-
4480: 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 56  >pVdbe = sqliteV
4490: 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65  dbeCreate(pParse
44a0: 2d 3e 64 62 2d 3e 70 42 65 29 3b 0a 20 20 7d 0a  ->db->pBe);.  }.
44b0: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
44c0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
44d0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
44e0: 73 67 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  sg, "out of memo
44f0: 72 79 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ry", 0);.    pPa
4500: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
4510: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
4520: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
4530: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
4540: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4f  ddOp(v, OP_SortO
4550: 70 65 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  pen, 0, 0, 0, 0)
4560: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e  ;.  }..  /* Iden
4570: 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
4580: 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20  s if we will be 
4590: 75 73 69 6e 67 20 69 6e 20 74 68 65 20 63 61 6c  using in the cal
45a0: 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a  lback.  This.  *
45b0: 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  * step is skippe
45c0: 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
45d0: 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61  is going to a ta
45e0: 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20  ble or a memory 
45f0: 63 65 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  cell..  */.  if(
4600: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
4610: 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65  back ){.    gene
4620: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
4630: 76 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  v, pTabList, pEL
4640: 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
4650: 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
4660: 61 74 6f 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ator.  */.  if( 
4670: 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 71 6c  isAgg ){.    sql
4680: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4690: 4f 50 5f 41 67 67 52 65 73 65 74 2c 20 30 2c 20  OP_AggReset, 0, 
46a0: 70 50 61 72 73 65 2d 3e 6e 41 67 67 2c 20 30 2c  pParse->nAgg, 0,
46b0: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   0);.  }..  /* I
46c0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
46d0: 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c  mory cell to NUL
46e0: 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  L.  */.  if( eDe
46f0: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20  st==SRT_Mem ){. 
4700: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4710: 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  Op(v, OP_Null, 0
4720: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
4730: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4740: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
4750: 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 29 3b  iParm, 0, 0, 0);
4760: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
4770: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
4780: 61 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  an.  */.  if( is
4790: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
47a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
47b0: 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20 64 69 73 74  v, OP_Open, dist
47c0: 69 6e 63 74 2c 20 31 2c 20 30 2c 20 30 29 3b 0a  inct, 1, 0, 0);.
47d0: 20 20 7d 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73    }.  pWInfo = s
47e0: 71 6c 69 74 65 57 68 65 72 65 42 65 67 69 6e 28  qliteWhereBegin(
47f0: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
4800: 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  , pWhere, 0);.  
4810: 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
4820: 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20  return 1;..  /* 
4830: 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  Use the standard
4840: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20 77   inner loop if w
4850: 65 20 61 72 65 20 6e 6f 74 20 64 65 61 6c 69 6e  e are not dealin
4860: 67 20 77 69 74 68 0a 20 20 2a 2a 20 61 67 67 72  g with.  ** aggr
4870: 65 67 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66  egates.  */.  if
4880: 28 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20  ( !isAgg ){.    
4890: 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  if( selectInnerL
48a0: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 45 4c 69  oop(pParse, pELi
48b0: 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72  st, 0, 0, pOrder
48c0: 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44  By, distinct, eD
48d0: 65 73 74 2c 20 69 50 61 72 6d 2c 0a 20 20 20 20  est, iParm,.    
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48f0: 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
4900: 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
4910: 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74  k) ){.       ret
4920: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
4930: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
4940: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 67   dealing with ag
4950: 67 72 65 67 61 74 65 73 2c 20 74 68 65 6e 20 74  gregates, then t
4960: 6f 20 74 68 65 20 73 70 65 63 69 61 6c 20 61 67  o the special ag
4970: 67 72 65 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f  gregate.  ** pro
4980: 63 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a  cessing.  .  */.
4990: 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20    else{.    int 
49a0: 64 6f 46 6f 63 75 73 3b 0a 20 20 20 20 69 66 28  doFocus;.    if(
49b0: 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
49c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47     for(i=0; i<pG
49d0: 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
49e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
49f0: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
4a00: 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
4a10: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
4a20: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
4a30: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
4a40: 61 6b 65 4b 65 79 2c 20 70 47 72 6f 75 70 42 79  akeKey, pGroupBy
4a50: 2d 3e 6e 45 78 70 72 2c 20 30 2c 20 30 2c 20 30  ->nExpr, 0, 0, 0
4a60: 29 3b 0a 20 20 20 20 20 20 64 6f 46 6f 63 75 73  );.      doFocus
4a70: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
4a80: 0a 20 20 20 20 20 20 64 6f 46 6f 63 75 73 20 3d  .      doFocus =
4a90: 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   0;.      for(i=
4aa0: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67  0; i<pParse->nAg
4ab0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
4ac0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 61 41   if( !pParse->aA
4ad0: 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 7b 0a 20  gg[i].isAgg ){. 
4ae0: 20 20 20 20 20 20 20 20 20 64 6f 46 6f 63 75 73           doFocus
4af0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
4b00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4b10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4b20: 66 28 20 64 6f 46 6f 63 75 73 20 29 7b 0a 20 20  f( doFocus ){.  
4b30: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4b40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
4b50: 6e 67 2c 20 30 2c 20 30 2c 20 22 22 2c 20 30 29  ng, 0, 0, "", 0)
4b60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4b70: 20 20 20 20 69 66 28 20 64 6f 46 6f 63 75 73 20      if( doFocus 
4b80: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c  ){.      int lbl
4b90: 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  1 = sqliteVdbeMa
4ba0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
4bb0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4bc0: 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73  p(v, OP_AggFocus
4bd0: 2c 20 30 2c 20 6c 62 6c 31 2c 20 30 2c 20 30 29  , 0, lbl1, 0, 0)
4be0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
4bf0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
4c00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
4c10: 66 28 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  f( pParse->aAgg[
4c20: 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69  i].isAgg ) conti
4c30: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nue;.        sql
4c40: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
4c50: 73 65 2c 20 70 50 61 72 73 65 2d 3e 61 41 67 67  se, pParse->aAgg
4c60: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
4c70: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4c80: 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 53 65 74  dOp(v, OP_AggSet
4c90: 2c 20 30 2c 20 69 2c 20 30 2c 20 30 29 3b 0a 20  , 0, i, 0, 0);. 
4ca0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
4cb0: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
4cc0: 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20  bel(v, lbl1);.  
4cd0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
4ce0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
4cf0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
4d00: 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e 74  r *pE;.      int
4d10: 20 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 21   op;.      if( !
4d20: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
4d30: 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65  isAgg ) continue
4d40: 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 50 61  ;.      pE = pPa
4d50: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78  rse->aAgg[i].pEx
4d60: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
4d70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
4d80: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4d90: 2c 20 4f 50 5f 41 67 67 49 6e 63 72 2c 20 31 2c  , OP_AggIncr, 1,
4da0: 20 69 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   i, 0, 0);.     
4db0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
4dc0: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
4dd0: 74 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  t( pE->op==TK_AG
4de0: 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
4df0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
4e00: 70 4c 69 73 74 21 3d 30 20 26 26 20 70 45 2d 3e  pList!=0 && pE->
4e10: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20  pList->nExpr==1 
4e20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  );.      sqliteE
4e30: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
4e40: 70 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pE->pList->a[0].
4e50: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
4e60: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4e70: 20 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c 20 69   OP_AggGet, 0, i
4e80: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
4e90: 77 69 74 63 68 28 20 70 45 2d 3e 69 46 69 65 6c  witch( pE->iFiel
4ea0: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  d ){.        cas
4eb0: 65 20 46 4e 5f 4d 69 6e 3a 20 20 6f 70 20 3d 20  e FN_Min:  op = 
4ec0: 4f 50 5f 4d 69 6e 3b 20 20 20 62 72 65 61 6b 3b  OP_Min;   break;
4ed0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e  .        case FN
4ee0: 5f 4d 61 78 3a 20 20 6f 70 20 3d 20 4f 50 5f 4d  _Max:  op = OP_M
4ef0: 61 78 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ax;   break;.   
4f00: 20 20 20 20 20 63 61 73 65 20 46 4e 5f 41 76 67       case FN_Avg
4f10: 3a 20 20 6f 70 20 3d 20 4f 50 5f 41 64 64 3b 20  :  op = OP_Add; 
4f20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4f30: 20 63 61 73 65 20 46 4e 5f 53 75 6d 3a 20 20 6f   case FN_Sum:  o
4f40: 70 20 3d 20 4f 50 5f 41 64 64 3b 20 20 20 62 72  p = OP_Add;   br
4f50: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4f60: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4f70: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  Op(v, op, 0, 0, 
4f80: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
4f90: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4fa0: 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69 2c  OP_AggSet, 0, i,
4fb0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
4fc0: 7d 0a 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65  }...  /* End the
4fd0: 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
4fe0: 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  oop..  */.  sqli
4ff0: 74 65 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  teWhereEnd(pWInf
5000: 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  o);..  /* If we 
5010: 61 72 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61  are processing a
5020: 67 67 72 65 67 61 74 65 73 2c 20 77 65 20 6e 65  ggregates, we ne
5030: 65 64 20 74 6f 20 73 65 74 20 75 70 20 61 20 73  ed to set up a s
5040: 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20  econd loop.  ** 
5050: 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  over all of the 
5060: 61 67 67 72 65 67 61 74 65 20 76 61 6c 75 65 73  aggregate values
5070: 20 61 6e 64 20 70 72 6f 63 65 73 73 20 74 68 65   and process the
5080: 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  m..  */.  if( is
5090: 41 67 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 65  Agg ){.    int e
50a0: 6e 64 61 67 67 20 3d 20 73 71 6c 69 74 65 56 64  ndagg = sqliteVd
50b0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
50c0: 20 20 20 20 69 6e 74 20 73 74 61 72 74 61 67 67      int startagg
50d0: 3b 0a 20 20 20 20 73 74 61 72 74 61 67 67 20 3d  ;.    startagg =
50e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
50f0: 28 76 2c 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20  (v, OP_AggNext, 
5100: 30 2c 20 65 6e 64 61 67 67 2c 20 30 2c 20 30 29  0, endagg, 0, 0)
5110: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73  ;.    pParse->us
5120: 65 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 69 66  eAgg = 1;.    if
5130: 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
5140: 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 46     sqliteExprIfF
5150: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
5160: 76 69 6e 67 2c 20 73 74 61 72 74 61 67 67 29 3b  ving, startagg);
5170: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
5180: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
5190: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 30  Parse, pEList, 0
51a0: 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64  , 0, pOrderBy, d
51b0: 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 20  istinct, eDest, 
51c0: 69 50 61 72 6d 2c 0a 20 20 20 20 20 20 20 20 20  iParm,.         
51d0: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74             start
51e0: 61 67 67 2c 20 65 6e 64 61 67 67 29 20 29 7b 0a  agg, endagg) ){.
51f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
5200: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
5210: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5220: 47 6f 74 6f 2c 20 30 2c 20 73 74 61 72 74 61 67  Goto, 0, startag
5230: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  g, 0, 0);.    sq
5240: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5250: 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20   OP_Noop, 0, 0, 
5260: 30 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20  0, endagg);.    
5270: 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d  pParse->useAgg =
5280: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
5290: 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
52a0: 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
52b0: 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
52c0: 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
52d0: 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
52e0: 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
52f0: 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
5300: 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
5310: 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64  y ){.    int end
5320: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
5330: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
5340: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c  nt addr;.    sql
5350: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5360: 4f 50 5f 53 6f 72 74 2c 20 30 2c 20 30 2c 20 30  OP_Sort, 0, 0, 0
5370: 2c 20 30 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  , 0);.    addr =
5380: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5390: 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c  (v, OP_SortNext,
53a0: 20 30 2c 20 65 6e 64 2c 20 30 2c 20 30 29 3b 0a   0, end, 0, 0);.
53b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
53c0: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 43 61  dOp(v, OP_SortCa
53d0: 6c 6c 62 61 63 6b 2c 20 70 45 4c 69 73 74 2d 3e  llback, pEList->
53e0: 6e 45 78 70 72 2c 20 30 2c 20 30 2c 20 30 29 3b  nExpr, 0, 0, 0);
53f0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
5400: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
5410: 20 30 2c 20 61 64 64 72 2c 20 30 2c 20 30 29 3b   0, addr, 0, 0);
5420: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
5430: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 43  ddOp(v, OP_SortC
5440: 6c 6f 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 65  lose, 0, 0, 0, e
5450: 6e 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nd);.  }.  retur
5460: 6e 20 30 3b 0a 7d 0a                             n 0;.}.