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

Artifact 25cada7cb2b0b4973b3e17c81ba1b1c887829f71:


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 33 20   select.c,v 1.3 
0420: 32 30 30 30 2f 30 35 2f 33 31 20 32 30 3a 30 30  2000/05/31 20:00
0430: 3a 35 32 20 64 72 68 20 45 78 70 20 24 0a 2a 2f  :52 drh Exp $.*/
0440: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0450: 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a 20  eInt.h".../*.** 
0460: 50 72 6f 63 65 73 73 20 61 20 53 45 4c 45 43 54  Process a SELECT
0470: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
0480: 6f 69 64 20 73 71 6c 69 74 65 53 65 6c 65 63 74  oid sqliteSelect
0490: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
04a0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
04b0: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
04c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
04d0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20  pEList,      /* 
04e0: 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 73 20 74  List of fields t
04f0: 6f 20 65 78 74 72 61 63 74 2e 20 20 4e 55 4c 4c  o extract.  NULL
0500: 20 6d 65 61 6e 73 20 22 2a 22 20 2a 2f 0a 20 20   means "*" */.  
0510: 49 64 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  IdList *pTabList
0520: 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ,      /* List o
0530: 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
0540: 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
0550: 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
0560: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
0570: 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
0580: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
0590: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
05a0: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
05b0: 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
05c0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
05d0: 64 69 73 74 69 6e 63 74 20 20 20 20 20 20 20 20  distinct        
05e0: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6f     /* If true, o
05f0: 6e 6c 79 20 6f 75 74 70 75 74 20 64 69 73 74 69  nly output disti
0600: 6e 63 74 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  nct results */.)
0610: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
0620: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
0630: 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  o;.  Vdbe *v;.  
0640: 69 6e 74 20 69 73 41 67 67 20 3d 20 30 3b 20 20  int isAgg = 0;  
0650: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
0660: 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
0670: 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
0680: 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  */..  if( pParse
0690: 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20  ->nErr>0 ) goto 
06a0: 73 65 6c 65 63 74 5f 63 6c 65 61 6e 75 70 3b 0a  select_cleanup;.
06b0: 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
06c0: 65 72 79 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ery table in the
06d0: 20 74 61 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a   table list..  *
06e0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
06f0: 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  TabList->nId; i+
0700: 2b 29 7b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  +){.    pTabList
0710: 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 73 71  ->a[i].pTab = sq
0720: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50  liteFindTable(pP
0730: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 4c 69  arse->db, pTabLi
0740: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
0750: 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
0760: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3d 3d 30 20  t->a[i].pTab==0 
0770: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
0780: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
0790: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73  ->zErrMsg, "no s
07a0: 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 0a 20  uch table: ", . 
07b0: 20 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74          pTabList
07c0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29  ->a[i].zName, 0)
07d0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
07e0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f  nErr++;.      go
07f0: 74 6f 20 73 65 6c 65 63 74 5f 63 6c 65 61 6e 75  to select_cleanu
0800: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  p;.    }.  }..  
0810: 2f 2a 20 49 66 20 74 68 65 20 6c 69 73 74 20 6f  /* If the list o
0820: 66 20 66 69 65 6c 64 73 20 74 6f 20 72 65 74 72  f fields to retr
0830: 69 65 76 65 20 69 73 20 22 2a 22 20 74 68 65 6e  ieve is "*" then
0840: 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68   replace it with
0850: 0a 20 20 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20  .  ** a list of 
0860: 61 6c 6c 20 66 69 65 6c 64 73 20 66 72 6f 6d 20  all fields from 
0870: 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  all tables..  */
0880: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
0890: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
08a0: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 49 64   i<pTabList->nId
08b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61  ; i++){.      Ta
08c0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
08d0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b  List->a[i].pTab;
08e0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
08f0: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
0900: 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
0910: 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65   *pExpr = sqlite
0920: 45 78 70 72 28 54 4b 5f 46 49 45 4c 44 2c 20 30  Expr(TK_FIELD, 0
0930: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
0940: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
0950: 20 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70   i;.        pExp
0960: 72 2d 3e 69 46 69 65 6c 64 20 3d 20 6a 3b 0a 20  r->iField = j;. 
0970: 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20         pEList = 
0980: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70  sqliteExprListAp
0990: 70 65 6e 64 28 70 45 4c 69 73 74 2c 20 70 45 78  pend(pEList, pEx
09a0: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  pr, 0);.      }.
09b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
09c0: 52 65 73 6f 6c 76 65 20 74 68 65 20 66 69 65 6c  Resolve the fiel
09d0: 64 20 6e 61 6d 65 73 20 61 6e 64 20 64 6f 20 61  d names and do a
09e0: 20 73 65 6d 61 6e 74 69 63 73 20 63 68 65 63 6b   semantics check
09f0: 20 6f 6e 20 61 6c 6c 20 74 68 65 20 65 78 70 72   on all the expr
0a00: 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  essions..  */.  
0a10: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
0a20: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
0a30: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
0a40: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
0a50: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
0a60: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
0a70: 72 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  r) ){.      goto
0a80: 20 73 65 6c 65 63 74 5f 63 6c 65 61 6e 75 70 3b   select_cleanup;
0a90: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
0aa0: 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70  qliteExprCheck(p
0ab0: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
0ac0: 5b 69 5d 2e 70 45 78 70 72 2c 20 31 2c 20 26 70  [i].pExpr, 1, &p
0ad0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 73 41 67  EList->a[i].isAg
0ae0: 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  g) ){.      goto
0af0: 20 73 65 6c 65 63 74 5f 63 6c 65 61 6e 75 70 3b   select_cleanup;
0b00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
0b10: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30   pEList->nExpr>0
0b20: 20 29 7b 0a 20 20 20 20 69 73 41 67 67 20 3d 20   ){.    isAgg = 
0b30: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 73 41  pEList->a[0].isA
0b40: 67 67 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  gg;.    for(i=1;
0b50: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
0b60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
0b70: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  ( pEList->a[i].i
0b80: 73 41 67 67 21 3d 69 73 41 67 67 20 29 7b 0a 20  sAgg!=isAgg ){. 
0b90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
0ba0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
0bb0: 7a 45 72 72 4d 73 67 2c 20 22 73 6f 6d 65 20 73  zErrMsg, "some s
0bc0: 65 6c 65 63 74 65 64 20 69 74 65 6d 73 20 61 72  elected items ar
0bd0: 65 20 61 67 67 72 65 67 61 74 65 73 20 22 0a 20  e aggregates ". 
0be0: 20 20 20 20 20 20 20 20 20 22 61 6e 64 20 6f 74           "and ot
0bf0: 68 65 72 73 20 61 72 65 20 6e 6f 74 22 2c 20 30  hers are not", 0
0c00: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
0c10: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
0c20: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 63     goto select_c
0c30: 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a  leanup;.      }.
0c40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0c50: 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 69 66  pWhere ){.    if
0c60: 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  ( sqliteExprReso
0c70: 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
0c80: 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 29  TabList, pWhere)
0c90: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
0ca0: 65 6c 65 63 74 5f 63 6c 65 61 6e 75 70 3b 0a 20  elect_cleanup;. 
0cb0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
0cc0: 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61  iteExprCheck(pPa
0cd0: 72 73 65 2c 20 70 57 68 65 72 65 2c 20 30 2c 20  rse, pWhere, 0, 
0ce0: 30 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  0) ){.      goto
0cf0: 20 73 65 6c 65 63 74 5f 63 6c 65 61 6e 75 70 3b   select_cleanup;
0d00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
0d10: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
0d20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
0d30: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
0d40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
0d50: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
0d60: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
0d70: 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  st, pOrderBy->a[
0d80: 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
0d90: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
0da0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
0db0: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
0dc0: 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
0dd0: 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
0de0: 69 5d 2e 70 45 78 70 72 2c 20 30 2c 20 30 29 20  i].pExpr, 0, 0) 
0df0: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
0e00: 73 65 6c 65 63 74 5f 63 6c 65 61 6e 75 70 3b 0a  select_cleanup;.
0e10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
0e20: 7d 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59  }..  /* ORDER BY
0e30: 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 74   is ignored if t
0e40: 68 69 73 20 69 73 20 61 6e 20 61 67 67 72 65 67  his is an aggreg
0e50: 61 74 65 20 71 75 65 72 79 20 6c 69 6b 65 20 63  ate query like c
0e60: 6f 75 6e 74 28 2a 29 0a 20 20 2a 2a 20 73 69 6e  ount(*).  ** sin
0e70: 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 72 6f 77 20  ce only one row 
0e80: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
0e90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41  ..  */.  if( isA
0ea0: 67 67 20 26 26 20 70 4f 72 64 65 72 42 79 20 29  gg && pOrderBy )
0eb0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72  {.    sqliteExpr
0ec0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4f 72 64 65  ListDelete(pOrde
0ed0: 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72  rBy);.    pOrder
0ee0: 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  By = 0;.  }..  /
0ef0: 2a 20 54 75 72 6e 20 6f 66 66 20 64 69 73 74 69  * Turn off disti
0f00: 6e 63 74 20 69 66 20 74 68 69 73 20 69 73 20 61  nct if this is a
0f10: 6e 20 61 67 67 72 65 67 61 74 65 0a 20 20 2a 2f  n aggregate.  */
0f20: 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a  .  if( isAgg ){.
0f30: 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 30      distinct = 0
0f40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
0f50: 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64  n generating cod
0f60: 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50  e..  */.  v = pP
0f70: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
0f80: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76  f( v==0 ){.    v
0f90: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
0fa0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 72 65   = sqliteVdbeCre
0fb0: 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  ate(pParse->db->
0fc0: 70 42 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pBe);.  }.  if( 
0fd0: 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  v==0 ) goto sele
0fe0: 63 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69 66  ct_cleanup;.  if
0ff0: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
1000: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
1010: 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4f 70 65 6e  p(v, OP_SortOpen
1020: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
1030: 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66   }..  /* Identif
1040: 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20  y column names. 
1050: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 56 64 62 65   */.  sqliteVdbe
1060: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
1070: 6d 6e 43 6f 75 6e 74 2c 20 70 45 4c 69 73 74 2d  mnCount, pEList-
1080: 3e 6e 45 78 70 72 2c 20 30 2c 20 30 2c 20 30 29  >nExpr, 0, 0, 0)
1090: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
10a0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
10b0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
10c0: 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d  .    if( pEList-
10d0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
10e0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
10f0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
1100: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74  zName;.      int
1110: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
1120: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
1130: 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 2c 20  lumnName, i, 0, 
1140: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
1150: 20 69 66 28 20 7a 4e 61 6d 65 5b 30 5d 3d 3d 27   if( zName[0]=='
1160: 5c 27 27 20 7c 7c 20 7a 4e 61 6d 65 5b 30 5d 3d  \'' || zName[0]=
1170: 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='"' ){.        
1180: 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74  sqliteVdbeDequot
1190: 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  eP3(v, addr);.  
11a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74      }.      cont
11b0: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
11c0: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
11d0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
11e0: 70 2d 3e 6f 70 21 3d 54 4b 5f 46 49 45 4c 44 20  p->op!=TK_FIELD 
11f0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4e  ){.      char zN
1200: 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73  ame[30];.      s
1210: 70 72 69 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 66  printf(zName, "f
1220: 69 65 6c 64 25 64 22 2c 20 69 2b 31 29 3b 0a 20  ield%d", i+1);. 
1230: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
1240: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
1250: 6e 4e 61 6d 65 2c 20 69 2c 20 30 2c 20 7a 4e 61  nName, i, 0, zNa
1260: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  me, 0);.    }els
1270: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  e{.      if( pTa
1280: 62 4c 69 73 74 2d 3e 6e 49 64 3e 31 20 29 7b 0a  bList->nId>1 ){.
1290: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
12a0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
12b0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
12c0: 54 61 62 4c 69 73 74 2d 3e 61 5b 70 2d 3e 69 54  TabList->a[p->iT
12d0: 61 62 6c 65 5d 2e 70 54 61 62 3b 0a 20 20 20 20  able].pTab;.    
12e0: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a      char *zTab;.
12f0: 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20  .        zTab = 
1300: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 2d 3e 69  pTabList->a[p->i
1310: 54 61 62 6c 65 5d 2e 7a 41 6c 69 61 73 3b 0a 20  Table].zAlias;. 
1320: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 3d         if( zTab=
1330: 3d 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62  =0 ) zTab = pTab
1340: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
1350: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
1360: 28 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22  (&zName, zTab, "
1370: 2e 22 2c 20 70 54 61 62 2d 3e 61 7a 43 6f 6c 5b  .", pTab->azCol[
1380: 70 2d 3e 69 46 69 65 6c 64 5d 2c 20 30 29 3b 0a  p->iField], 0);.
1390: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
13a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
13b0: 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 2c 20  lumnName, i, 0, 
13c0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
13d0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
13e0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
13f0: 65 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  e{.        Table
1400: 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73   *pTab = pTabLis
1410: 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  t->a[0].pTab;.  
1420: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
1430: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
1440: 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 2c 20 70 54  mnName, i, 0, pT
1450: 61 62 2d 3e 61 7a 43 6f 6c 5b 70 2d 3e 69 46 69  ab->azCol[p->iFi
1460: 65 6c 64 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  eld], 0);.      
1470: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1480: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1490: 20 73 74 61 63 6b 20 74 6f 20 63 6f 6e 74 61 69   stack to contai
14a0: 6e 20 61 67 67 72 65 67 61 74 65 20 73 65 65 64  n aggregate seed
14b0: 20 76 61 6c 75 65 73 0a 20 20 2a 2f 0a 20 20 69   values.  */.  i
14c0: 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
14d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
14e0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
14f0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
1500: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
1510: 70 72 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68  pr;.      switch
1520: 28 20 73 71 6c 69 74 65 46 75 6e 63 49 64 28 26  ( sqliteFuncId(&
1530: 70 2d 3e 74 6f 6b 65 6e 29 20 29 7b 0a 20 20 20  p->token) ){.   
1540: 20 20 20 20 20 63 61 73 65 20 46 4e 5f 4d 69 6e       case FN_Min
1550: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 46  :.        case F
1560: 4e 5f 4d 61 78 3a 20 7b 0a 20 20 20 20 20 20 20  N_Max: {.       
1570: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
1580: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
1590: 20 30 2c 20 30 2c 20 22 22 2c 20 30 29 3b 0a 20   0, 0, "", 0);. 
15a0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
15b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15c0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
15d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
15e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
15f0: 65 67 65 72 2c 20 30 2c 20 30 2c 20 30 2c 20 30  eger, 0, 0, 0, 0
1600: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
1610: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1620: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1630: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20  .  /* Begin the 
1640: 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20  database scan.  
1650: 2a 2f 0a 20 20 69 66 28 20 64 69 73 74 69 6e 63  */.  if( distinc
1660: 74 20 29 7b 0a 20 20 20 20 64 69 73 74 69 6e 63  t ){.    distinc
1670: 74 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 6e 49  t = pTabList->nI
1680: 64 2a 32 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74  d*2+1;.    sqlit
1690: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
16a0: 5f 4f 70 65 6e 2c 20 64 69 73 74 69 6e 63 74 2c  _Open, distinct,
16b0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 0, 0);.  }. 
16c0: 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
16d0: 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
16e0: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
16f0: 65 72 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ere, 0);.  if( p
1700: 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
1710: 73 65 6c 65 63 74 5f 63 6c 65 61 6e 75 70 3b 0a  select_cleanup;.
1720: 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72  .  /* Pull the r
1730: 65 71 75 65 73 74 65 64 20 66 69 65 6c 64 73 2e  equested fields.
1740: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41  .  */.  if( !isA
1750: 67 67 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  gg ){.    for(i=
1760: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
1770: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
1780: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
1790: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
17a0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
17b0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
17c0: 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c  he current resul
17d0: 74 20 69 73 20 6e 6f 74 20 64 69 73 74 69 6e 63  t is not distinc
17e0: 74 2c 20 73 63 72 69 70 74 20 74 68 65 20 72 65  t, script the re
17f0: 6d 61 69 6e 64 65 72 0a 20 20 2a 2a 20 6f 66 20  mainder.  ** of 
1800: 74 68 69 73 20 70 72 6f 63 65 73 73 69 6e 67 2e  this processing.
1810: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 69 73 74  .  */.  if( dist
1820: 69 6e 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  inct ){.    int 
1830: 69 73 44 69 73 74 69 6e 63 74 20 3d 20 73 71 6c  isDistinct = sql
1840: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
1850: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  (v);.    sqliteV
1860: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
1870: 61 6b 65 4b 65 79 2c 20 70 45 4c 69 73 74 2d 3e  akeKey, pEList->
1880: 6e 45 78 70 72 2c 20 31 2c 20 30 2c 20 30 29 3b  nExpr, 1, 0, 0);
1890: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
18a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74 69  ddOp(v, OP_Disti
18b0: 6e 63 74 2c 20 64 69 73 74 69 6e 63 74 2c 20 69  nct, distinct, i
18c0: 73 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 29  sDistinct, 0, 0)
18d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
18e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
18f0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31   pEList->nExpr+1
1900: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1910: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
1920: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
1930: 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
1940: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1950: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
1960: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c  OP_String, 0, 0,
1970: 20 22 22 2c 20 69 73 44 69 73 74 69 6e 63 74 29   "", isDistinct)
1980: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
1990: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 2c  AddOp(v, OP_Put,
19a0: 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c   distinct, 0, 0,
19b0: 20 30 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a   0);.  }.  .  /*
19c0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
19d0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
19e0: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 69 6e 76   then we can inv
19f0: 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  oke the callback
1a00: 0a 20 20 2a 2a 20 72 69 67 68 74 20 61 77 61 79  .  ** right away
1a10: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61  .  If there is a
1a20: 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 6e  n ORDER BY, then
1a30: 20 77 65 20 6e 65 65 64 20 74 6f 20 70 75 74 20   we need to put 
1a40: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 20 69 6e  the.  ** data in
1a50: 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
1a60: 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 2e  e sorter record.
1a70: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
1a80: 65 72 42 79 20 29 7b 0a 20 20 20 20 63 68 61 72  erBy ){.    char
1a90: 20 2a 7a 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20   *zSortOrder;.  
1aa0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
1ab0: 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65  p(v, OP_SortMake
1ac0: 52 65 63 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  Rec, pEList->nEx
1ad0: 70 72 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  pr, 0, 0, 0);.  
1ae0: 20 20 7a 53 6f 72 74 4f 72 64 65 72 20 3d 20 73    zSortOrder = s
1af0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 4f 72  qliteMalloc( pOr
1b00: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31  derBy->nExpr + 1
1b10: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 6f 72   );.    if( zSor
1b20: 74 4f 72 64 65 72 3d 3d 30 20 29 20 67 6f 74 6f  tOrder==0 ) goto
1b30: 20 73 65 6c 65 63 74 5f 63 6c 65 61 6e 75 70 3b   select_cleanup;
1b40: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1b50: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
1b60: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 6f   i++){.      zSo
1b70: 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72  rtOrder[i] = pOr
1b80: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 69 64 78 20  derBy->a[i].idx 
1b90: 3f 20 27 2d 27 20 3a 20 27 2b 27 3b 0a 20 20 20  ? '-' : '+';.   
1ba0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
1bb0: 65 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  e(pParse, pOrder
1bc0: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
1bd0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 6f 72 74  .    }.    zSort
1be0: 4f 72 64 65 72 5b 70 4f 72 64 65 72 42 79 2d 3e  Order[pOrderBy->
1bf0: 6e 45 78 70 72 5d 20 3d 20 30 3b 0a 20 20 20 20  nExpr] = 0;.    
1c00: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
1c10: 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 4b 65  v, OP_SortMakeKe
1c20: 79 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  y, pOrderBy->nEx
1c30: 70 72 2c 20 30 2c 20 7a 53 6f 72 74 4f 72 64 65  pr, 0, zSortOrde
1c40: 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
1c50: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
1c60: 5f 53 6f 72 74 50 75 74 2c 20 30 2c 20 30 2c 20  _SortPut, 0, 0, 
1c70: 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69  0, 0);.  }else i
1c80: 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
1c90: 69 6e 74 20 6e 20 3d 20 70 45 4c 69 73 74 2d 3e  int n = pEList->
1ca0: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
1cb0: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
1cc0: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
1cd0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
1ce0: 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 20  r;.      int id 
1cf0: 3d 20 73 71 6c 69 74 65 46 75 6e 63 49 64 28 26  = sqliteFuncId(&
1d00: 70 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  p->token);.     
1d10: 20 69 6e 74 20 6f 70 2c 20 70 31 3b 0a 20 20 20   int op, p1;.   
1d20: 20 20 20 69 66 28 20 6e 3e 31 20 29 7b 0a 20 20     if( n>1 ){.  
1d30: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
1d40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
1d50: 2c 20 6e 2d 31 2c 20 30 2c 20 30 2c 20 30 29 3b  , n-1, 0, 0, 0);
1d60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1d70: 66 28 20 69 64 21 3d 46 4e 5f 43 6f 75 6e 74 20  f( id!=FN_Count 
1d80: 26 26 20 70 2d 3e 70 4c 69 73 74 20 26 26 20 70  && p->pList && p
1d90: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 3d  ->pList->nExpr>=
1da0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
1db0: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
1dc0: 73 65 2c 20 70 2d 3e 70 4c 69 73 74 2d 3e 61 5b  se, p->pList->a[
1dd0: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
1de0: 20 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68 28   }.      switch(
1df0: 20 73 71 6c 69 74 65 46 75 6e 63 49 64 28 26 70   sqliteFuncId(&p
1e00: 2d 3e 74 6f 6b 65 6e 29 20 29 7b 0a 20 20 20 20  ->token) ){.    
1e10: 20 20 20 20 63 61 73 65 20 46 4e 5f 43 6f 75 6e      case FN_Coun
1e20: 74 3a 20 6f 70 20 3d 20 4f 50 5f 41 64 64 49 6d  t: op = OP_AddIm
1e30: 6d 3b 20 70 31 20 3d 20 31 3b 20 62 72 65 61 6b  m; p1 = 1; break
1e40: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 46  ;.        case F
1e50: 4e 5f 53 75 6d 3a 20 20 20 6f 70 20 3d 20 4f 50  N_Sum:   op = OP
1e60: 5f 41 64 64 3b 20 20 20 20 70 31 20 3d 20 30 3b  _Add;    p1 = 0;
1e70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1e80: 63 61 73 65 20 46 4e 5f 4d 69 6e 3a 20 20 20 6f  case FN_Min:   o
1e90: 70 20 3d 20 4f 50 5f 4d 69 6e 3b 20 20 20 20 70  p = OP_Min;    p
1ea0: 31 20 3d 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20  1 = 1; break;.  
1eb0: 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 4d 61        case FN_Ma
1ec0: 78 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 4d 61 78  x:   op = OP_Max
1ed0: 3b 20 20 20 20 70 31 20 3d 20 30 3b 20 62 72 65  ;    p1 = 0; bre
1ee0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1ef0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
1f00: 70 28 76 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20  p(v, op, p1, 0, 
1f10: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
1f20: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1f30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1f40: 43 61 6c 6c 62 61 63 6b 2c 20 70 45 4c 69 73 74  Callback, pEList
1f50: 2d 3e 6e 45 78 70 72 2c 20 30 2c 20 30 2c 20 30  ->nExpr, 0, 0, 0
1f60: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64  );.  }..  /* End
1f70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1f80: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20  an loop..  */.  
1f90: 73 71 6c 69 74 65 57 68 65 72 65 45 6e 64 28 70  sqliteWhereEnd(p
1fa0: 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66  WInfo);..  /* If
1fb0: 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
1fc0: 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
1fd0: 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
1fe0: 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
1ff0: 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
2000: 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
2010: 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
2020: 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
2030: 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64  y ){.    int end
2040: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
2050: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
2060: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c  nt addr;.    sql
2070: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
2080: 4f 50 5f 53 6f 72 74 2c 20 30 2c 20 30 2c 20 30  OP_Sort, 0, 0, 0
2090: 2c 20 30 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  , 0);.    addr =
20a0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
20b0: 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c  (v, OP_SortNext,
20c0: 20 30 2c 20 65 6e 64 2c 20 30 2c 20 30 29 3b 0a   0, end, 0, 0);.
20d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
20e0: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 43 61  dOp(v, OP_SortCa
20f0: 6c 6c 62 61 63 6b 2c 20 70 45 4c 69 73 74 2d 3e  llback, pEList->
2100: 6e 45 78 70 72 2c 20 30 2c 20 30 2c 20 30 29 3b  nExpr, 0, 0, 0);
2110: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
2120: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
2130: 20 30 2c 20 61 64 64 72 2c 20 30 2c 20 30 29 3b   0, addr, 0, 0);
2140: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
2150: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c  ddOp(v, OP_Noop,
2160: 20 30 2c 20 30 2c 20 30 2c 20 65 6e 64 29 3b 0a   0, 0, 0, end);.
2170: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
2180: 73 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  s is an aggregat
2190: 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20  e, then we need 
21a0: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 61  to invoke the ca
21b0: 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 65 78 61 63  llback.  ** exac
21c0: 74 6c 79 20 6f 6e 63 65 2e 0a 20 20 2a 2f 0a 20  tly once..  */. 
21d0: 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
21e0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
21f0: 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b  p(v, OP_Callback
2200: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
2210: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a   0, 0, 0);.  }..
2220: 20 20 2f 2a 20 41 6c 77 61 79 73 20 65 78 65 63    /* Always exec
2230: 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ute the followin
2240: 67 20 63 6f 64 65 20 62 65 66 6f 72 65 20 65 78  g code before ex
2250: 69 74 69 6e 67 2c 20 69 6e 20 6f 72 64 65 72 20  iting, in order 
2260: 74 6f 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20  to.  ** release 
2270: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 2a 2f 0a  resources..  */.
2280: 73 65 6c 65 63 74 5f 63 6c 65 61 6e 75 70 3a 0a  select_cleanup:.
2290: 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74    sqliteExprList
22a0: 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a  Delete(pEList);.
22b0: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
22c0: 6c 65 74 65 28 70 54 61 62 4c 69 73 74 29 3b 0a  lete(pTabList);.
22d0: 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65    sqliteExprDele
22e0: 74 65 28 70 57 68 65 72 65 29 3b 0a 20 20 73 71  te(pWhere);.  sq
22f0: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
2300: 74 65 28 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  te(pOrderBy);.  
2310: 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.