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

Artifact 5d97d2542abe4675d31d24df7ec2b04f78d89a7f:


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 38   select.c,v 1.18
0420: 20 32 30 30 30 2f 30 36 2f 30 38 20 30 30 3a 32   2000/06/08 00:2
0430: 38 3a 35 32 20 64 72 68 20 45 78 70 20 24 0a 2a  8:52 drh Exp $.*
0440: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0450: 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  teInt.h"../*.** 
0460: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53  Allocate a new S
0470: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0480: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
0490: 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a 20  nter to that.** 
04a0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53 65  structure..*/.Se
04b0: 6c 65 63 74 20 2a 73 71 6c 69 74 65 53 65 6c 65  lect *sqliteSele
04c0: 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c 69 73  ctNew(.  ExprLis
04d0: 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 49 64 4c  t *pEList,.  IdL
04e0: 69 73 74 20 2a 70 53 72 63 2c 0a 20 20 45 78 70  ist *pSrc,.  Exp
04f0: 72 20 2a 70 57 68 65 72 65 2c 0a 20 20 45 78 70  r *pWhere,.  Exp
0500: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c  rList *pGroupBy,
0510: 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
0520: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ,.  ExprList *pO
0530: 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 69 73  rderBy,.  int is
0540: 44 69 73 74 69 6e 63 74 0a 29 7b 0a 20 20 53 65  Distinct.){.  Se
0550: 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70 4e  lect *pNew;.  pN
0560: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
0570: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
0580: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
0590: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
05a0: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pNew->pEList = p
05b0: 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  EList;.  pNew->p
05c0: 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e  Src = pSrc;.  pN
05d0: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  ew->pWhere = pWh
05e0: 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  ere;.  pNew->pGr
05f0: 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
0600: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
0610: 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70  g = pHaving;.  p
0620: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
0630: 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77  pOrderBy;.  pNew
0640: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 69  ->isDistinct = i
0650: 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65  sDistinct;.  pNe
0660: 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43  w->op = TK_SELEC
0670: 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  T;.  return pNew
0680: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
0690: 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65  e the given Sele
06a0: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
06b0: 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73   all of its subs
06c0: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
06d0: 69 64 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44  id sqliteSelectD
06e0: 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70 29  elete(Select *p)
06f0: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
0700: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 45  eturn;.  sqliteE
0710: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  xprListDelete(p-
0720: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  >pEList);.  sqli
0730: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
0740: 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74  ->pSrc);.  sqlit
0750: 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  eExprDelete(p->p
0760: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
0770: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
0780: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 73  ->pGroupBy);.  s
0790: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
07a0: 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 73  p->pHaving);.  s
07b0: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c  qliteExprListDel
07c0: 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  ete(p->pOrderBy)
07d0: 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74  ;.  sqliteSelect
07e0: 44 65 6c 65 74 65 28 70 2d 3e 70 50 72 69 6f 72  Delete(p->pPrior
07f0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
0800: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  p);.}../*.** Del
0810: 65 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ete the aggregat
0820: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  e information fr
0830: 6f 6d 20 74 68 65 20 70 61 72 73 65 20 73 74 72  om the parse str
0840: 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  ucture..*/.void 
0850: 73 71 6c 69 74 65 50 61 72 73 65 49 6e 66 6f 52  sqliteParseInfoR
0860: 65 73 65 74 28 50 61 72 73 65 20 2a 70 50 61 72  eset(Parse *pPar
0870: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65  se){.  sqliteFre
0880: 65 28 70 50 61 72 73 65 2d 3e 61 41 67 67 29 3b  e(pParse->aAgg);
0890: 0a 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20  .  pParse->aAgg 
08a0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
08b0: 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Agg = 0;.  pPars
08c0: 65 2d 3e 69 41 67 67 43 6f 75 6e 74 20 3d 20 2d  e->iAggCount = -
08d0: 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e 75 73 65  1;.  pParse->use
08e0: 41 67 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Agg = 0;.}../*.*
08f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
0900: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
0910: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
0920: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
0930: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
0940: 54 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 4c  T..**.** The pEL
0950: 69 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64  ist is used to d
0960: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c  etermine the val
0970: 75 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  ues for each col
0980: 75 6d 6e 20 69 6e 20 74 68 65 0a 2a 2a 20 72 65  umn in the.** re
0990: 73 75 6c 74 20 72 6f 77 2e 20 20 45 78 63 65 70  sult row.  Excep
09a0: 74 20 20 69 66 20 70 45 4c 69 73 74 3d 3d 4e 55  t  if pEList==NU
09b0: 4c 4c 2c 20 74 68 65 6e 20 77 65 20 6a 75 73 74  LL, then we just
09c0: 20 72 65 61 64 20 6e 46 69 65 6c 64 0a 2a 2a 20   read nField.** 
09d0: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  elements from th
09e0: 65 20 73 72 63 54 61 62 20 74 61 62 6c 65 2e 0a  e srcTab table..
09f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
0a00: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
0a10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
0a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0a30: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
0a40: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
0a50: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c  List,       /* L
0a60: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65  ist of values be
0a70: 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f  ing extracted */
0a80: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
0a90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
0aa0: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
0ab0: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  s table */.  int
0ac0: 20 6e 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20   nField,        
0ad0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0ae0: 66 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  f fields in the 
0af0: 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a  source table */.
0b00: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
0b10: 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20  erBy,     /* If 
0b20: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72  not NULL, sort r
0b30: 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69  esults using thi
0b40: 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64  s key */.  int d
0b50: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20  istinct,        
0b60: 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61     /* If >=0, ma
0b70: 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74 73 20  ke sure results 
0b80: 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  are distinct */.
0b90: 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
0ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
0bb0: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
0bc0: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
0bd0: 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20  int iParm,      
0be0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 72          /* An ar
0bf0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 69  gument to the di
0c00: 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f  sposal method */
0c10: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
0c20: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ,          /* Ju
0c30: 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
0c40: 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f  nue with next ro
0c50: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  w */.  int iBrea
0c60: 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
0c70: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
0c80: 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
0c90: 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b  inner loop */.){
0ca0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
0cb0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
0cc0: 74 20 69 3b 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20  t i;..  /* Pull 
0cd0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 66 69  the requested fi
0ce0: 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  elds..  */.  if(
0cf0: 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 66   pEList ){.    f
0d00: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
0d10: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
0d20: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
0d30: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ode(pParse, pELi
0d40: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
0d50: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 46 69 65 6c  .    }.    nFiel
0d60: 64 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  d = pEList->nExp
0d70: 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  r;.  }else{.    
0d80: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c  for(i=0; i<nFiel
0d90: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  d; i++){.      s
0da0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
0db0: 2c 20 4f 50 5f 46 69 65 6c 64 2c 20 73 72 63 54  , OP_Field, srcT
0dc0: 61 62 2c 20 69 2c 20 30 2c 20 30 29 3b 0a 20 20  ab, i, 0, 0);.  
0dd0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
0de0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73   the current res
0df0: 75 6c 74 20 69 73 20 6e 6f 74 20 64 69 73 74 69  ult is not disti
0e00: 6e 63 74 2c 20 73 6b 69 70 20 74 68 65 20 72 65  nct, skip the re
0e10: 73 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  st.  ** of the p
0e20: 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68  rocessing for th
0e30: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 0a 20  e current row.. 
0e40: 20 2a 2f 0a 20 20 69 66 28 20 64 69 73 74 69 6e   */.  if( distin
0e50: 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ct>=0 ){.    int
0e60: 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 56 64 62   lbl = sqliteVdb
0e70: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
0e80: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
0e90: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79  Op(v, OP_MakeKey
0ea0: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
0eb0: 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   1, 0, 0);.    s
0ec0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
0ed0: 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20 64  , OP_Distinct, d
0ee0: 69 73 74 69 6e 63 74 2c 20 6c 62 6c 2c 20 30 2c  istinct, lbl, 0,
0ef0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
0f00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
0f10: 6f 70 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  op, pEList->nExp
0f20: 72 2b 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  r+1, 0, 0, 0);. 
0f30: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
0f40: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
0f50: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 30 2c 20  , iContinue, 0, 
0f60: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
0f70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
0f80: 72 69 6e 67 2c 20 30 2c 20 30 2c 20 22 22 2c 20  ring, 0, 0, "", 
0f90: 6c 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lbl);.    sqlite
0fa0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
0fb0: 50 75 74 2c 20 64 69 73 74 69 6e 63 74 2c 20 30  Put, distinct, 0
0fc0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
0fd0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
0fe0: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
0ff0: 65 2c 20 74 68 65 6e 20 73 74 6f 72 65 20 74 68  e, then store th
1000: 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 69  e results.  ** i
1010: 6e 20 61 20 73 6f 72 74 65 72 2e 0a 20 20 2a 2f  n a sorter..  */
1020: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
1030: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 6f  ){.    char *zSo
1040: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 73 71 6c  rtOrder;.    sql
1050: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
1060: 4f 50 5f 53 6f 72 74 4d 61 6b 65 52 65 63 2c 20  OP_SortMakeRec, 
1070: 6e 46 69 65 6c 64 2c 20 30 2c 20 30 2c 20 30 29  nField, 0, 0, 0)
1080: 3b 0a 20 20 20 20 7a 53 6f 72 74 4f 72 64 65 72  ;.    zSortOrder
1090: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
10a0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
10b0: 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20   + 1 );.    if( 
10c0: 7a 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 29 20  zSortOrder==0 ) 
10d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 66 6f  return 1;.    fo
10e0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
10f0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
1100: 20 20 20 20 20 20 7a 53 6f 72 74 4f 72 64 65 72        zSortOrder
1110: 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  [i] = pOrderBy->
1120: 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3f  a[i].sortOrder ?
1130: 20 27 2d 27 20 3a 20 27 2b 27 3b 0a 20 20 20 20   '-' : '+';.    
1140: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
1150: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
1160: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
1170: 20 20 20 20 7d 0a 20 20 20 20 7a 53 6f 72 74 4f      }.    zSortO
1180: 72 64 65 72 5b 70 4f 72 64 65 72 42 79 2d 3e 6e  rder[pOrderBy->n
1190: 45 78 70 72 5d 20 3d 20 30 3b 0a 20 20 20 20 73  Expr] = 0;.    s
11a0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
11b0: 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 4b 65 79  , OP_SortMakeKey
11c0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
11d0: 72 2c 20 30 2c 20 7a 53 6f 72 74 4f 72 64 65 72  r, 0, zSortOrder
11e0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
11f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1200: 53 6f 72 74 50 75 74 2c 20 30 2c 20 30 2c 20 30  SortPut, 0, 0, 0
1210: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 0a 0a  , 0);.  }else ..
1220: 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64    /* In this mod
1230: 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75  e, write each qu
1240: 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68  ery result to th
1250: 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d  e key of the tem
1260: 70 6f 72 61 72 79 0a 20 20 2a 2a 20 74 61 62 6c  porary.  ** tabl
1270: 65 20 69 50 61 72 6d 2e 0a 20 20 2a 2f 0a 20 20  e iParm..  */.  
1280: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 55  if( eDest==SRT_U
1290: 6e 69 6f 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  nion ){.    sqli
12a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
12b0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 46  P_MakeRecord, nF
12c0: 69 65 6c 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ield, 0, 0, 0);.
12d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
12e0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
12f0: 2c 20 69 50 61 72 6d 2c 20 30 2c 20 22 22 2c 20  , iParm, 0, "", 
1300: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
1310: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
1320: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
1330: 30 29 3b 0a 20 20 7d 65 6c 73 65 20 0a 0a 20 20  0);.  }else ..  
1340: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
1350: 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
1360: 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
1370: 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
1380: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20  ==SRT_Table ){. 
1390: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
13a0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
13b0: 6f 72 64 2c 20 6e 46 69 65 6c 64 2c 20 30 2c 20  ord, nField, 0, 
13c0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
13d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
13e0: 5f 4e 65 77 2c 20 69 50 61 72 6d 2c 20 30 2c 20  _New, iParm, 0, 
13f0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1400: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
1410: 5f 50 75 6c 6c 2c 20 31 2c 20 30 2c 20 30 2c 20  _Pull, 1, 0, 0, 
1420: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
1430: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
1440: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
1450: 30 29 3b 0a 20 20 7d 65 6c 73 65 20 0a 0a 20 20  0);.  }else ..  
1460: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
1470: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
1480: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
1490: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a   instead of.  **
14a0: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
14b0: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
14c0: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
14d0: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 2a  lements from.  *
14e0: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
14f0: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 2a  table iParm..  *
1500: 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
1510: 52 54 5f 45 78 63 65 70 74 20 29 7b 0a 20 20 20  RT_Except ){.   
1520: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1530: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
1540: 64 2c 20 6e 46 69 65 6c 64 2c 20 30 2c 20 30 2c  d, nField, 0, 0,
1550: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
1560: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
1570: 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 30 2c  elete, iParm, 0,
1580: 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20   0, 0);.  }else 
1590: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
15a0: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
15b0: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
15c0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
15d0: 6e 73 74 72 75 63 74 2c 0a 20 20 2a 2a 20 74 68  nstruct,.  ** th
15e0: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
15f0: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
1600: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
1610: 57 72 69 74 65 20 74 68 69 73 0a 20 20 2a 2a 20  Write this.  ** 
1620: 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65  item into the se
1630: 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67  t table with bog
1640: 75 73 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20  us data..  */.  
1650: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
1660: 65 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  et ){.    assert
1670: 28 20 6e 46 69 65 6c 64 3d 3d 31 20 29 3b 0a 20  ( nField==1 );. 
1680: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
1690: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
16a0: 20 30 2c 20 30 2c 20 22 22 2c 20 30 29 3b 0a 20   0, 0, "", 0);. 
16b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
16c0: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 2c 20 69 50  Op(v, OP_Put, iP
16d0: 61 72 6d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  arm, 0, 0, 0);. 
16e0: 20 7d 65 6c 73 65 20 0a 0a 0a 20 20 2f 2a 20 49   }else ...  /* I
16f0: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
1700: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
1710: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
1720: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
1730: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
1740: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
1750: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
1760: 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  ell and break ou
1770: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63  t.  ** of the sc
1780: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20  an loop..  */.  
1790: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d  if( eDest==SRT_M
17a0: 65 6d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  em ){.    assert
17b0: 28 20 6e 46 69 65 6c 64 3d 3d 31 20 29 3b 0a 20  ( nField==1 );. 
17c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
17d0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
17e0: 65 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  e, iParm, 0, 0, 
17f0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
1800: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
1810: 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 2c 20 30  to, 0, iBreak, 0
1820: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  , 0);.  }else.. 
1830: 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74   /* If none of t
1840: 68 65 20 61 62 6f 76 65 2c 20 73 65 6e 64 20 74  he above, send t
1850: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63  he data to the c
1860: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
1870: 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 73  ..  */.  {.    s
1880: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
1890: 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e  , OP_Callback, n
18a0: 46 69 65 6c 64 2c 20 30 2c 20 30 2c 20 30 29 3b  Field, 0, 0, 0);
18b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
18c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
18d0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20   inner loop was 
18e0: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
18f0: 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65  a non-null pOrde
1900: 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  rBy argument,.**
1910: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
1920: 73 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e  s were placed in
1930: 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65   a sorter.  Afte
1940: 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65  r the loop is te
1950: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e  rminated.** we n
1960: 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73  eed to run the s
1970: 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74  orter and output
1980: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
1990: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
19a0: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
19b0: 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65  s the code neede
19c0: 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  d to do that..*/
19d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
19e0: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 56 64  erateSortTail(Vd
19f0: 62 65 20 2a 76 2c 20 69 6e 74 20 6e 46 69 65 6c  be *v, int nFiel
1a00: 64 29 7b 0a 20 20 69 6e 74 20 65 6e 64 20 3d 20  d){.  int end = 
1a10: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
1a20: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64  bel(v);.  int ad
1a30: 64 72 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65  dr;.  sqliteVdbe
1a40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
1a50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
1a60: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
1a70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
1a80: 72 74 4e 65 78 74 2c 20 30 2c 20 65 6e 64 2c 20  rtNext, 0, end, 
1a90: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 56  0, 0);.  sqliteV
1aa0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
1ab0: 6f 72 74 43 61 6c 6c 62 61 63 6b 2c 20 6e 46 69  ortCallback, nFi
1ac0: 65 6c 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  eld, 0, 0, 0);. 
1ad0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1ae0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1af0: 61 64 64 72 2c 20 30 2c 20 30 29 3b 0a 20 20 73  addr, 0, 0);.  s
1b00: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
1b10: 2c 20 4f 50 5f 53 6f 72 74 43 6c 6f 73 65 2c 20  , OP_SortClose, 
1b20: 30 2c 20 30 2c 20 30 2c 20 65 6e 64 29 3b 0a 7d  0, 0, 0, end);.}
1b30: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1b40: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1b50: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 68 6f  tell the VDBE ho
1b60: 77 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 74  w many columns t
1b70: 68 65 72 65 0a 2a 2a 20 61 72 65 20 69 6e 20 74  here.** are in t
1b80: 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20 74 68  he result and th
1b90: 65 20 6e 61 6d 65 20 66 6f 72 20 65 61 63 68 20  e name for each 
1ba0: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 69 6e  column.  This in
1bb0: 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69 73 20  formation.** is 
1bc0: 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  used to provide 
1bd0: 22 61 72 67 63 22 20 61 6e 64 20 22 61 7a 43 6f  "argc" and "azCo
1be0: 6c 5b 5d 22 20 76 61 6c 75 65 73 20 69 6e 20 74  l[]" values in t
1bf0: 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  he callback..*/.
1c00: 73 74 61 74 69 63 20 0a 76 6f 69 64 20 67 65 6e  static .void gen
1c10: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
1c20: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c30: 49 64 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  IdList *pTabList
1c40: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
1c50: 73 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  st){.  Vdbe *v =
1c60: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1c70: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1c80: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
1c90: 65 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  et ) return;.  p
1ca0: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
1cb0: 65 74 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65  et = 1;.  sqlite
1cc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1cd0: 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 70 45 4c  ColumnCount, pEL
1ce0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 20 30  ist->nExpr, 0, 0
1cf0: 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  , 0);.  for(i=0;
1d00: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
1d10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
1d20: 20 2a 70 3b 0a 20 20 20 20 69 66 28 20 70 45 4c   *p;.    if( pEL
1d30: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
1d40: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
1d50: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
1d60: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
1d70: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1d80: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d  (v, OP_ColumnNam
1d90: 65 2c 20 69 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20  e, i, 0, zName, 
1da0: 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  0);.      contin
1db0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20  ue;.    }.    p 
1dc0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
1dd0: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 2d  Expr;.    if( p-
1de0: 3e 6f 70 21 3d 54 4b 5f 46 49 45 4c 44 20 7c 7c  >op!=TK_FIELD ||
1df0: 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a   pTabList==0 ){.
1e00: 20 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65        char zName
1e10: 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73 70 72 69  [30];.      spri
1e20: 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75  ntf(zName, "colu
1e30: 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20  mn%d", i+1);.   
1e40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
1e50: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e  Op(v, OP_ColumnN
1e60: 61 6d 65 2c 20 69 2c 20 30 2c 20 7a 4e 61 6d 65  ame, i, 0, zName
1e70: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1e80: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 4c  .      if( pTabL
1e90: 69 73 74 2d 3e 6e 49 64 3e 31 20 29 7b 0a 20 20  ist->nId>1 ){.  
1ea0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
1eb0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  e = 0;.        T
1ec0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
1ed0: 62 4c 69 73 74 2d 3e 61 5b 70 2d 3e 69 54 61 62  bList->a[p->iTab
1ee0: 6c 65 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  le].pTab;.      
1ef0: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a    char *zTab;. .
1f00: 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70          zTab = p
1f10: 54 61 62 4c 69 73 74 2d 3e 61 5b 70 2d 3e 69 54  TabList->a[p->iT
1f20: 61 62 6c 65 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20  able].zAlias;.  
1f30: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 3d 3d        if( zTab==
1f40: 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d  0 ) zTab = pTab-
1f50: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
1f60: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
1f70: 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e  &zName, zTab, ".
1f80: 22 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d  ", pTab->aCol[p-
1f90: 3e 69 46 69 65 6c 64 5d 2e 7a 4e 61 6d 65 2c 20  >iField].zName, 
1fa0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
1fb0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1fc0: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c  P_ColumnName, i,
1fd0: 20 30 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20   0, zName, 0);. 
1fe0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
1ff0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  e(zName);.      
2000: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54  }else{.        T
2010: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
2020: 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62  bList->a[0].pTab
2030: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
2040: 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
2050: 6f 6c 5b 70 2d 3e 69 46 69 65 6c 64 5d 2e 7a 4e  ol[p->iField].zN
2060: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ame;.        sql
2070: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
2080: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69  OP_ColumnName, i
2090: 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  , 0, zName, 0);.
20a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20  }.}../*.** Name 
20c0: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
20d0: 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64  n operator, used
20e0: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
20f0: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ges..*/.static c
2100: 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63  onst char *selec
2110: 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b  tOpName(int id){
2120: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77  .  char *z;.  sw
2130: 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20  itch( id ){.    
2140: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
2150: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c     z = "UNION AL
2160: 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  L";   break;.   
2170: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
2180: 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45  CT: z = "INTERSE
2190: 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  CT";   break;.  
21a0: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
21b0: 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54  :    z = "EXCEPT
21c0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
21d0: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
21e0: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
21f0: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
2200: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
2210: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  }../*.** For the
2220: 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74   given SELECT st
2230: 61 74 65 6d 65 6e 74 2c 20 64 6f 20 74 77 6f 20  atement, do two 
2240: 74 68 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  things..**.**   
2250: 20 28 31 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (1)  Fill in th
2260: 65 20 70 54 61 62 20 66 69 65 6c 64 73 20 6f 66  e pTab fields of
2270: 20 74 68 65 20 49 64 4c 69 73 74 20 74 68 61 74   the IdList that
2280: 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 65 74   defines the set
2290: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74  .**         of t
22a0: 61 62 6c 65 73 20 77 65 20 61 72 65 20 73 63 61  ables we are sca
22b0: 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  nning..**.**    
22c0: 28 32 29 20 20 49 66 20 74 68 65 20 63 6f 6c 75  (2)  If the colu
22d0: 6d 6e 73 20 74 6f 20 62 65 20 65 78 74 72 61 63  mns to be extrac
22e0: 74 65 64 20 76 61 72 69 61 62 6c 65 20 28 70 45  ted variable (pE
22f0: 4c 69 73 74 29 20 69 73 20 4e 55 4c 4c 0a 2a 2a  List) is NULL.**
2300: 20 20 20 20 20 20 20 20 20 28 6d 65 61 6e 69 6e           (meanin
2310: 67 20 74 68 61 74 20 61 20 22 2a 22 20 77 61 73  g that a "*" was
2320: 20 75 73 65 64 20 69 6e 20 74 68 65 20 53 51 4c   used in the SQL
2330: 20 73 74 61 74 65 6d 65 6e 74 29 20 74 68 65 6e   statement) then
2340: 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 72 65 61  .**         crea
2350: 74 65 20 61 20 66 61 6b 65 20 70 45 4c 69 73 74  te a fake pEList
2360: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2370: 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 6f 6c  names of all col
2380: 75 6d 6e 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  umns.**         
2390: 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 2a  of all tables..*
23a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e  *.** Return 0 on
23b0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
23c0: 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73  ere are problems
23d0: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
23e0: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70   message.** in p
23f0: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
2400: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74   non-zero..*/.st
2410: 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
2420: 6f 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73 65 20  olumnList(Parse 
2430: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
2440: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  *p){.  int i, j;
2450: 0a 20 20 49 64 4c 69 73 74 20 2a 70 54 61 62 4c  .  IdList *pTabL
2460: 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
2470: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
2480: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a  t = p->pEList;..
2490: 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
24a0: 72 79 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ry table in the 
24b0: 74 61 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a 2f  table list..  */
24c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
24d0: 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  abList->nId; i++
24e0: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c  ){.    if( pTabL
24f0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 29  ist->a[i].pTab )
2500: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
2510: 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20  routine has run 
2520: 62 65 66 6f 72 65 21 20 20 4e 6f 20 6e 65 65 64  before!  No need
2530: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a   to continue */.
2540: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
2550: 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69      }.    pTabLi
2560: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20  st->a[i].pTab = 
2570: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
2580: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
2590: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
25a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c  );.    if( pTabL
25b0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3d 3d  ist->a[i].pTab==
25c0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
25d0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
25e0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f  se->zErrMsg, "no
25f0: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20   such table: ", 
2600: 0a 20 20 20 20 20 20 20 20 20 70 54 61 62 4c 69  .         pTabLi
2610: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
2620: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
2630: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
2640: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2650: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2660: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
2670: 20 74 6f 20 72 65 74 72 69 65 76 65 20 69 73 20   to retrieve is 
2680: 22 2a 22 20 74 68 65 6e 20 72 65 70 6c 61 63 65  "*" then replace
2690: 20 69 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 20   it with.  ** a 
26a0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
26b0: 6d 6e 73 20 66 72 6f 6d 20 61 6c 6c 20 74 61 62  mns from all tab
26c0: 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
26d0: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
26e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
26f0: 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
2700: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
2710: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
2720: 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [i].pTab;.      
2730: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
2740: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
2750: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
2760: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
2770: 5f 44 4f 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  _DOT, 0, 0, 0);.
2780: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
2790: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45 78 70  Left = sqliteExp
27a0: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30  r(TK_ID, 0, 0, 0
27b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
27c0: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a  ->pLeft->token.z
27d0: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
27e0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
27f0: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  Left->token.n = 
2800: 73 74 72 6c 65 6e 28 70 54 61 62 2d 3e 7a 4e 61  strlen(pTab->zNa
2810: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  me);.        pEx
2820: 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  pr->pRight = sql
2830: 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  iteExpr(TK_ID, 0
2840: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
2850: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e   pExpr->pRight->
2860: 74 6f 6b 65 6e 2e 7a 20 3d 20 70 54 61 62 2d 3e  token.z = pTab->
2870: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
2880: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52         pExpr->pR
2890: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  ight->token.n = 
28a0: 73 74 72 6c 65 6e 28 70 54 61 62 2d 3e 61 43 6f  strlen(pTab->aCo
28b0: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[j].zName);.   
28c0: 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71       pEList = sq
28d0: 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65  liteExprListAppe
28e0: 6e 64 28 70 45 4c 69 73 74 2c 20 70 45 78 70 72  nd(pEList, pExpr
28f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
2900: 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73    }.    p->pELis
2910: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 7d 0a  t = pEList;.  }.
2920: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2930: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2940: 65 20 61 73 73 6f 63 69 61 74 65 73 20 65 6e 74  e associates ent
2950: 72 69 65 73 20 69 6e 20 61 6e 20 4f 52 44 45 52  ries in an ORDER
2960: 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   BY expression l
2970: 69 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75  ist with.** colu
2980: 6d 6e 73 20 69 6e 20 61 20 72 65 73 75 6c 74 2e  mns in a result.
2990: 20 20 46 6f 72 20 65 61 63 68 20 4f 52 44 45 52    For each ORDER
29a0: 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   BY expression, 
29b0: 74 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a  the opcode of.**
29c0: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e   the top-level n
29d0: 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ode is changed t
29e0: 6f 20 54 4b 5f 46 49 45 4c 44 20 61 6e 64 20 74  o TK_FIELD and t
29f0: 68 65 20 69 46 69 65 6c 64 20 76 61 6c 75 65 20  he iField value 
2a00: 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65  of.** the top-le
2a10: 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c  vel node is fill
2a20: 65 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d  ed in with colum
2a30: 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  n number and the
2a40: 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65   iTable.** value
2a50: 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65   of the top-leve
2a60: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
2a70: 20 77 69 74 68 20 69 54 61 62 6c 65 20 70 61 72   with iTable par
2a80: 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ameter..**.** If
2a90: 20 74 68 65 72 65 20 61 72 65 20 70 72 69 6f 72   there are prior
2aa0: 20 53 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c   SELECT clauses,
2ab0: 20 74 68 65 79 20 61 72 65 20 70 72 6f 63 65 73   they are proces
2ac0: 73 65 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61  sed first.  A ma
2ad0: 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72  tch.** in an ear
2ae0: 6c 69 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65  lier SELECT take
2af0: 73 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  s precedence ove
2b00: 72 20 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54  r a later SELECT
2b10: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72  ..**.** Any entr
2b20: 79 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  y that does not 
2b30: 6d 61 74 63 68 20 69 73 20 66 6c 61 67 67 65 64  match is flagged
2b40: 20 61 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54   as an error.  T
2b50: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
2b60: 65 72 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e  errors is return
2b70: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2b80: 74 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  t matchOrderbyTo
2b90: 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
2ba0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2bb0: 20 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20    /* A place to 
2bc0: 6c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  leave error mess
2bd0: 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ages */.  Select
2be0: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
2bf0: 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65    /* Match to re
2c00: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  sult columns of 
2c10: 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  this SELECT */. 
2c20: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
2c30: 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rBy,     /* The 
2c40: 4f 52 44 45 52 20 42 59 20 76 61 6c 75 65 73 20  ORDER BY values 
2c50: 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  to match against
2c60: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
2c70: 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
2c80: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
2c90: 74 68 69 73 20 74 68 69 73 20 76 61 6c 75 65 20  this this value 
2ca0: 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69  in iTable */.  i
2cb0: 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  nt mustComplete 
2cc0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55         /* If TRU
2cd0: 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20  E all ORDER BYs 
2ce0: 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b  must match */.){
2cf0: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
2d00: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45  .  int i, j;.  E
2d10: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
2d20: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  ..  assert( pSel
2d30: 65 63 74 20 26 26 20 70 4f 72 64 65 72 42 79 20  ect && pOrderBy 
2d40: 29 3b 0a 20 20 69 66 28 20 6d 75 73 74 43 6f 6d  );.  if( mustCom
2d50: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 66 6f 72  plete ){.    for
2d60: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
2d70: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70  ->nExpr; i++){ p
2d80: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
2d90: 6e 65 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20  ne = 0; }.  }.  
2da0: 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e  if( fillInColumn
2db0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
2dc0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74  lect) ){.    ret
2dd0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
2de0: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
2df0: 20 29 7b 0a 20 20 20 20 6d 61 74 63 68 4f 72 64   ){.    matchOrd
2e00: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61  erbyToColumn(pPa
2e10: 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50  rse, pSelect->pP
2e20: 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20  rior, pOrderBy, 
2e30: 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 7d 0a  iTable, 0);.  }.
2e40: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
2e50: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f  ct->pEList;.  fo
2e60: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
2e70: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
2e80: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
2e90: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2ea0: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 4f 72  xpr;.    if( pOr
2eb0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
2ec0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2ed0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69   for(j=0; j<pELi
2ee0: 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  st->nExpr; j++){
2ef0: 0a 20 20 20 20 20 20 69 6e 74 20 6d 61 74 63 68  .      int match
2f00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
2f10: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
2f20: 6d 65 20 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54  me && (pE->op==T
2f30: 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d  K_ID || pE->op==
2f40: 54 4b 5f 53 54 52 49 4e 47 29 20 29 7b 0a 20 20  TK_STRING) ){.  
2f50: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
2f60: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
2f70: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
2f80: 63 68 61 72 20 2a 7a 4c 61 62 65 6c 20 3d 20 30  char *zLabel = 0
2f90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2fa0: 53 65 74 53 74 72 69 6e 67 28 26 7a 4c 61 62 65  SetString(&zLabe
2fb0: 6c 2c 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  l, pE->token.z, 
2fc0: 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b  pE->token.n, 0);
2fd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 44  .        sqliteD
2fe0: 65 71 75 6f 74 65 28 7a 4c 61 62 65 6c 29 3b 0a  equote(zLabel);.
2ff0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
3000: 74 65 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c  teStrICmp(zName,
3010: 20 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a   zLabel)==0 ){ .
3020: 20 20 20 20 20 20 20 20 20 20 6d 61 74 63 68 20            match 
3030: 3d 20 31 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  = 1; .        }.
3040: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
3050: 28 20 6d 61 74 63 68 3d 3d 30 20 26 26 20 73 71  ( match==0 && sq
3060: 6c 69 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28  liteExprCompare(
3070: 70 45 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  pE, pEList->a[i]
3080: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
3090: 20 20 20 6d 61 74 63 68 20 3d 20 31 3b 0a 20 20     match = 1;.  
30a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
30b0: 6d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20  match ){.       
30c0: 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 46 49 45   pE->op = TK_FIE
30d0: 4c 44 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e  LD;.        pE->
30e0: 69 46 69 65 6c 64 20 3d 20 6a 3b 0a 20 20 20 20  iField = j;.    
30f0: 20 20 20 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d      pE->iTable =
3100: 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20   iTable;.       
3110: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
3120: 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  done = 1;.      
3130: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3140: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
3150: 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20  ustComplete ){. 
3160: 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33       char zBuf[3
3170: 30 5d 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74  0];.      sprint
3180: 66 28 7a 42 75 66 2c 22 25 64 22 2c 69 2b 31 29  f(zBuf,"%d",i+1)
3190: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  ;.      sqliteSe
31a0: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
31b0: 3e 7a 45 72 72 4d 73 67 2c 20 22 4f 52 44 45 52  >zErrMsg, "ORDER
31c0: 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72 20   BY term number 
31d0: 22 2c 20 7a 42 75 66 2c 20 0a 20 20 20 20 20 20  ", zBuf, .      
31e0: 20 20 22 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74    " does not mat
31f0: 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f  ch any result co
3200: 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 20  lumn", 0);.     
3210: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
3220: 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  .      nErr++;. 
3230: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3240: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
3250: 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Err;  .}../*.** 
3260: 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
3270: 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
3280: 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
3290: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
32a0: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
32b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
32c0: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
32d0: 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
32e0: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64  in pParse..*/.Vd
32f0: 62 65 20 2a 73 71 6c 69 74 65 47 65 74 56 64 62  be *sqliteGetVdb
3300: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
3310: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
3320: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
3330: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76  f( v==0 ){.    v
3340: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
3350: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 72 65   = sqliteVdbeCre
3360: 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  ate(pParse->db->
3370: 70 42 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pBe);.  }.  if( 
3380: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  v==0 ){.    sqli
3390: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
33a0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6f  rse->zErrMsg, "o
33b0: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 20 30  ut of memory", 0
33c0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
33d0: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Err++;.  }.  ret
33e0: 75 72 6e 20 76 3b 0a 7d 0a 20 20 20 20 0a 0a 2f  urn v;.}.    ../
33f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3400: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70  e is called to p
3410: 72 6f 63 65 73 73 20 61 20 71 75 65 72 79 20 74  rocess a query t
3420: 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68  hat is really th
3430: 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e  e union.** or in
3440: 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77  tersection of tw
3450: 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
3460: 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 73  te queries..*/.s
3470: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
3480: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
3490: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
34a0: 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69  int eDest, int i
34b0: 50 61 72 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Parm){.  int rc;
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34d0: 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
34e0: 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
34f0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
3500: 6f 72 3b 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  or;     /* Anoth
3510: 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
3520: 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
3530: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
3540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
3550: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
3560: 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e  his VDBE */.  in
3570: 74 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20  t base;         
3580: 20 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20 76 61    /* Baseline va
3590: 6c 75 65 20 66 6f 72 20 70 50 61 72 73 65 2d 3e  lue for pParse->
35a0: 6e 54 61 62 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61  nTab */..  /* Ma
35b0: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
35c0: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
35d0: 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c  use on prior SEL
35e0: 45 43 54 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20  ECTs.  Only the 
35f0: 0a 20 20 2a 2a 20 6c 61 73 74 20 53 45 4c 45 43  .  ** last SELEC
3600: 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20  T in the series 
3610: 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45  may have an ORDE
3620: 52 20 42 59 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  R BY..  */.  ass
3630: 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 21 3d  ert( p->pPrior!=
3640: 30 20 29 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  0 );.  pPrior = 
3650: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28  p->pPrior;.  if(
3660: 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
3670: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  y ){.    sqliteS
3680: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
3690: 2d 3e 7a 45 72 72 4d 73 67 2c 22 4f 52 44 45 52  ->zErrMsg,"ORDER
36a0: 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c   BY clause shoul
36b0: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 22 2c 0a  d come after ",.
36c0: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
36d0: 6d 65 28 70 2d 3e 6f 70 29 2c 20 22 20 6e 6f 74  me(p->op), " not
36e0: 20 62 65 66 6f 72 65 22 2c 20 30 29 3b 0a 20 20   before", 0);.  
36f0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
3700: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
3710: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
3720: 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61  ure we have a va
3730: 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65  lid query engine
3740: 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74  .  If not, creat
3750: 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a  e a new one..  *
3760: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  /.  v = sqliteGe
3770: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
3780: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
3790: 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63  rn 1;..  /* Proc
37a0: 65 73 73 20 74 68 65 20 55 4e 49 4f 4e 20 6f 72  ess the UNION or
37b0: 20 49 4e 54 45 52 53 45 43 54 49 4f 4e 0a 20 20   INTERSECTION.  
37c0: 2a 2f 0a 20 20 62 61 73 65 20 3d 20 70 50 61 72  */.  base = pPar
37d0: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 73 77 69 74  se->nTab;.  swit
37e0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
37f0: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 0a 20 20   case TK_ALL:.  
3800: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
3810: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e  :.    case TK_UN
3820: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
3830: 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a   unionTab;    /*
3840: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
3850: 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
3860: 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65  table holding re
3870: 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  sult */.      in
3880: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f  t op;          /
3890: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54  * One of the SRT
38a0: 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  _ operations to 
38b0: 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f  apply to self */
38c0: 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
38d0: 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53  Op;     /* The S
38e0: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  RT_ operation to
38f0: 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20   apply to prior 
3900: 73 65 6c 65 63 74 73 20 2a 2f 0a 0a 20 20 20 20  selects */..    
3910: 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f    priorOp = p->o
3920: 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f  p==TK_ALL ? SRT_
3930: 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f  Table : SRT_Unio
3940: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  n;.      if( eDe
3950: 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20  st==priorOp ){. 
3960: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e         /* We can
3970: 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61   reuse a tempora
3980: 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74  ry table generat
3990: 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74  ed by a SELECT t
39a0: 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  o our.        **
39b0: 20 72 69 67 68 74 2e 20 20 54 68 69 73 20 61 6c   right.  This al
39c0: 73 6f 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  so means we are 
39d0: 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  not the right-mo
39e0: 73 74 20 73 65 6c 65 63 74 20 61 6e 64 20 73 6f  st select and so
39f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 63  .        ** we c
3a00: 61 6e 6e 6f 74 20 68 61 76 65 20 61 6e 20 4f 52  annot have an OR
3a10: 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
3a20: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
3a30: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61 72   unionTab = iPar
3a40: 6d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  m;.        asser
3a50: 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
3a60: 30 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0 );.      }else
3a70: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
3a80: 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65  will need to cre
3a90: 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70  ate our own temp
3aa0: 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68  orary table to h
3ab0: 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  old the.        
3ac0: 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
3ad0: 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20  results..       
3ae0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
3af0: 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nTab = pParse->n
3b00: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  Tab++;.        i
3b10: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 0a  f( p->pOrderBy .
3b20: 20 20 20 20 20 20 20 20 26 26 20 6d 61 74 63 68          && match
3b30: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
3b40: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f  pParse, p, p->pO
3b50: 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62  rderBy, unionTab
3b60: 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 1) ){.        
3b70: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3b80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
3b90: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3ba0: 20 4f 50 5f 4f 70 65 6e 2c 20 75 6e 69 6f 6e 54   OP_Open, unionT
3bb0: 61 62 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20  ab, 1, 0, 0);.  
3bc0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21        if( p->op!
3bd0: 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20  =TK_ALL ){.     
3be0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
3bf0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73  ddOp(v, OP_KeyAs
3c00: 44 61 74 61 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Data, unionTab, 
3c10: 31 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  1, 0, 0);.      
3c20: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
3c30: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
3c40: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
3c50: 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20   to our left.   
3c60: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
3c70: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
3c80: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 72  arse, pPrior, pr
3c90: 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29  iorOp, unionTab)
3ca0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
3cb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
3cc0: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
3cd0: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74  urrent SELECT st
3ce0: 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f  atement.      */
3cf0: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70  .      switch( p
3d00: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ->op ){.        
3d10: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
3d20: 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70    op = SRT_Excep
3d30: 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  t;   break;.    
3d40: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49       case TK_UNI
3d50: 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55  ON:   op = SRT_U
3d60: 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a  nion;    break;.
3d70: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
3d80: 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53  _ALL:     op = S
3d90: 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65  RT_Table;    bre
3da0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3db0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
3dc0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
3dd0: 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  teSelect(pParse,
3de0: 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62   p, op, unionTab
3df0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
3e00: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
3e10: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
3e20: 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a  rn rc;..      /*
3e30: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74   Convert the dat
3e40: 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  a in the tempora
3e50: 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68  ry table into wh
3e60: 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20  atever form.    
3e70: 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20    ** it is that 
3e80: 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65  we currently nee
3e90: 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20  d..      */     
3ea0: 20 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73   .      if( eDes
3eb0: 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t!=priorOp ){.  
3ec0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
3ed0: 20 69 42 72 65 61 6b 3b 0a 20 20 20 20 20 20 20   iBreak;.       
3ee0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
3ef0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 67 65  st );.        ge
3f00: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
3f10: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e  s(pParse, 0, p->
3f20: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  pEList);.       
3f30: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
3f40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
3f50: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3f60: 20 4f 50 5f 53 6f 72 74 4f 70 65 6e 2c 20 30 2c   OP_SortOpen, 0,
3f70: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
3f80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72     }.        iBr
3f90: 65 61 6b 20 3d 20 73 71 6c 69 74 65 56 64 62 65  eak = sqliteVdbe
3fa0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
3fb0: 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
3fc0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3fd0: 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54   OP_Next, unionT
3fe0: 61 62 2c 20 69 42 72 65 61 6b 2c 20 30 2c 20 30  ab, iBreak, 0, 0
3ff0: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
4000: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
4010: 70 50 61 72 73 65 2c 20 30 2c 20 75 6e 69 6f 6e  pParse, 0, union
4020: 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Tab, p->pEList->
4030: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
4040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4050: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c      p->pOrderBy,
4060: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
4070: 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
40a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
40b0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
40c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
40d0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
40e0: 30 2c 20 69 43 6f 6e 74 2c 20 30 2c 20 30 29 3b  0, iCont, 0, 0);
40f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
4100: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
4110: 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  lose, unionTab, 
4120: 30 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20  0, 0, iBreak);. 
4130: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f         if( p->pO
4140: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
4150: 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
4160: 54 61 69 6c 28 76 2c 20 70 2d 3e 70 45 4c 69 73  Tail(v, p->pELis
4170: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
4180: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
4190: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
41a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
41b0: 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69  RSECT: {.      i
41c0: 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20  nt tab1, tab2;. 
41d0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
41e0: 69 42 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 2f  iBreak;..      /
41f0: 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64  * INTERSECT is d
4200: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
4210: 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69  e others since i
4220: 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
4230: 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72   ** two temporar
4240: 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65  y tables.  Hence
4250: 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20   it has its own 
4260: 63 61 73 65 2e 20 20 42 65 67 69 6e 65 0a 20 20  case.  Begine.  
4270: 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
4280: 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
4290: 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
42a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
42b0: 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
42c0: 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
42d0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
42e0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  .      if( p->pO
42f0: 72 64 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f  rderBy && matchO
4300: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70  rderbyToColumn(p
4310: 50 61 72 73 65 2c 70 2c 70 2d 3e 70 4f 72 64 65  Parse,p,p->pOrde
4320: 72 42 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20  rBy,tab1,1) ){. 
4330: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
4340: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
4350: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4360: 2c 20 4f 50 5f 4f 70 65 6e 2c 20 74 61 62 31 2c  , OP_Open, tab1,
4370: 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   1, 0, 0);.     
4380: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4390: 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61  (v, OP_KeyAsData
43a0: 2c 20 74 61 62 31 2c 20 31 2c 20 30 2c 20 30 29  , tab1, 1, 0, 0)
43b0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
43c0: 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20   the SELECTs to 
43d0: 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65  our left into te
43e0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
43f0: 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ab1"..      */. 
4400: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
4410: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
4420: 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e  Prior, SRT_Union
4430: 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 69  , tab1);.      i
4440: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
4450: 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  c;..      /* Cod
4460: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
4470: 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72  LECT into tempor
4480: 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22  ary table "tab2"
4490: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
44a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
44b0: 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20 74 61 62 32  v, OP_Open, tab2
44c0: 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 1, 0, 0);.    
44d0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
44e0: 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74  p(v, OP_KeyAsDat
44f0: 61 2c 20 74 61 62 32 2c 20 31 2c 20 30 2c 20 30  a, tab2, 1, 0, 0
4500: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
4510: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  or = 0;.      rc
4520: 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28   = sqliteSelect(
4530: 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55  pParse, p, SRT_U
4540: 6e 69 6f 6e 2c 20 74 61 62 32 29 3b 0a 20 20 20  nion, tab2);.   
4550: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
4560: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
4570: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
4580: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
4590: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65  ate code to take
45a0: 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f   the intersectio
45b0: 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d  n of the two tem
45c0: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20  porary.      ** 
45d0: 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f  tables..      */
45e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
45f0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
4600: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
4610: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
4620: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
4630: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
4640: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  By ){.        sq
4650: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4660: 20 4f 50 5f 53 6f 72 74 4f 70 65 6e 2c 20 30 2c   OP_SortOpen, 0,
4670: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
4680: 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20   }.      iBreak 
4690: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
46a0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
46b0: 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56 64  iCont = sqliteVd
46c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
46d0: 78 74 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b  xt, tab1, iBreak
46e0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
46f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4700: 2c 20 4f 50 5f 4b 65 79 2c 20 74 61 62 31 2c 20  , OP_Key, tab1, 
4710: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
4720: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4730: 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
4740: 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 30 2c 20  tab2, iCont, 0, 
4750: 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  0);.      rc = s
4760: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
4770: 50 61 72 73 65 2c 20 30 2c 20 74 61 62 31 2c 20  Parse, 0, tab1, 
4780: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
4790: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
47b0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20  ->pOrderBy, -1, 
47c0: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20  eDest, iParm, . 
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e              iCon
47f0: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
4800: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
4810: 6e 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n 1;.      sqlit
4820: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4830: 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 2c  _Goto, 0, iCont,
4840: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
4850: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4860: 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c   OP_Close, tab2,
4870: 20 30 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a   0, 0, iBreak);.
4880: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4890: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
48a0: 65 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c 20 30  e, tab1, 0, 0, 0
48b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
48c0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
48d0: 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
48e0: 54 61 69 6c 28 76 2c 20 70 2d 3e 70 45 4c 69 73  Tail(v, p->pELis
48f0: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
4900: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
4910: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
4920: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
4930: 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
4940: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  );.  if( p->pELi
4950: 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f  st->nExpr!=pPrio
4960: 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  r->pEList->nExpr
4970: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
4980: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
4990: 3e 7a 45 72 72 4d 73 67 2c 20 22 53 45 4c 45 43  >zErrMsg, "SELEC
49a0: 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  Ts to the left a
49b0: 6e 64 20 72 69 67 68 74 20 6f 66 20 22 2c 0a 20  nd right of ",. 
49c0: 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
49d0: 65 28 70 2d 3e 6f 70 29 2c 20 22 20 64 6f 20 6e  e(p->op), " do n
49e0: 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
49f0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
4a00: 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 30 29 3b 0a  t columns", 0);.
4a10: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
4a20: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ++;.    return 1
4a30: 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
4a40: 6e 54 61 62 20 3d 20 62 61 73 65 3b 0a 20 20 72  nTab = base;.  r
4a50: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4a60: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
4a70: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 45  for the given SE
4a80: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
4a90: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
4aa0: 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65  s are distribute
4ab0: 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79  d in various way
4ac0: 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  s depending on t
4ad0: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65  he.** value of e
4ae0: 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a  Dest and iParm..
4af0: 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74 20  **.**     eDest 
4b00: 56 61 6c 75 65 20 20 20 20 20 20 20 52 65 73 75  Value       Resu
4b10: 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d  lt.**     ------
4b20: 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
4b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b50: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54  -----.**     SRT
4b60: 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76  _Callback    Inv
4b70: 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  oke the callback
4b80: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
4b90: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
4ba0: 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20  **     SRT_Mem  
4bb0: 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69 72         Store fir
4bc0: 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d  st result in mem
4bd0: 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a  ory cell iParm.*
4be0: 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74  *.**     SRT_Set
4bf0: 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 72           Store r
4c00: 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f  esults as keys o
4c10: 66 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 63  f a table with c
4c20: 75 72 73 6f 72 20 69 50 61 72 6d 0a 2a 2a 0a 2a  ursor iParm.**.*
4c30: 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20  *     SRT_Union 
4c40: 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
4c50: 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20  lts as a key in 
4c60: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
4c70: 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  e iParm.**.**   
4c80: 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20    SRT_Except    
4c90: 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73    Remove results
4ca0: 20 66 6f 72 6d 20 74 68 65 20 74 65 6d 70 6f 72   form the tempor
4cb0: 61 72 79 20 74 61 6c 62 65 20 69 50 61 72 6d 2e  ary talbe iParm.
4cc0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4cd0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
4ce0: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
4cf0: 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73  .  If any errors
4d00: 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65   are.** encounte
4d10: 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70  red, then an app
4d20: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d  ropriate error m
4d30: 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
4d40: 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72  n.** pParse->zEr
4d50: 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rMsg..**.** This
4d60: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f   routine does NO
4d70: 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63  T free the Selec
4d80: 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
4d90: 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63  ed in.  The.** c
4da0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
4db0: 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74  needs to do that
4dc0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 53  ..*/.int sqliteS
4dd0: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
4de0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
4df0: 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
4e00: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
4e10: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
4e20: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
4e30: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
4e40: 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20  coded. */.  int 
4e50: 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20  eDest,          
4e60: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 3a 20 53 52     /* One of: SR
4e70: 54 5f 43 61 6c 6c 62 61 63 6b 20 4d 65 6d 20 53  T_Callback Mem S
4e80: 65 74 20 55 6e 69 6f 6e 20 45 78 63 65 70 74 20  et Union Except 
4e90: 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 20  */.  int iParm  
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4eb0: 61 76 65 20 72 65 73 75 6c 74 20 69 6e 20 74 68  ave result in th
4ec0: 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  is memory locati
4ed0: 6f 6e 2c 20 69 66 20 3e 3d 30 20 2a 2f 0a 29 7b  on, if >=0 */.){
4ee0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
4ef0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20  eInfo *pWInfo;. 
4f00: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
4f10: 69 73 41 67 67 20 3d 20 30 3b 20 20 20 20 20 20  isAgg = 0;      
4f20: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73     /* True for s
4f30: 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65  elect lists like
4f40: 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20   "count(*)" */. 
4f50: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
4f60: 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
4f70: 6f 66 20 66 69 65 6c 64 73 20 74 6f 20 65 78 74  of fields to ext
4f80: 72 61 63 74 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  ract.  NULL mean
4f90: 73 20 22 2a 22 20 2a 2f 0a 20 20 49 64 4c 69 73  s "*" */.  IdLis
4fa0: 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
4fb0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
4fc0: 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
4fd0: 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
4fe0: 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
4ff0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
5000: 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
5010: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
5020: 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20  pOrderBy;    /* 
5030: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
5040: 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
5050: 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
5060: 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a  *pGroupBy;    /*
5070: 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
5080: 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
5090: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  LL */.  Expr *pH
50a0: 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  aving;         /
50b0: 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * The HAVING cla
50c0: 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
50d0: 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73  L */.  int isDis
50e0: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
50f0: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
5100: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
5110: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
5120: 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20  t distinct;     
5130: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
5140: 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
5150: 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69  tinct set */.  i
5160: 6e 74 20 62 61 73 65 3b 20 20 20 20 20 20 20 20  nt base;        
5170: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63        /* First c
5180: 75 72 73 6f 72 20 61 76 61 69 6c 61 62 6c 65 20  ursor available 
5190: 66 6f 72 20 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a  for use */..  /*
51a0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65   If there is are
51b0: 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71   a sequence of q
51c0: 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65  ueries, do the e
51d0: 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73  arlier ones firs
51e0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
51f0: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72  >pPrior ){.    r
5200: 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63  eturn multiSelec
5210: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65  t(pParse, p, eDe
5220: 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a  st, iParm);.  }.
5230: 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c  .  /* Make local
5240: 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
5250: 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68  arameters for th
5260: 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  is query..  */. 
5270: 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
5280: 53 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20  Src;.  pWhere = 
5290: 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 4f 72  p->pWhere;.  pOr
52a0: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
52b0: 72 42 79 3b 0a 20 20 70 47 72 6f 75 70 42 79 20  rBy;.  pGroupBy 
52c0: 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
52d0: 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
52e0: 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73 74 69  aving;.  isDisti
52f0: 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
5300: 6e 63 74 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20  nct;..  /* Save 
5310: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
5320: 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 6e 54 61  e of pParse->nTa
5330: 62 2e 20 20 52 65 73 74 6f 72 65 20 74 68 69 73  b.  Restore this
5340: 20 76 61 6c 75 65 20 62 65 66 6f 72 65 0a 20 20   value before.  
5350: 2a 2a 20 77 65 20 65 78 69 74 2e 0a 20 20 2a 2f  ** we exit..  */
5360: 0a 20 20 62 61 73 65 20 3d 20 70 50 61 72 73 65  .  base = pParse
5370: 2d 3e 6e 54 61 62 3b 0a 0a 20 20 2f 2a 20 0a 20  ->nTab;..  /* . 
5380: 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20   ** Do not even 
5390: 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72  attempt to gener
53a0: 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20  ate any code if 
53b0: 77 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  we have already 
53c0: 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73  seen.  ** errors
53d0: 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
53e0: 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a  tine starts..  *
53f0: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
5400: 6e 45 72 72 3e 30 20 29 20 72 65 74 75 72 6e 20  nErr>0 ) return 
5410: 31 3b 0a 20 20 73 71 6c 69 74 65 50 61 72 73 65  1;.  sqliteParse
5420: 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73 65  InfoReset(pParse
5430: 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70  );..  /* Look up
5440: 20 65 76 65 72 79 20 74 61 62 6c 65 20 69 6e 20   every table in 
5450: 74 68 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61  the table list a
5460: 6e 64 20 63 72 65 61 74 65 20 61 6e 20 61 70 70  nd create an app
5470: 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a 20 63 6f  ropriate.  ** co
5480: 6c 75 6d 6e 6c 69 73 74 20 69 6e 20 70 45 4c 69  lumnlist in pELi
5490: 73 74 20 69 66 20 74 68 65 72 65 20 69 73 6e 27  st if there isn'
54a0: 74 20 6f 6e 65 20 61 6c 72 65 61 64 79 2e 20 20  t one already.  
54b0: 28 54 68 65 20 70 61 72 73 65 72 20 6c 65 61 76  (The parser leav
54c0: 65 73 0a 20 20 2a 2a 20 61 20 4e 55 4c 4c 20 69  es.  ** a NULL i
54d0: 6e 20 74 68 65 20 70 45 4c 69 73 74 20 66 69 65  n the pEList fie
54e0: 6c 64 20 69 66 20 74 68 65 20 53 51 4c 20 73 61  ld if the SQL sa
54f0: 69 64 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  id "SELECT * FRO
5500: 4d 20 2e 2e 2e 22 29 0a 20 20 2a 2f 0a 20 20 69  M ...").  */.  i
5510: 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  f( fillInColumnL
5520: 69 73 74 28 70 50 61 72 73 65 2c 20 70 29 20 29  ist(pParse, p) )
5530: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
5540: 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70    }.  pEList = p
5550: 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20  ->pEList;..  /* 
5560: 41 6c 6c 6f 63 61 74 65 20 61 20 74 65 6d 70 6f  Allocate a tempo
5570: 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 75 73  rary table to us
5580: 65 20 66 6f 72 20 74 68 65 20 44 49 53 54 49 4e  e for the DISTIN
5590: 43 54 20 73 65 74 2c 20 69 66 0a 20 20 2a 2a 20  CT set, if.  ** 
55a0: 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 69 73  necessary.  This
55b0: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 65 61   must be done ea
55c0: 72 6c 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  rly to allocate 
55d0: 74 68 65 20 63 75 72 73 6f 72 20 62 65 66 6f 72  the cursor befor
55e0: 65 0a 20 20 2a 2a 20 61 6e 79 20 63 61 6c 6c 73  e.  ** any calls
55f0: 20 74 6f 20 73 71 6c 69 74 65 45 78 70 72 52 65   to sqliteExprRe
5600: 73 6f 6c 76 65 49 64 73 28 29 2e 0a 20 20 2a 2f  solveIds()..  */
5610: 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63  .  if( isDistinc
5620: 74 20 29 7b 0a 20 20 20 20 64 69 73 74 69 6e 63  t ){.    distinc
5630: 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
5640: 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
5650: 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a   distinct = -1;.
5660: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69    }..  /* If wri
5670: 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ting to memory o
5680: 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73  r generating a s
5690: 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73  et.  ** only a s
56a0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79  ingle column may
56b0: 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
56c0: 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d 53  .  if( (eDest==S
56d0: 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d  RT_Mem || eDest=
56e0: 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70 45 4c  =SRT_Set) && pEL
56f0: 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b 0a  ist->nExpr>1 ){.
5700: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
5710: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
5720: 72 4d 73 67 2c 20 22 6f 6e 6c 79 20 61 20 73 69  rMsg, "only a si
5730: 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f  ngle result allo
5740: 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20  wed for ".      
5750: 20 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20   "a SELECT that 
5760: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
5770: 70 72 65 73 73 69 6f 6e 22 2c 20 30 29 3b 0a 20  pression", 0);. 
5780: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
5790: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  +;.    return 1;
57a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 52 44 45 52  .  }..  /* ORDER
57b0: 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20 69   BY is ignored i
57c0: 66 20 77 65 20 61 72 65 20 6e 6f 74 20 73 65 6e  f we are not sen
57d0: 64 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ding the result 
57e0: 74 6f 20 61 20 63 61 6c 6c 62 61 63 6b 2e 0a 20  to a callback.. 
57f0: 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 21   */.  if( eDest!
5800: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
5810: 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20  .    pOrderBy = 
5820: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  0;.  }..  /* All
5830: 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f  ocate cursors fo
5840: 72 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  r "expr IN (SELE
5850: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
5860: 63 74 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  cts..  */.  for(
5870: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
5880: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
5890: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
58a0: 65 49 6e 53 65 6c 65 63 74 28 70 50 61 72 73 65  eInSelect(pParse
58b0: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
58c0: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Expr);.  }.  if(
58d0: 20 70 57 68 65 72 65 20 29 20 73 71 6c 69 74 65   pWhere ) sqlite
58e0: 45 78 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c  ExprResolveInSel
58f0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 57 68 65  ect(pParse, pWhe
5900: 72 65 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  re);.  if( pOrde
5910: 72 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  rBy ){.    for(i
5920: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
5930: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
5940: 20 20 20 73 71 6c 69 74 65 45 78 70 72 52 65 73     sqliteExprRes
5950: 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28 70 50 61  olveInSelect(pPa
5960: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
5970: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
5980: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 47 72 6f  }.  }.  if( pGro
5990: 75 70 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28  upBy ){.    for(
59a0: 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d  i=0; i<pGroupBy-
59b0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
59c0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 52 65      sqliteExprRe
59d0: 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28 70 50  solveInSelect(pP
59e0: 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
59f0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
5a00: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 48 61   }.  }.  if( pHa
5a10: 76 69 6e 67 20 29 20 73 71 6c 69 74 65 45 78 70  ving ) sqliteExp
5a20: 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74  rResolveInSelect
5a30: 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
5a40: 29 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  );..  /* At this
5a50: 20 70 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75 6c   point, we shoul
5a60: 64 20 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64  d have allocated
5a70: 20 61 6c 6c 20 74 68 65 20 63 75 72 73 6f 72 73   all the cursors
5a80: 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e 65   that we.  ** ne
5a90: 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 73 75 62  ed to handle sub
5aa0: 71 75 65 72 79 73 20 61 6e 64 20 74 65 6d 70 6f  querys and tempo
5ab0: 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 46 72  rary tables.  Fr
5ac0: 6f 6d 20 68 65 72 65 20 6f 6e 20 77 65 0a 20 20  om here on we.  
5ad0: 2a 2a 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  ** are committed
5ae0: 20 74 6f 20 6b 65 65 70 69 6e 67 20 74 68 65 20   to keeping the 
5af0: 73 61 6d 65 20 76 61 6c 75 65 20 66 6f 72 20 70  same value for p
5b00: 50 61 72 73 65 2d 3e 6e 54 61 62 2e 0a 20 20 2a  Parse->nTab..  *
5b10: 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76 65 20 74  *.  ** Resolve t
5b20: 68 65 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 61  he field names a
5b30: 6e 64 20 64 6f 20 61 20 73 65 6d 61 6e 74 69 63  nd do a semantic
5b40: 73 20 63 68 65 63 6b 20 6f 6e 20 61 6c 6c 20 74  s check on all t
5b50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  he expressions..
5b60: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
5b70: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
5b80: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
5b90: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
5ba0: 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  Ids(pParse, pTab
5bb0: 4c 69 73 74 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  List, pEList->a[
5bc0: 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
5bd0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
5be0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
5bf0: 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
5c00: 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  e, pEList->a[i].
5c10: 70 45 78 70 72 2c 20 31 2c 20 26 69 73 41 67 67  pExpr, 1, &isAgg
5c20: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
5c30: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
5c40: 20 69 66 28 20 70 57 68 65 72 65 20 29 7b 0a 20   if( pWhere ){. 
5c50: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
5c60: 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
5c70: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
5c80: 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 72  here) ){.      r
5c90: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
5ca0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
5cb0: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
5cc0: 57 68 65 72 65 2c 20 30 2c 20 30 29 20 29 7b 0a  Where, 0, 0) ){.
5cd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
5ce0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
5cf0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
5d00: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
5d10: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
5d20: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
5d30: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
5d40: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
5d50: 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  f( sqliteExprRes
5d60: 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
5d70: 70 54 61 62 4c 69 73 74 2c 20 70 45 29 20 29 7b  pTabList, pE) ){
5d80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5d90: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
5da0: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43   if( sqliteExprC
5db0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c  heck(pParse, pE,
5dc0: 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20   isAgg, 0) ){.  
5dd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
5de0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5df0: 7d 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79  }.  if( pGroupBy
5e00: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
5e10: 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
5e20: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
5e30: 45 78 70 72 20 2a 70 45 20 3d 20 70 47 72 6f 75  Expr *pE = pGrou
5e40: 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  pBy->a[i].pExpr;
5e50: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
5e60: 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
5e70: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
5e80: 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20  , pE) ){.       
5e90: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
5ea0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   }.      if( sql
5eb0: 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61  iteExprCheck(pPa
5ec0: 72 73 65 2c 20 70 45 2c 20 69 73 41 67 67 2c 20  rse, pE, isAgg, 
5ed0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  0) ){.        re
5ee0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
5ef0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
5f00: 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 69  pHaving ){.    i
5f10: 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  f( pGroupBy==0 )
5f20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  {.      sqliteSe
5f30: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
5f40: 3e 7a 45 72 72 4d 73 67 2c 20 22 61 20 47 52 4f  >zErrMsg, "a GRO
5f50: 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  UP BY clause is 
5f60: 72 65 71 75 69 72 65 64 20 22 0a 20 20 20 20 20  required ".     
5f70: 20 20 20 20 22 62 65 66 6f 72 65 20 48 41 56 49      "before HAVI
5f80: 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  NG", 0);.      p
5f90: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
5fa0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
5fb0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
5fc0: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
5fd0: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
5fe0: 73 74 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a  st, pHaving) ){.
5ff0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
6000: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
6010: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
6020: 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 69  arse, pHaving, i
6030: 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20  sAgg, 0) ){.    
6040: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
6050: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61  }.  }..  /* Do a
6060: 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 67  n analysis of ag
6070: 67 72 65 67 61 74 65 20 65 78 70 72 65 73 73 69  gregate expressi
6080: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
6090: 69 73 41 67 67 20 29 7b 0a 20 20 20 20 66 6f 72  isAgg ){.    for
60a0: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
60b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
60c0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
60d0: 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
60e0: 65 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  es(pParse, pELis
60f0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
6100: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
6110: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
6120: 7d 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  }.    if( pGroup
6130: 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  By ){.      for(
6140: 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d  i=0; i<pGroupBy-
6150: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
6160: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6170: 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
6180: 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 47  gates(pParse, pG
6190: 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
61a0: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
61b0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
61c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
61d0: 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76 69   }.    if( pHavi
61e0: 6e 67 20 26 26 20 73 71 6c 69 74 65 45 78 70 72  ng && sqliteExpr
61f0: 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
6200: 73 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  s(pParse, pHavin
6210: 67 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  g) ){.      retu
6220: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
6230: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
6240: 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
6250: 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
6260: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
6270: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
6280: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
6290: 69 74 65 56 64 62 65 43 72 65 61 74 65 28 70 50  iteVdbeCreate(pP
62a0: 61 72 73 65 2d 3e 64 62 2d 3e 70 42 65 29 3b 0a  arse->db->pBe);.
62b0: 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30 20 29    }.  if( v==0 )
62c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
62d0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
62e0: 45 72 72 4d 73 67 2c 20 22 6f 75 74 20 6f 66 20  ErrMsg, "out of 
62f0: 6d 65 6d 6f 72 79 22 2c 20 30 29 3b 0a 20 20 20  memory", 0);.   
6300: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
6310: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
6320: 20 7d 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42   }.  if( pOrderB
6330: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  y ){.    sqliteV
6340: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
6350: 6f 72 74 4f 70 65 6e 2c 20 30 2c 20 30 2c 20 30  ortOpen, 0, 0, 0
6360: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
6370: 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
6380: 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c  names if we will
6390: 20 62 65 20 75 73 69 6e 67 20 69 6e 20 74 68 65   be using in the
63a0: 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73   callback.  This
63b0: 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b  .  ** step is sk
63c0: 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74  ipped if the out
63d0: 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20  put is going to 
63e0: 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d  a table or a mem
63f0: 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2f 0a 20  ory cell..  */. 
6400: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
6410: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
6420: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
6430: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
6440: 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20  List, pEList);. 
6450: 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74   }..  /* Reset t
6460: 68 65 20 61 67 67 72 65 67 61 74 6f 72 0a 20 20  he aggregator.  
6470: 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29  */.  if( isAgg )
6480: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
6490: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 52  AddOp(v, OP_AggR
64a0: 65 73 65 74 2c 20 30 2c 20 70 50 61 72 73 65 2d  eset, 0, pParse-
64b0: 3e 6e 41 67 67 2c 20 30 2c 20 30 29 3b 0a 20 20  >nAgg, 0, 0);.  
64c0: 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
64d0: 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  ze the memory ce
64e0: 6c 6c 20 74 6f 20 4e 55 4c 4c 0a 20 20 2a 2f 0a  ll to NULL.  */.
64f0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
6500: 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69  _Mem ){.    sqli
6510: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6520: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 2c 20 30 2c  P_Null, 0, 0, 0,
6530: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
6540: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
6550: 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20  emStore, iParm, 
6560: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  0, 0, 0);.  }.. 
6570: 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   /* Begin the da
6580: 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f  tabase scan.  */
6590: 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63  .  if( isDistinc
65a0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  t ){.    sqliteV
65b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
65c0: 70 65 6e 2c 20 64 69 73 74 69 6e 63 74 2c 20 31  pen, distinct, 1
65d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70  , 0, 0);.  }.  p
65e0: 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 57 68  WInfo = sqliteWh
65f0: 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
6600: 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
6610: 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 57 49  e, 0);.  if( pWI
6620: 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  nfo==0 ) return 
6630: 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68 65  1;..  /* Use the
6640: 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
6650: 6c 6f 6f 70 20 69 66 20 77 65 20 61 72 65 20 6e  loop if we are n
6660: 6f 74 20 64 65 61 6c 69 6e 67 20 77 69 74 68 0a  ot dealing with.
6670: 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73 0a    ** aggregates.
6680: 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67    */.  if( !isAg
6690: 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 65 6c  g ){.    if( sel
66a0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
66b0: 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20  rse, pEList, 0, 
66c0: 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73  0, pOrderBy, dis
66d0: 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 20 69 50  tinct, eDest, iP
66e0: 61 72 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  arm,.           
66f0: 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
6700: 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e  >iContinue, pWIn
6710: 66 6f 2d 3e 69 42 72 65 61 6b 29 20 29 7b 0a 20  fo->iBreak) ){. 
6720: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
6730: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6740: 49 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  If we are dealin
6750: 67 20 77 69 74 68 20 61 67 67 72 65 67 61 74 65  g with aggregate
6760: 73 2c 20 74 68 65 6e 20 74 6f 20 74 68 65 20 73  s, then to the s
6770: 70 65 63 69 61 6c 20 61 67 67 72 65 67 61 74 65  pecial aggregate
6780: 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  .  ** processing
6790: 2e 20 20 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  .  .  */.  else{
67a0: 0a 20 20 20 20 69 6e 74 20 64 6f 46 6f 63 75 73  .    int doFocus
67b0: 3b 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  ;.    if( pGroup
67c0: 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  By ){.      for(
67d0: 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d  i=0; i<pGroupBy-
67e0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
67f0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
6800: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
6810: 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  oupBy->a[i].pExp
6820: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
6830: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6840: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c  p(v, OP_MakeKey,
6850: 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
6860: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
6870: 20 20 64 6f 46 6f 63 75 73 20 3d 20 31 3b 0a 20    doFocus = 1;. 
6880: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6890: 64 6f 46 6f 63 75 73 20 3d 20 30 3b 0a 20 20 20  doFocus = 0;.   
68a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
68b0: 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29  arse->nAgg; i++)
68c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
68d0: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69  Parse->aAgg[i].i
68e0: 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sAgg ){.        
68f0: 20 20 64 6f 46 6f 63 75 73 20 3d 20 31 3b 0a 20    doFocus = 1;. 
6900: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
6910: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6920: 7d 0a 20 20 20 20 20 20 69 66 28 20 64 6f 46 6f  }.      if( doFo
6930: 63 75 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  cus ){.        s
6940: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6950: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
6960: 30 2c 20 22 22 2c 20 30 29 3b 0a 20 20 20 20 20  0, "", 0);.     
6970: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
6980: 20 64 6f 46 6f 63 75 73 20 29 7b 0a 20 20 20 20   doFocus ){.    
6990: 20 20 69 6e 74 20 6c 62 6c 31 20 3d 20 73 71 6c    int lbl1 = sql
69a0: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
69b0: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
69c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
69d0: 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 6c 62  _AggFocus, 0, lb
69e0: 6c 31 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  l1, 0, 0);.     
69f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
6a00: 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a  se->nAgg; i++){.
6a10: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
6a20: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67  se->aAgg[i].isAg
6a30: 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  g ) continue;.  
6a40: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
6a50: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 50 61  Code(pParse, pPa
6a60: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78  rse->aAgg[i].pEx
6a70: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  pr);.        sql
6a80: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6a90: 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69 2c  OP_AggSet, 0, i,
6aa0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
6ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6ac0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
6ad0: 6c 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lbl1);.    }.   
6ae0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
6af0: 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a  se->nAgg; i++){.
6b00: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a        Expr *pE;.
6b10: 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20        int op;.  
6b20: 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d      if( !pParse-
6b30: 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29  >aAgg[i].isAgg )
6b40: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6b50: 20 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 41   pE = pParse->aA
6b60: 67 67 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  gg[i].pExpr;.   
6b70: 20 20 20 69 66 28 20 70 45 3d 3d 30 20 29 7b 0a     if( pE==0 ){.
6b80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
6b90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
6ba0: 67 49 6e 63 72 2c 20 31 2c 20 69 2c 20 30 2c 20  gIncr, 1, i, 0, 
6bb0: 30 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  0);.        cont
6bc0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
6bd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
6be0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
6bf0: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ION );.      ass
6c00: 65 72 74 28 20 70 45 2d 3e 70 4c 69 73 74 21 3d  ert( pE->pList!=
6c10: 30 20 26 26 20 70 45 2d 3e 70 4c 69 73 74 2d 3e  0 && pE->pList->
6c20: 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20  nExpr==1 );.    
6c30: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
6c40: 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69  (pParse, pE->pLi
6c50: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
6c60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6c70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
6c80: 47 65 74 2c 20 30 2c 20 69 2c 20 30 2c 20 30 29  Get, 0, i, 0, 0)
6c90: 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  ;.      switch( 
6ca0: 70 45 2d 3e 69 46 69 65 6c 64 20 29 7b 0a 20 20  pE->iField ){.  
6cb0: 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 4d 69        case FN_Mi
6cc0: 6e 3a 20 20 6f 70 20 3d 20 4f 50 5f 4d 69 6e 3b  n:  op = OP_Min;
6cd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6ce0: 20 20 63 61 73 65 20 46 4e 5f 4d 61 78 3a 20 20    case FN_Max:  
6cf0: 6f 70 20 3d 20 4f 50 5f 4d 61 78 3b 20 20 20 62  op = OP_Max;   b
6d00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
6d10: 73 65 20 46 4e 5f 41 76 67 3a 20 20 6f 70 20 3d  se FN_Avg:  op =
6d20: 20 4f 50 5f 41 64 64 3b 20 20 20 62 72 65 61 6b   OP_Add;   break
6d30: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 46  ;.        case F
6d40: 4e 5f 53 75 6d 3a 20 20 6f 70 20 3d 20 4f 50 5f  N_Sum:  op = OP_
6d50: 41 64 64 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  Add;   break;.  
6d60: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
6d70: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  teVdbeAddOp(v, o
6d80: 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  p, 0, 0, 0, 0);.
6d90: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6da0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 53  AddOp(v, OP_AggS
6db0: 65 74 2c 20 30 2c 20 69 2c 20 30 2c 20 30 29 3b  et, 0, i, 0, 0);
6dc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
6dd0: 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61  * End the databa
6de0: 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  se scan loop..  
6df0: 2a 2f 0a 20 20 73 71 6c 69 74 65 57 68 65 72 65  */.  sqliteWhere
6e00: 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20  End(pWInfo);..  
6e10: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 70 72 6f  /* If we are pro
6e20: 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74  cessing aggregat
6e30: 65 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 73  es, we need to s
6e40: 65 74 20 75 70 20 61 20 73 65 63 6f 6e 64 20 6c  et up a second l
6e50: 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72 20 61 6c  oop.  ** over al
6e60: 6c 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  l of the aggrega
6e70: 74 65 20 76 61 6c 75 65 73 20 61 6e 64 20 70 72  te values and pr
6e80: 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20 20 2a 2f  ocess them..  */
6e90: 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a  .  if( isAgg ){.
6ea0: 20 20 20 20 69 6e 74 20 65 6e 64 61 67 67 20 3d      int endagg =
6eb0: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
6ec0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74  abel(v);.    int
6ed0: 20 73 74 61 72 74 61 67 67 3b 0a 20 20 20 20 73   startagg;.    s
6ee0: 74 61 72 74 61 67 67 20 3d 20 73 71 6c 69 74 65  tartagg = sqlite
6ef0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6f00: 41 67 67 4e 65 78 74 2c 20 30 2c 20 65 6e 64 61  AggNext, 0, enda
6f10: 67 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70  gg, 0, 0);.    p
6f20: 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20  Parse->useAgg = 
6f30: 31 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69  1;.    if( pHavi
6f40: 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
6f50: 74 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  teExprIfFalse(pP
6f60: 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73  arse, pHaving, s
6f70: 74 61 72 74 61 67 67 29 3b 0a 20 20 20 20 7d 0a  tartagg);.    }.
6f80: 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e      if( selectIn
6f90: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
6fa0: 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
6fb0: 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74  rderBy, distinct
6fc0: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 0a  , eDest, iParm,.
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fe0: 20 20 20 20 73 74 61 72 74 61 67 67 2c 20 65 6e      startagg, en
6ff0: 64 61 67 67 29 20 29 7b 0a 20 20 20 20 20 20 72  dagg) ){.      r
7000: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
7010: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7020: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
7030: 2c 20 73 74 61 72 74 61 67 67 2c 20 30 2c 20 30  , startagg, 0, 0
7040: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
7050: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f  eAddOp(v, OP_Noo
7060: 70 2c 20 30 2c 20 30 2c 20 30 2c 20 65 6e 64 61  p, 0, 0, 0, enda
7070: 67 67 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  gg);.    pParse-
7080: 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 20 20 7d  >useAgg = 0;.  }
7090: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
70a0: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
70b0: 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e  lause, then we n
70c0: 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20  eed to sort the 
70d0: 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64  results.  ** and
70e0: 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68   send them to th
70f0: 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62  e callback one b
7100: 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  y one..  */.  if
7110: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
7120: 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
7130: 69 6c 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  il(v, pEList->nE
7140: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 70 50 61 72  xpr);.  }.  pPar
7150: 73 65 2d 3e 6e 54 61 62 20 3d 20 62 61 73 65 3b  se->nTab = base;
7160: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a     .  return 0;.}.