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

Artifact 21d1097e32e0a8430c286309817be33b734eab9d:


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 36   select.c,v 1.16
0420: 20 32 30 30 30 2f 30 36 2f 30 37 20 32 33 3a 35   2000/06/07 23:5
0430: 31 3a 35 30 20 64 72 68 20 45 78 70 20 24 0a 2a  1:50 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: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
34d0: 72 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  r;.  Vdbe *v;.. 
34e0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
34f0: 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
3500: 42 59 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  BY clause on pri
3510: 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
3520: 79 20 74 68 65 20 0a 20 20 2a 2a 20 6c 61 73 74  y the .  ** last
3530: 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73   SELECT in the s
3540: 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61  eries may have a
3550: 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 2a 2f  n ORDER BY..  */
3560: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
3570: 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 50 72  rior!=0 );.  pPr
3580: 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
3590: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
35a0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
35b0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
35c0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
35d0: 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
35e0: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
35f0: 65 72 20 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  er ",.      sele
3600: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 2c  ctOpName(p->op),
3610: 20 22 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 20   " not before", 
3620: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
3630: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
3640: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
3650: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
3660: 65 20 61 20 76 61 6c 69 64 20 71 75 65 72 79 20  e a valid query 
3670: 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c  engine.  If not,
3680: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
3690: 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
36a0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
36b0: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
36c0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f  ) return 1;..  /
36d0: 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 55 4e  * Process the UN
36e0: 49 4f 4e 20 6f 72 20 49 4e 54 45 52 53 45 43 54  ION or INTERSECT
36f0: 49 4f 4e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ION.  */.  switc
3700: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
3710: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 0a 20 20 20  case TK_ALL:.   
3720: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
3730: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49  .    case TK_UNI
3740: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ON: {.      int 
3750: 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20  unionTab;    /* 
3760: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
3770: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
3780: 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73  able holding res
3790: 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ult */.      int
37a0: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   op;          /*
37b0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f   One of the SRT_
37c0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61   operations to a
37d0: 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a  pply to self */.
37e0: 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f        int priorO
37f0: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52  p;     /* The SR
3800: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  T_ operation to 
3810: 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73  apply to prior s
3820: 65 6c 65 63 74 73 20 2a 2f 0a 0a 20 20 20 20 20  elects */..     
3830: 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70   priorOp = p->op
3840: 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54  ==TK_ALL ? SRT_T
3850: 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e  able : SRT_Union
3860: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
3870: 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t==priorOp ){.  
3880: 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20        /* We can 
3890: 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72  reuse a temporar
38a0: 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  y table generate
38b0: 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f  d by a SELECT to
38c0: 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   our.        ** 
38d0: 72 69 67 68 74 2e 20 20 54 68 69 73 20 61 6c 73  right.  This als
38e0: 6f 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 6e  o means we are n
38f0: 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ot the right-mos
3900: 74 20 73 65 6c 65 63 74 20 61 6e 64 20 73 6f 0a  t select and so.
3910: 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 63 61          ** we ca
3920: 6e 6e 6f 74 20 68 61 76 65 20 61 6e 20 4f 52 44  nnot have an ORD
3930: 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20  ER BY clause.   
3940: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
3950: 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d  unionTab = iParm
3960: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
3970: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
3980: 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
3990: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77  .        /* We w
39a0: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61  ill need to crea
39b0: 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f  te our own tempo
39c0: 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f  rary table to ho
39d0: 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ld the.        *
39e0: 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
39f0: 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20  esults..        
3a00: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
3a10: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
3a20: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66  ab++;.        if
3a30: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 0a 20  ( p->pOrderBy . 
3a40: 20 20 20 20 20 20 20 26 26 20 6d 61 74 63 68 4f         && matchO
3a50: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70  rderbyToColumn(p
3a60: 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
3a70: 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c  derBy, unionTab,
3a80: 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   1) ){.         
3a90: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
3aa0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
3ab0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3ac0: 4f 50 5f 4f 70 65 6e 2c 20 75 6e 69 6f 6e 54 61  OP_Open, unionTa
3ad0: 62 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 20  b, 1, 0, 0);.   
3ae0: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d       if( p->op!=
3af0: 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20  TK_ALL ){.      
3b00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3b10: 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44  dOp(v, OP_KeyAsD
3b20: 61 74 61 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31  ata, unionTab, 1
3b30: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
3b40: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
3b50: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
3b60: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
3b70: 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20  to our left.    
3b80: 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
3b90: 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61  sqliteSelect(pPa
3ba0: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 72 69  rse, pPrior, pri
3bb0: 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b  orOp, unionTab);
3bc0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
3bd0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
3be0: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
3bf0: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
3c00: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a  tement.      */.
3c10: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d        switch( p-
3c20: 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >op ){.         
3c30: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
3c40: 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74   op = SRT_Except
3c50: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
3c60: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
3c70: 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e  N:   op = SRT_Un
3c80: 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ion;    break;. 
3c90: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
3ca0: 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52  ALL:     op = SR
3cb0: 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61  T_Table;    brea
3cc0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3cd0: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
3ce0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
3cf0: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
3d00: 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 29  p, op, unionTab)
3d10: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
3d20: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
3d30: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
3d40: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  n rc;..      /* 
3d50: 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61  Convert the data
3d60: 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
3d70: 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61  y table into wha
3d80: 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20  tever form.     
3d90: 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77   ** it is that w
3da0: 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64  e currently need
3db0: 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20  ..      */      
3dc0: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
3dd0: 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20  !=priorOp ){.   
3de0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
3df0: 69 42 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20  iBreak;.        
3e00: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
3e10: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 67 65 6e  t );.        gen
3e20: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
3e30: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70  (pParse, 0, p->p
3e40: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
3e50: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 56  iBreak = sqliteV
3e60: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
3e70: 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  .        iCont =
3e80: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3e90: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
3ea0: 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 2c 20 30  onTab, iBreak, 0
3eb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 63  , 0);.        rc
3ec0: 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f   = selectInnerLo
3ed0: 6f 70 28 70 50 61 72 73 65 2c 20 30 2c 20 75 6e  op(pParse, 0, un
3ee0: 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73  ionTab, p->pELis
3ef0: 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  t->nExpr,.      
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f10: 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72         p->pOrder
3f20: 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69  By, -1, eDest, i
3f30: 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20  Parm, .         
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f50: 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61      iCont, iBrea
3f60: 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k);.        if( 
3f70: 72 63 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  rc ) return 1;. 
3f80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
3f90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
3fa0: 6f 2c 20 30 2c 20 69 43 6f 6e 74 2c 20 30 2c 20  o, 0, iCont, 0, 
3fb0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
3fc0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3fd0: 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61  P_Close, unionTa
3fe0: 62 2c 20 30 2c 20 30 2c 20 69 42 72 65 61 6b 29  b, 0, 0, iBreak)
3ff0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
4000: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
4010: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53         generateS
4020: 6f 72 74 54 61 69 6c 28 76 2c 20 70 2d 3e 70 45  ortTail(v, p->pE
4030: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
4040: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4050: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4060: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
4070: 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20  NTERSECT: {.    
4080: 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
4090: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e  ;.      int iCon
40a0: 74 2c 20 69 42 72 65 61 6b 3b 0a 0a 20 20 20 20  t, iBreak;..    
40b0: 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69    /* INTERSECT i
40c0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
40d0: 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63   the others sinc
40e0: 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20  e it requires.  
40f0: 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f      ** two tempo
4100: 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65  rary tables.  He
4110: 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f  nce it has its o
4120: 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 65  wn case.  Begine
4130: 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c  .      ** by all
4140: 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c  ocating the tabl
4150: 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e  es we will need.
4160: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
4170: 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
4180: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62  Tab++;.      tab
4190: 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  2 = pParse->nTab
41a0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
41b0: 3e 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74  >pOrderBy && mat
41c0: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
41d0: 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e 70 4f  n(pParse,p,p->pO
41e0: 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29 20 29  rderBy,tab1,1) )
41f0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
4200: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
4210: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4220: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20 74 61  p(v, OP_Open, ta
4230: 62 31 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20  b1, 1, 0, 0);.  
4240: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4250: 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44  dOp(v, OP_KeyAsD
4260: 61 74 61 2c 20 74 61 62 31 2c 20 31 2c 20 30 2c  ata, tab1, 1, 0,
4270: 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43   0);..      /* C
4280: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
4290: 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
42a0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
42b0: 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
42c0: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
42d0: 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65  iteSelect(pParse
42e0: 2c 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e  , pPrior, SRT_Un
42f0: 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20  ion, tab1);.    
4300: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
4310: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  n rc;..      /* 
4320: 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
4330: 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d   SELECT into tem
4340: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
4350: 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  b2".      */.   
4360: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4370: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20 74  Op(v, OP_Open, t
4380: 61 62 32 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20  ab2, 1, 0, 0);. 
4390: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
43a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73  ddOp(v, OP_KeyAs
43b0: 44 61 74 61 2c 20 74 61 62 32 2c 20 31 2c 20 30  Data, tab2, 1, 0
43c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  , 0);.      p->p
43d0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
43e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
43f0: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53 52  ct(pParse, p, SR
4400: 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 29 3b 0a  T_Union, tab2);.
4410: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
4420: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
4430: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
4440: 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  rc;..      /* Ge
4450: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
4460: 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
4470: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
4480: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
4490: 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
44a0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
44b0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
44c0: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
44d0: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
44e0: 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a   0, p->pEList);.
44f0: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
4500: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
4510: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
4520: 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  nt = sqliteVdbeA
4530: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
4540: 20 74 61 62 31 2c 20 69 42 72 65 61 6b 2c 20 30   tab1, iBreak, 0
4550: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
4560: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4570: 50 5f 4b 65 79 2c 20 74 61 62 31 2c 20 30 2c 20  P_Key, tab1, 0, 
4580: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
4590: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
45a0: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62  OP_NotFound, tab
45b0: 32 2c 20 69 43 6f 6e 74 2c 20 30 2c 20 30 29 3b  2, iCont, 0, 0);
45c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65  .      rc = sele
45d0: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
45e0: 73 65 2c 20 30 2c 20 74 61 62 31 2c 20 70 2d 3e  se, 0, tab1, p->
45f0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
4620: 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65  OrderBy, -1, eDe
4630: 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20  st, iParm, .    
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4650: 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20           iCont, 
4660: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 69  iBreak);.      i
4670: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 31  f( rc ) return 1
4680: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
4690: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
46a0: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 2c 20 30 2c  to, 0, iCont, 0,
46b0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
46c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
46d0: 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 2c  _Close, tab2, 0,
46e0: 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   0, iBreak);.   
46f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4700: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
4710: 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tab1, 0, 0, 0);.
4720: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
4730: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
4740: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
4750: 6c 28 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  l(v, p->pEList->
4760: 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  nExpr);.      }.
4770: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4780: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
4790: 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
47a0: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
47b0: 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
47c0: 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e  >nExpr!=pPrior->
47d0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
47e0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
47f0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
4800: 72 72 4d 73 67 2c 20 22 53 45 4c 45 43 54 73 20  rrMsg, "SELECTs 
4810: 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
4820: 72 69 67 68 74 20 6f 66 20 22 2c 0a 20 20 20 20  right of ",.    
4830: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
4840: 2d 3e 6f 70 29 2c 20 22 20 64 6f 20 6e 6f 74 20  ->op), " do not 
4850: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
4860: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
4870: 6f 6c 75 6d 6e 73 22 2c 20 30 29 3b 0a 20 20 20  olumns", 0);.   
4880: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
4890: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
48a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
48b0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
48c0: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69   code for the gi
48d0: 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65  ven SELECT state
48e0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
48f0: 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74  results are dist
4900: 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f  ributed in vario
4910: 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e  us ways dependin
4920: 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75  g on the.** valu
4930: 65 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 69  e of eDest and i
4940: 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
4950: 65 44 65 73 74 20 56 61 6c 75 65 20 20 20 20 20  eDest Value     
4960: 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20    Result.**     
4970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
49b0: 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20     SRT_Callback 
49c0: 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61     Invoke the ca
49d0: 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20  llback for each 
49e0: 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
49f0: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  t..**.**     SRT
4a00: 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f  _Mem         Sto
4a10: 72 65 20 66 69 72 73 74 20 72 65 73 75 6c 74 20  re first result 
4a20: 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  in memory cell i
4a30: 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
4a40: 52 54 5f 53 65 74 20 20 20 20 20 20 20 20 20 53  RT_Set         S
4a50: 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20  tore results as 
4a60: 6b 65 79 73 20 6f 66 20 61 20 74 61 62 6c 65 20  keys of a table 
4a70: 77 69 74 68 20 63 75 72 73 6f 72 20 69 50 61 72  with cursor iPar
4a80: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
4a90: 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72  Union       Stor
4aa0: 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b  e results as a k
4ab0: 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ey in a temporar
4ac0: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a  y table iParm.**
4ad0: 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65  .**     SRT_Exce
4ae0: 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72  pt      Remove r
4af0: 65 73 75 6c 74 73 20 66 6f 72 6d 20 74 68 65 20  esults form the 
4b00: 74 65 6d 70 6f 72 61 72 79 20 74 61 6c 62 65 20  temporary talbe 
4b10: 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  iParm..**.** Thi
4b20: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
4b30: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
4b40: 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
4b50: 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
4b60: 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
4b70: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
4b80: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
4b90: 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
4ba0: 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
4bb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
4bc0: 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
4bd0: 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
4be0: 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
4bf0: 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
4c00: 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
4c10: 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73  o that..*/.int s
4c20: 71 6c 69 74 65 53 65 6c 65 63 74 28 0a 20 20 50  qliteSelect(.  P
4c30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4c40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
4c50: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
4c60: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
4c70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
4c80: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
4c90: 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
4ca0: 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
4cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
4cc0: 6f 66 3a 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b  of: SRT_Callback
4cd0: 20 4d 65 6d 20 53 65 74 20 55 6e 69 6f 6e 20 45   Mem Set Union E
4ce0: 78 63 65 70 74 20 2a 2f 0a 20 20 69 6e 74 20 69  xcept */.  int i
4cf0: 50 61 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Parm            
4d00: 20 20 2f 2a 20 53 61 76 65 20 72 65 73 75 6c 74    /* Save result
4d10: 20 69 6e 20 74 68 69 73 20 6d 65 6d 6f 72 79 20   in this memory 
4d20: 6c 6f 63 61 74 69 6f 6e 2c 20 69 66 20 3e 3d 30  location, if >=0
4d30: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
4d40: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
4d50: 6e 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  nfo;.  Vdbe *v;.
4d60: 20 20 69 6e 74 20 69 73 41 67 67 20 3d 20 30 3b    int isAgg = 0;
4d70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
4d80: 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74   for select list
4d90: 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29  s like "count(*)
4da0: 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  " */.  ExprList 
4db0: 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a  *pEList;      /*
4dc0: 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 73 20   List of fields 
4dd0: 74 6f 20 65 78 74 72 61 63 74 2e 20 20 4e 55 4c  to extract.  NUL
4de0: 4c 20 6d 65 61 6e 73 20 22 2a 22 20 2a 2f 0a 20  L means "*" */. 
4df0: 20 49 64 4c 69 73 74 20 2a 70 54 61 62 4c 69 73   IdList *pTabLis
4e00: 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
4e10: 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
4e20: 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
4e30: 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
4e40: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
4e50: 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
4e60: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
4e70: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
4e80: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
4e90: 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
4ea0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
4eb0: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
4ec0: 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50      /* The GROUP
4ed0: 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
4ee0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
4ef0: 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20  pr *pHaving;    
4f00: 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49       /* The HAVI
4f10: 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  NG clause.  May 
4f20: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
4f30: 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20   isDistinct;    
4f40: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
4f50: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
4f60: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
4f70: 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74  /.  int distinct
4f80: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ;          /* Ta
4f90: 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74  ble to use for t
4fa0: 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20  he distinct set 
4fb0: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  */..  /* If ther
4fc0: 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65  e is are a seque
4fd0: 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20  nce of queries, 
4fe0: 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f  do the earlier o
4ff0: 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a  nes first..  */.
5000: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
5010: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75  ){.    return mu
5020: 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
5030: 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72  , p, eDest, iPar
5040: 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  m);.  }..  /* Ma
5050: 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20  ke local copies 
5060: 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  of the parameter
5070: 73 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  s for this query
5080: 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73  ..  */.  pTabLis
5090: 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
50a0: 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
50b0: 65 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  e;.  pOrderBy = 
50c0: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70  p->pOrderBy;.  p
50d0: 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
50e0: 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67  oupBy;.  pHaving
50f0: 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
5100: 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d   isDistinct = p-
5110: 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20  >isDistinct;..  
5120: 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  /* .  ** Do not 
5130: 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  even attempt to 
5140: 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64  generate any cod
5150: 65 20 69 66 20 77 65 20 68 61 76 65 20 61 6c 72  e if we have alr
5160: 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65  eady seen.  ** e
5170: 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69  rrors before thi
5180: 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
5190: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
51a0: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 72 65  rse->nErr>0 ) re
51b0: 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
51c0: 50 61 72 73 65 49 6e 66 6f 52 65 73 65 74 28 70  ParseInfoReset(p
51d0: 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  Parse);..  /* Lo
51e0: 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
51f0: 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c  e in the table l
5200: 69 73 74 20 61 6e 64 20 63 72 65 61 74 65 20 61  ist and create a
5210: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 20 20  n appropriate.  
5220: 2a 2a 20 63 6f 6c 75 6d 6e 6c 69 73 74 20 69 6e  ** columnlist in
5230: 20 70 45 4c 69 73 74 20 69 66 20 74 68 65 72 65   pEList if there
5240: 20 69 73 6e 27 74 20 6f 6e 65 20 61 6c 72 65 61   isn't one alrea
5250: 64 79 2e 20 20 28 54 68 65 20 70 61 72 73 65 72  dy.  (The parser
5260: 20 6c 65 61 76 65 73 0a 20 20 2a 2a 20 61 20 4e   leaves.  ** a N
5270: 55 4c 4c 20 69 6e 20 74 68 65 20 70 45 4c 69 73  ULL in the pELis
5280: 74 20 66 69 65 6c 64 20 69 66 20 74 68 65 20 53  t field if the S
5290: 51 4c 20 73 61 69 64 20 22 53 45 4c 45 43 54 20  QL said "SELECT 
52a0: 2a 20 46 52 4f 4d 20 2e 2e 2e 22 29 0a 20 20 2a  * FROM ...").  *
52b0: 2f 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f  /.  if( fillInCo
52c0: 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c  lumnList(pParse,
52d0: 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   p) ){.    retur
52e0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 45 4c 69 73  n 1;.  }.  pELis
52f0: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a  t = p->pEList;..
5300: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
5310: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
5320: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 44  to use for the D
5330: 49 53 54 49 4e 43 54 20 73 65 74 2c 20 69 66 0a  ISTINCT set, if.
5340: 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 20    ** necessary. 
5350: 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f   This must be do
5360: 6e 65 20 65 61 72 6c 79 20 74 6f 20 61 6c 6c 6f  ne early to allo
5370: 63 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20  cate the cursor 
5380: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 6e 79 20  before.  ** any 
5390: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 45  calls to sqliteE
53a0: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 29 2e  xprResolveIds().
53b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69  .  */.  if( isDi
53c0: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 64 69  stinct ){.    di
53d0: 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
53e0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65  >nTab++;.  }else
53f0: 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  {.    distinct =
5400: 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
5410: 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d  f writing to mem
5420: 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e  ory or generatin
5430: 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c  g a set.  ** onl
5440: 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  y a single colum
5450: 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e  n may be output.
5460: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 44 65  .  */.  if( (eDe
5470: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
5480: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 26  Dest==SRT_Set) &
5490: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
54a0: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  1 ){.    sqliteS
54b0: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
54c0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6f 6e 6c 79  ->zErrMsg, "only
54d0: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
54e0: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20   allowed for ". 
54f0: 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20        "a SELECT 
5500: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
5510: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 2c 20  an expression", 
5520: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
5530: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
5540: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
5550: 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f  ORDER BY is igno
5560: 72 65 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f  red if we are no
5570: 74 20 73 65 6e 64 69 6e 67 20 74 68 65 20 72 65  t sending the re
5580: 73 75 6c 74 20 74 6f 20 61 20 63 61 6c 6c 62 61  sult to a callba
5590: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ck..  */.  if( e
55a0: 44 65 73 74 21 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest!=SRT_Callba
55b0: 63 6b 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72  ck ){.    pOrder
55c0: 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  By = 0;.  }..  /
55d0: 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f  * Allocate curso
55e0: 72 73 20 66 6f 72 20 22 65 78 70 72 20 49 4e 20  rs for "expr IN 
55f0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
5600: 6e 73 74 72 75 63 74 73 2e 0a 20 20 2a 2f 0a 20  nstructs..  */. 
5610: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
5620: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
5630: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 52  .    sqliteExprR
5640: 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28 70  esolveInSelect(p
5650: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
5660: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [i].pExpr);.  }.
5670: 20 20 69 66 28 20 70 57 68 65 72 65 20 29 20 73    if( pWhere ) s
5680: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
5690: 49 6e 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  InSelect(pParse,
56a0: 20 70 57 68 65 72 65 29 3b 0a 20 20 69 66 28 20   pWhere);.  if( 
56b0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
56c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
56d0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
56e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
56f0: 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63  prResolveInSelec
5700: 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  t(pParse, pOrder
5710: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
5720: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5730: 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
5740: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f   for(i=0; i<pGro
5750: 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
5760: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  ){.      sqliteE
5770: 78 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65  xprResolveInSele
5780: 63 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  ct(pParse, pGrou
5790: 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  pBy->a[i].pExpr)
57a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
57b0: 28 20 70 48 61 76 69 6e 67 20 29 20 73 71 6c 69  ( pHaving ) sqli
57c0: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 6e 53  teExprResolveInS
57d0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 48  elect(pParse, pH
57e0: 61 76 69 6e 67 29 3b 0a 0a 20 20 2f 2a 20 52 65  aving);..  /* Re
57f0: 73 6f 6c 76 65 20 74 68 65 20 66 69 65 6c 64 20  solve the field 
5800: 6e 61 6d 65 73 20 61 6e 64 20 64 6f 20 61 20 73  names and do a s
5810: 65 6d 61 6e 74 69 63 73 20 63 68 65 63 6b 20 6f  emantics check o
5820: 6e 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73  n all the expres
5830: 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  sions..  */.  fo
5840: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
5850: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
5860: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
5870: 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
5880: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
5890: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
58a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
58b0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
58c0: 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63  ( sqliteExprChec
58d0: 6b 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  k(pParse, pEList
58e0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 31 2c  ->a[i].pExpr, 1,
58f0: 20 26 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20   &isAgg) ){.    
5900: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
5910: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65  }.  }.  if( pWhe
5920: 72 65 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  re ){.    if( sq
5930: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
5940: 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  ds(pParse, pTabL
5950: 69 73 74 2c 20 70 57 68 65 72 65 29 20 29 7b 0a  ist, pWhere) ){.
5960: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
5970: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
5980: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
5990: 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 30 2c  arse, pWhere, 0,
59a0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   0) ){.      ret
59b0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
59c0: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
59d0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
59e0: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
59f0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; i++){.      E
5a00: 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72  xpr *pE = pOrder
5a10: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
5a20: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5a30: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
5a40: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
5a50: 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pE) ){.        
5a60: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
5a70: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
5a80: 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
5a90: 73 65 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30  se, pE, isAgg, 0
5aa0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
5ab0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
5ac0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
5ad0: 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 66  GroupBy ){.    f
5ae0: 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70  or(i=0; i<pGroup
5af0: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
5b00: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
5b10: 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  = pGroupBy->a[i]
5b20: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
5b30: 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  ( sqliteExprReso
5b40: 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
5b50: 54 61 62 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a  TabList, pE) ){.
5b60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
5b70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5b80: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68  if( sqliteExprCh
5b90: 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20  eck(pParse, pE, 
5ba0: 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20  isAgg, 0) ){.   
5bb0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
5bc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5bd0: 0a 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29  .  if( pHaving )
5be0: 7b 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  {.    if( pGroup
5bf0: 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  By==0 ){.      s
5c00: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
5c10: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
5c20: 20 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61   "a GROUP BY cla
5c30: 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  use is required 
5c40: 22 0a 20 20 20 20 20 20 20 20 20 22 62 65 66 6f  ".         "befo
5c50: 72 65 20 48 41 56 49 4e 47 22 2c 20 30 29 3b 0a  re HAVING", 0);.
5c60: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
5c70: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75  rr++;.      retu
5c80: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
5c90: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65  if( sqliteExprRe
5ca0: 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
5cb0: 20 70 54 61 62 4c 69 73 74 2c 20 70 48 61 76 69   pTabList, pHavi
5cc0: 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ng) ){.      ret
5cd0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
5ce0: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43   if( sqliteExprC
5cf0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 48 61  heck(pParse, pHa
5d00: 76 69 6e 67 2c 20 69 73 41 67 67 2c 20 30 29 20  ving, isAgg, 0) 
5d10: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
5d20: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
5d30: 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69  /* Do an analysi
5d40: 73 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 65  s of aggregate e
5d50: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
5d60: 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a  .  if( isAgg ){.
5d70: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
5d80: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
5d90: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
5da0: 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
5db0: 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
5dc0: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
5dd0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
5de0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
5df0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
5e00: 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
5e10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47     for(i=0; i<pG
5e20: 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
5e30: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
5e40: 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79   sqliteExprAnaly
5e50: 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61  zeAggregates(pPa
5e60: 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
5e70: 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
5e80: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
5e90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5ea0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
5eb0: 28 20 70 48 61 76 69 6e 67 20 26 26 20 73 71 6c  ( pHaving && sql
5ec0: 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  iteExprAnalyzeAg
5ed0: 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
5ee0: 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20   pHaving) ){.   
5ef0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
5f00: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67   }.  }..  /* Beg
5f10: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  in generating co
5f20: 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 70  de..  */.  v = p
5f30: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5f40: 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
5f50: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
5f60: 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 72  e = sqliteVdbeCr
5f70: 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2d  eate(pParse->db-
5f80: 3e 70 42 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  >pBe);.  }.  if(
5f90: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   v==0 ){.    sql
5fa0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
5fb0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
5fc0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 20  out of memory", 
5fd0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
5fe0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
5ff0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
6000: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
6010: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6020: 76 2c 20 4f 50 5f 53 6f 72 74 4f 70 65 6e 2c 20  v, OP_SortOpen, 
6030: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  0, 0, 0, 0);.  }
6040: 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
6050: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20  column names if 
6060: 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
6070: 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   in the callback
6080: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65  .  This.  ** ste
6090: 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  p is skipped if 
60a0: 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
60b0: 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ing to a table o
60c0: 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  r a memory cell.
60d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
60e0: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
60f0: 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
6100: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
6110: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
6120: 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
6130: 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
6140: 61 74 6f 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ator.  */.  if( 
6150: 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 71 6c  isAgg ){.    sql
6160: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6170: 4f 50 5f 41 67 67 52 65 73 65 74 2c 20 30 2c 20  OP_AggReset, 0, 
6180: 70 50 61 72 73 65 2d 3e 6e 41 67 67 2c 20 30 2c  pParse->nAgg, 0,
6190: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   0);.  }..  /* I
61a0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
61b0: 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c  mory cell to NUL
61c0: 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  L.  */.  if( eDe
61d0: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20  st==SRT_Mem ){. 
61e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
61f0: 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  Op(v, OP_Null, 0
6200: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
6210: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6220: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
6230: 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 29 3b  iParm, 0, 0, 0);
6240: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
6250: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
6260: 61 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  an.  */.  if( is
6270: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
6280: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6290: 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20 64 69 73 74  v, OP_Open, dist
62a0: 69 6e 63 74 2c 20 31 2c 20 30 2c 20 30 29 3b 0a  inct, 1, 0, 0);.
62b0: 20 20 7d 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73    }.  pWInfo = s
62c0: 71 6c 69 74 65 57 68 65 72 65 42 65 67 69 6e 28  qliteWhereBegin(
62d0: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
62e0: 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  , pWhere, 0);.  
62f0: 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
6300: 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20  return 1;..  /* 
6310: 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  Use the standard
6320: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20 77   inner loop if w
6330: 65 20 61 72 65 20 6e 6f 74 20 64 65 61 6c 69 6e  e are not dealin
6340: 67 20 77 69 74 68 0a 20 20 2a 2a 20 61 67 67 72  g with.  ** aggr
6350: 65 67 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66  egates.  */.  if
6360: 28 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20  ( !isAgg ){.    
6370: 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  if( selectInnerL
6380: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 45 4c 69  oop(pParse, pELi
6390: 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72  st, 0, 0, pOrder
63a0: 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44  By, distinct, eD
63b0: 65 73 74 2c 20 69 50 61 72 6d 2c 0a 20 20 20 20  est, iParm,.    
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63d0: 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
63e0: 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
63f0: 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74  k) ){.       ret
6400: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
6410: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
6420: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 67   dealing with ag
6430: 67 72 65 67 61 74 65 73 2c 20 74 68 65 6e 20 74  gregates, then t
6440: 6f 20 74 68 65 20 73 70 65 63 69 61 6c 20 61 67  o the special ag
6450: 67 72 65 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f  gregate.  ** pro
6460: 63 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a  cessing.  .  */.
6470: 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20    else{.    int 
6480: 64 6f 46 6f 63 75 73 3b 0a 20 20 20 20 69 66 28  doFocus;.    if(
6490: 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
64a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47     for(i=0; i<pG
64b0: 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
64c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
64d0: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
64e0: 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
64f0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
6500: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
6510: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
6520: 61 6b 65 4b 65 79 2c 20 70 47 72 6f 75 70 42 79  akeKey, pGroupBy
6530: 2d 3e 6e 45 78 70 72 2c 20 30 2c 20 30 2c 20 30  ->nExpr, 0, 0, 0
6540: 29 3b 0a 20 20 20 20 20 20 64 6f 46 6f 63 75 73  );.      doFocus
6550: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
6560: 0a 20 20 20 20 20 20 64 6f 46 6f 63 75 73 20 3d  .      doFocus =
6570: 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   0;.      for(i=
6580: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67  0; i<pParse->nAg
6590: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
65a0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 61 41   if( !pParse->aA
65b0: 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 7b 0a 20  gg[i].isAgg ){. 
65c0: 20 20 20 20 20 20 20 20 20 64 6f 46 6f 63 75 73           doFocus
65d0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
65e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
65f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6600: 66 28 20 64 6f 46 6f 63 75 73 20 29 7b 0a 20 20  f( doFocus ){.  
6610: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6620: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
6630: 6e 67 2c 20 30 2c 20 30 2c 20 22 22 2c 20 30 29  ng, 0, 0, "", 0)
6640: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6650: 20 20 20 20 69 66 28 20 64 6f 46 6f 63 75 73 20      if( doFocus 
6660: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c  ){.      int lbl
6670: 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  1 = sqliteVdbeMa
6680: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
6690: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
66a0: 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73  p(v, OP_AggFocus
66b0: 2c 20 30 2c 20 6c 62 6c 31 2c 20 30 2c 20 30 29  , 0, lbl1, 0, 0)
66c0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
66d0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
66e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
66f0: 66 28 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  f( pParse->aAgg[
6700: 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69  i].isAgg ) conti
6710: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nue;.        sql
6720: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
6730: 73 65 2c 20 70 50 61 72 73 65 2d 3e 61 41 67 67  se, pParse->aAgg
6740: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
6750: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6760: 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 53 65 74  dOp(v, OP_AggSet
6770: 2c 20 30 2c 20 69 2c 20 30 2c 20 30 29 3b 0a 20  , 0, i, 0, 0);. 
6780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
6790: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
67a0: 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20  bel(v, lbl1);.  
67b0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
67c0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
67d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
67e0: 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e 74  r *pE;.      int
67f0: 20 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 21   op;.      if( !
6800: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
6810: 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65  isAgg ) continue
6820: 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 50 61  ;.      pE = pPa
6830: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78  rse->aAgg[i].pEx
6840: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
6850: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
6860: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6870: 2c 20 4f 50 5f 41 67 67 49 6e 63 72 2c 20 31 2c  , OP_AggIncr, 1,
6880: 20 69 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   i, 0, 0);.     
6890: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
68a0: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
68b0: 74 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  t( pE->op==TK_AG
68c0: 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
68d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
68e0: 70 4c 69 73 74 21 3d 30 20 26 26 20 70 45 2d 3e  pList!=0 && pE->
68f0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20  pList->nExpr==1 
6900: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  );.      sqliteE
6910: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
6920: 70 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pE->pList->a[0].
6930: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
6940: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6950: 20 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c 20 69   OP_AggGet, 0, i
6960: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
6970: 77 69 74 63 68 28 20 70 45 2d 3e 69 46 69 65 6c  witch( pE->iFiel
6980: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  d ){.        cas
6990: 65 20 46 4e 5f 4d 69 6e 3a 20 20 6f 70 20 3d 20  e FN_Min:  op = 
69a0: 4f 50 5f 4d 69 6e 3b 20 20 20 62 72 65 61 6b 3b  OP_Min;   break;
69b0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e  .        case FN
69c0: 5f 4d 61 78 3a 20 20 6f 70 20 3d 20 4f 50 5f 4d  _Max:  op = OP_M
69d0: 61 78 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ax;   break;.   
69e0: 20 20 20 20 20 63 61 73 65 20 46 4e 5f 41 76 67       case FN_Avg
69f0: 3a 20 20 6f 70 20 3d 20 4f 50 5f 41 64 64 3b 20  :  op = OP_Add; 
6a00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
6a10: 20 63 61 73 65 20 46 4e 5f 53 75 6d 3a 20 20 6f   case FN_Sum:  o
6a20: 70 20 3d 20 4f 50 5f 41 64 64 3b 20 20 20 62 72  p = OP_Add;   br
6a30: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
6a40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6a50: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  Op(v, op, 0, 0, 
6a60: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
6a70: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6a80: 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69 2c  OP_AggSet, 0, i,
6a90: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
6aa0: 7d 0a 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65  }...  /* End the
6ab0: 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
6ac0: 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  oop..  */.  sqli
6ad0: 74 65 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  teWhereEnd(pWInf
6ae0: 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  o);..  /* If we 
6af0: 61 72 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61  are processing a
6b00: 67 67 72 65 67 61 74 65 73 2c 20 77 65 20 6e 65  ggregates, we ne
6b10: 65 64 20 74 6f 20 73 65 74 20 75 70 20 61 20 73  ed to set up a s
6b20: 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20  econd loop.  ** 
6b30: 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  over all of the 
6b40: 61 67 67 72 65 67 61 74 65 20 76 61 6c 75 65 73  aggregate values
6b50: 20 61 6e 64 20 70 72 6f 63 65 73 73 20 74 68 65   and process the
6b60: 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  m..  */.  if( is
6b70: 41 67 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 65  Agg ){.    int e
6b80: 6e 64 61 67 67 20 3d 20 73 71 6c 69 74 65 56 64  ndagg = sqliteVd
6b90: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
6ba0: 20 20 20 20 69 6e 74 20 73 74 61 72 74 61 67 67      int startagg
6bb0: 3b 0a 20 20 20 20 73 74 61 72 74 61 67 67 20 3d  ;.    startagg =
6bc0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6bd0: 28 76 2c 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20  (v, OP_AggNext, 
6be0: 30 2c 20 65 6e 64 61 67 67 2c 20 30 2c 20 30 29  0, endagg, 0, 0)
6bf0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73  ;.    pParse->us
6c00: 65 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 69 66  eAgg = 1;.    if
6c10: 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
6c20: 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 46     sqliteExprIfF
6c30: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
6c40: 76 69 6e 67 2c 20 73 74 61 72 74 61 67 67 29 3b  ving, startagg);
6c50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
6c60: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
6c70: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 30  Parse, pEList, 0
6c80: 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64  , 0, pOrderBy, d
6c90: 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 20  istinct, eDest, 
6ca0: 69 50 61 72 6d 2c 0a 20 20 20 20 20 20 20 20 20  iParm,.         
6cb0: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74             start
6cc0: 61 67 67 2c 20 65 6e 64 61 67 67 29 20 29 7b 0a  agg, endagg) ){.
6cd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
6ce0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6cf0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6d00: 47 6f 74 6f 2c 20 30 2c 20 73 74 61 72 74 61 67  Goto, 0, startag
6d10: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  g, 0, 0);.    sq
6d20: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6d30: 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20   OP_Noop, 0, 0, 
6d40: 30 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20  0, endagg);.    
6d50: 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d  pParse->useAgg =
6d60: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
6d70: 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
6d80: 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
6d90: 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
6da0: 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
6db0: 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
6dc0: 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
6dd0: 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
6de0: 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
6df0: 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  y ){.    generat
6e00: 65 53 6f 72 74 54 61 69 6c 28 76 2c 20 70 45 4c  eSortTail(v, pEL
6e10: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d  ist->nExpr);.  }
6e20: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a     .  return 0;.}.