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

Artifact 247d668f5be042b914ed8e46edf9cdb57a1eca29:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 33 37 33  select.c,v 1.373
0200: 20 32 30 30 38 2f 30 31 2f 30 31 20 31 39 3a 30   2008/01/01 19:0
0210: 32 3a 30 39 20 64 61 6e 69 65 6c 6b 31 39 37 37  2:09 danielk1977
0220: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
0230: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0240: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  .../*.** Delete 
0250: 61 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  all the content 
0260: 6f 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75  of a Select stru
0270: 63 74 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74  cture but do not
0280: 20 64 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74   deallocate.** t
0290: 68 65 20 73 65 6c 65 63 74 20 73 74 72 75 63 74  he select struct
02a0: 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73  ure itself..*/.s
02b0: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
02c0: 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70  Select(Select *p
02d0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  ){.  sqlite3Expr
02e0: 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 45  ListDelete(p->pE
02f0: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
0300: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  SrcListDelete(p-
0310: 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  >pSrc);.  sqlite
0320: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
0330: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
0340: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0350: 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
0370: 65 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  e(p->pHaving);. 
0380: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0390: 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72  Delete(p->pOrder
03a0: 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  By);.  sqlite3Se
03b0: 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 50  lectDelete(p->pP
03c0: 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  rior);.  sqlite3
03d0: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
03e0: 69 6d 69 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  imit);.  sqlite3
03f0: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4f  ExprDelete(p->pO
0400: 66 66 73 65 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ffset);.}.../*.*
0410: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
0420: 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
0430: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  e and return a p
0440: 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a  ointer to that.*
0450: 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  * structure..*/.
0460: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
0470: 65 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73  electNew(.  Pars
0480: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
0490: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
04a0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
04b0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
04c0: 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  /* which columns
04d0: 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74   to include in t
04e0: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53  he result */.  S
04f0: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
0500: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
0510: 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68   clause -- which
0520: 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20   tables to scan 
0530: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
0540: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  e,         /* th
0550: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
0560: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
0570: 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65  roupBy,   /* the
0580: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
0590: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
05a0: 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74  ing,        /* t
05b0: 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
05c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
05d0: 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74  pOrderBy,   /* t
05e0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
05f0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69  se */.  int isDi
0600: 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f 2a  stinct,       /*
0610: 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53   true if the DIS
0620: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
0630: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 45 78   present */.  Ex
0640: 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20 20  pr *pLimit,     
0650: 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c      /* LIMIT val
0660: 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20  ue.  NULL means 
0670: 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45 78  not used */.  Ex
0680: 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20 20  pr *pOffset     
0690: 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61      /* OFFSET va
06a0: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
06b0: 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b   no offset */.){
06c0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b  .  Select *pNew;
06d0: 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69  .  Select standi
06e0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n;.  sqlite3 *db
06f0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
0700: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
0710: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
0720: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
0730: 0a 20 20 61 73 73 65 72 74 28 20 21 70 4f 66 66  .  assert( !pOff
0740: 73 65 74 20 7c 7c 20 70 4c 69 6d 69 74 20 29 3b  set || pLimit );
0750: 20 20 20 2f 2a 20 43 61 6e 27 74 20 68 61 76 65     /* Can't have
0760: 20 4f 46 46 53 45 54 20 77 69 74 68 6f 75 74 20   OFFSET without 
0770: 4c 49 4d 49 54 2e 20 2a 2f 0a 20 20 69 66 28 20  LIMIT. */.  if( 
0780: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pNew==0 ){.    p
0790: 4e 65 77 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a  New = &standin;.
07a0: 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c      memset(pNew,
07b0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77   0, sizeof(*pNew
07c0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  ));.  }.  if( pE
07d0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
07e0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
07f0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
0800: 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33  arse, 0, sqlite3
0810: 45 78 70 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30  Expr(db,TK_ALL,0
0820: 2c 30 2c 30 29 2c 20 30 29 3b 0a 20 20 7d 0a 20  ,0,0), 0);.  }. 
0830: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
0840: 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e  pEList;.  pNew->
0850: 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70  pSrc = pSrc;.  p
0860: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  New->pWhere = pW
0870: 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  here;.  pNew->pG
0880: 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
0890: 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  y;.  pNew->pHavi
08a0: 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20  ng = pHaving;.  
08b0: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
08c0: 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65   pOrderBy;.  pNe
08d0: 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  w->isDistinct = 
08e0: 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e  isDistinct;.  pN
08f0: 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45  ew->op = TK_SELE
0900: 43 54 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  CT;.  assert( pO
0910: 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c 69 6d  ffset==0 || pLim
0920: 69 74 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d  it!=0 );.  pNew-
0930: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
0940: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
0950: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 70  t = pOffset;.  p
0960: 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31  New->iLimit = -1
0970: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65  ;.  pNew->iOffse
0980: 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  t = -1;.  pNew->
0990: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
09a0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
09b0: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
09c0: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
09d0: 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31  OpenEphm[2] = -1
09e0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 26 73  ;.  if( pNew==&s
09f0: 74 61 6e 64 69 6e 29 20 7b 0a 20 20 20 20 63 6c  tandin) {.    cl
0a00: 65 61 72 53 65 6c 65 63 74 28 70 4e 65 77 29 3b  earSelect(pNew);
0a10: 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20  .    pNew = 0;. 
0a20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
0a30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
0a40: 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65  e the given Sele
0a50: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
0a60: 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73   all of its subs
0a70: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
0a80: 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
0a90: 44 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70  Delete(Select *p
0aa0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
0ab0: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 70 29    clearSelect(p)
0ac0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
0ad0: 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(p);.  }.}../*
0ae0: 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20 33  .** Given 1 to 3
0af0: 20 69 64 65 6e 74 69 66 69 65 72 73 20 70 72 65   identifiers pre
0b00: 63 65 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e  ceeding the JOIN
0b10: 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d   keyword, determ
0b20: 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20  ine the.** type 
0b30: 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e  of join.  Return
0b40: 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73   an integer cons
0b50: 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65 73  tant that expres
0b60: 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a  ses that type.**
0b70: 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65   in terms of the
0b80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76   following bit v
0b90: 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  alues:.**.**    
0ba0: 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20   JT_INNER.**    
0bb0: 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20   JT_CROSS.**    
0bc0: 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20   JT_OUTER.**    
0bd0: 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20   JT_NATURAL.**  
0be0: 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20     JT_LEFT.**   
0bf0: 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a    JT_RIGHT.**.**
0c00: 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f   A full outer jo
0c10: 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e  in is the combin
0c20: 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54  ation of JT_LEFT
0c30: 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a   and JT_RIGHT..*
0c40: 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67  *.** If an illeg
0c50: 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65  al or unsupporte
0c60: 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73  d join type is s
0c70: 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20  een, then still 
0c80: 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e  return.** a join
0c90: 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20 61   type, but put a
0ca0: 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70  n error in the p
0cb0: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
0cc0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a  .*/.int sqlite3J
0cd0: 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70  oinType(Parse *p
0ce0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41  Parse, Token *pA
0cf0: 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b  , Token *pB, Tok
0d00: 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a  en *pC){.  int j
0d10: 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54  ointype = 0;.  T
0d20: 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a  oken *apAll[3];.
0d30: 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73 74    Token *p;.  st
0d40: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
0d50: 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
0d60: 61 72 20 7a 4b 65 79 77 6f 72 64 5b 38 5d 3b 0a  ar zKeyword[8];.
0d70: 20 20 20 20 75 38 20 6e 43 68 61 72 3b 0a 20 20      u8 nChar;.  
0d80: 20 20 75 38 20 63 6f 64 65 3b 0a 20 20 7d 20 6b    u8 code;.  } k
0d90: 65 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20  eywords[] = {.  
0da0: 20 20 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20 37    { "natural", 7
0db0: 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a  , JT_NATURAL },.
0dc0: 20 20 20 20 7b 20 22 6c 65 66 74 22 2c 20 20 20      { "left",   
0dd0: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f   4, JT_LEFT|JT_O
0de0: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72  UTER },.    { "r
0df0: 69 67 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52  ight",   5, JT_R
0e00: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  IGHT|JT_OUTER },
0e10: 0a 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20  .    { "full",  
0e20: 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f    4, JT_LEFT|JT_
0e30: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
0e40: 2c 0a 20 20 20 20 7b 20 22 6f 75 74 65 72 22 2c  ,.    { "outer",
0e50: 20 20 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d     5, JT_OUTER }
0e60: 2c 0a 20 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c  ,.    { "inner",
0e70: 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d     5, JT_INNER }
0e80: 2c 0a 20 20 20 20 7b 20 22 63 72 6f 73 73 22 2c  ,.    { "cross",
0e90: 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a     5, JT_INNER|J
0ea0: 54 5f 43 52 4f 53 53 20 7d 2c 0a 20 20 7d 3b 0a  T_CROSS },.  };.
0eb0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70    int i, j;.  ap
0ec0: 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61  All[0] = pA;.  a
0ed0: 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20  pAll[1] = pB;.  
0ee0: 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20  apAll[2] = pC;. 
0ef0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26   for(i=0; i<3 &&
0f00: 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   apAll[i]; i++){
0f10: 0a 20 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69  .    p = apAll[i
0f20: 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ];.    for(j=0; 
0f30: 6a 3c 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64  j<sizeof(keyword
0f40: 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72  s)/sizeof(keywor
0f50: 64 73 5b 30 5d 29 3b 20 6a 2b 2b 29 7b 0a 20 20  ds[0]); j++){.  
0f60: 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 6b 65      if( p->n==ke
0f70: 79 77 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61 72 20  ywords[j].nChar 
0f80: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71  .          && sq
0f90: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63  lite3StrNICmp((c
0fa0: 68 61 72 2a 29 70 2d 3e 7a 2c 20 6b 65 79 77 6f  har*)p->z, keywo
0fb0: 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c  rds[j].zKeyword,
0fc0: 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   p->n)==0 ){.   
0fd0: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
0fe0: 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64   keywords[j].cod
0ff0: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
1000: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1010: 20 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f      if( j>=sizeo
1020: 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65  f(keywords)/size
1030: 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20  of(keywords[0]) 
1040: 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  ){.      jointyp
1050: 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20  e |= JT_ERROR;. 
1060: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1070: 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20  }.  }.  if(.    
1080: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54   (jointype & (JT
1090: 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29  _INNER|JT_OUTER)
10a0: 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f  )==(JT_INNER|JT_
10b0: 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28  OUTER) ||.     (
10c0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52  jointype & JT_ER
10d0: 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ROR)!=0.  ){.   
10e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70   const char *zSp
10f0: 31 20 3d 20 22 20 22 3b 0a 20 20 20 20 63 6f 6e  1 = " ";.    con
1100: 73 74 20 63 68 61 72 20 2a 7a 53 70 32 20 3d 20  st char *zSp2 = 
1110: 22 20 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d  " ";.    if( pB=
1120: 3d 30 20 29 7b 20 7a 53 70 31 2b 2b 3b 20 7d 0a  =0 ){ zSp1++; }.
1130: 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b      if( pC==0 ){
1140: 20 7a 53 70 32 2b 2b 3b 20 7d 0a 20 20 20 20 73   zSp2++; }.    s
1150: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1160: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
1170: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
1180: 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20  oin type: ".    
1190: 20 20 20 22 25 54 25 73 25 54 25 73 25 54 22 2c     "%T%s%T%s%T",
11a0: 20 70 41 2c 20 7a 53 70 31 2c 20 70 42 2c 20 7a   pA, zSp1, pB, z
11b0: 53 70 32 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f  Sp2, pC);.    jo
11c0: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
11d0: 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a  R;.  }else if( j
11e0: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 52 49 47  ointype & JT_RIG
11f0: 48 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  HT ){.    sqlite
1200: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1210: 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20  , .      "RIGHT 
1220: 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a  and FULL OUTER J
1230: 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72  OINs are not cur
1240: 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64  rently supported
1250: 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65  ");.    jointype
1260: 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d   = JT_INNER;.  }
1270: 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79  .  return jointy
1280: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  pe;.}../*.** Ret
1290: 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
12a0: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74   a column in a t
12b0: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31  able.  Return -1
12c0: 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a   if the column.*
12d0: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  * is not contain
12e0: 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ed in the table.
12f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1300: 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65  olumnIndex(Table
1310: 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68   *pTab, const ch
1320: 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74  ar *zCol){.  int
1330: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
1340: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
1350: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1360: 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e  e3StrICmp(pTab->
1370: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[i].zName, z
1380: 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Col)==0 ) return
1390: 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
13a0: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   -1;.}../*.** Se
13b0: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  t the value of a
13c0: 20 74 6f 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30   token to a '\00
13d0: 30 27 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  0'-terminated st
13e0: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
13f0: 76 6f 69 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f  void setToken(To
1400: 6b 65 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ken *p, const ch
1410: 61 72 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d  ar *z){.  p->z =
1420: 20 28 75 38 2a 29 7a 3b 0a 20 20 70 2d 3e 6e 20   (u8*)z;.  p->n 
1430: 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20  = z ? strlen(z) 
1440: 3a 20 30 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d 20  : 0;.  p->dyn = 
1450: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
1460: 74 68 65 20 74 6f 6b 65 6e 20 74 6f 20 74 68 65  the token to the
1470: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 61   double-quoted a
1480: 6e 64 20 65 73 63 61 70 65 64 20 76 65 72 73 69  nd escaped versi
1490: 6f 6e 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  on of the string
14a0: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
14b0: 79 20 7a 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  y z. For example
14c0: 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 7b 61 22 62 63  ;.**.**    {a"bc
14d0: 7d 20 20 2d 3e 20 20 7b 22 61 22 22 62 63 22 7d  }  ->  {"a""bc"}
14e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14f0: 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 50  setQuotedToken(P
1500: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
1510: 6b 65 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ken *p, const ch
1520: 61 72 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d  ar *z){.  p->z =
1530: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 50   (u8 *)sqlite3MP
1540: 72 69 6e 74 66 28 30 2c 20 22 5c 22 25 77 5c 22  rintf(0, "\"%w\"
1550: 22 2c 20 7a 29 3b 0a 20 20 70 2d 3e 64 79 6e 20  ", z);.  p->dyn 
1560: 3d 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 20  = 1;.  if( p->z 
1570: 29 7b 0a 20 20 20 20 70 2d 3e 6e 20 3d 20 73 74  ){.    p->n = st
1580: 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70 2d 3e  rlen((char *)p->
1590: 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
15a0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
15b0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
15c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61   }.}../*.** Crea
15d0: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
15e0: 20 6e 6f 64 65 20 66 6f 72 20 61 6e 20 69 64 65   node for an ide
15f0: 6e 74 69 66 69 65 72 20 77 69 74 68 20 74 68 65  ntifier with the
1600: 20 6e 61 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a   name of zName.*
1610: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 43  /.Expr *sqlite3C
1620: 72 65 61 74 65 49 64 45 78 70 72 28 50 61 72 73  reateIdExpr(Pars
1630: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1640: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
1650: 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20   Token dummy;.  
1660: 73 65 74 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c  setToken(&dummy,
1670: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
1680: 6e 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  n sqlite3PExpr(p
1690: 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c  Parse, TK_ID, 0,
16a0: 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d 0a 0a   0, &dummy);.}..
16b0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72  ./*.** Add a ter
16c0: 6d 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 65  m to the WHERE e
16d0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70  xpression in *pp
16e0: 45 78 70 72 20 74 68 61 74 20 72 65 71 75 69 72  Expr that requir
16f0: 65 73 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63  es the.** zCol c
1700: 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 65 71 75 61  olumn to be equa
1710: 6c 20 69 6e 20 74 68 65 20 74 77 6f 20 74 61 62  l in the two tab
1720: 6c 65 73 20 70 54 61 62 31 20 61 6e 64 20 70 54  les pTab1 and pT
1730: 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ab2..*/.static v
1740: 6f 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d  oid addWhereTerm
1750: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1760: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
1770: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1780: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1790: 2a 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a  *zCol,        /*
17a0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
17b0: 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  umn */.  const T
17c0: 61 62 6c 65 20 2a 70 54 61 62 31 2c 20 20 20 20  able *pTab1,    
17d0: 20 20 2f 2a 20 46 69 72 73 74 20 74 61 62 6c 65    /* First table
17e0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
17f0: 20 2a 7a 41 6c 69 61 73 31 2c 20 20 20 20 20 2f   *zAlias1,     /
1800: 2a 20 41 6c 69 61 73 20 66 6f 72 20 66 69 72 73  * Alias for firs
1810: 74 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62 65  t table.  May be
1820: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
1830: 20 54 61 62 6c 65 20 2a 70 54 61 62 32 2c 20 20   Table *pTab2,  
1840: 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61      /* Second ta
1850: 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ble */.  const c
1860: 68 61 72 20 2a 7a 41 6c 69 61 73 32 2c 20 20 20  har *zAlias2,   
1870: 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 73    /* Alias for s
1880: 65 63 6f 6e 64 20 74 61 62 6c 65 2e 20 20 4d 61  econd table.  Ma
1890: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
18a0: 6e 74 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  nt iRightJoinTab
18b0: 6c 65 2c 20 20 20 20 20 2f 2a 20 56 44 42 45 20  le,     /* VDBE 
18c0: 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 72  cursor for the r
18d0: 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ight table */.  
18e0: 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20 20 20  Expr **ppExpr   
18f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1900: 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  the equality ter
1910: 6d 20 74 6f 20 74 68 69 73 20 65 78 70 72 65 73  m to this expres
1920: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  sion */.){.  Exp
1930: 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c 20  r *pE1a, *pE1b, 
1940: 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a 70  *pE1c;.  Expr *p
1950: 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32  E2a, *pE2b, *pE2
1960: 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a  c;.  Expr *pE;..
1970: 20 20 70 45 31 61 20 3d 20 73 71 6c 69 74 65 33    pE1a = sqlite3
1980: 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50 61  CreateIdExpr(pPa
1990: 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 70 45  rse, zCol);.  pE
19a0: 32 61 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  2a = sqlite3Crea
19b0: 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65 2c  teIdExpr(pParse,
19c0: 20 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 41   zCol);.  if( zA
19d0: 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20 20 20 20  lias1==0 ){.    
19e0: 7a 41 6c 69 61 73 31 20 3d 20 70 54 61 62 31 2d  zAlias1 = pTab1-
19f0: 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45  >zName;.  }.  pE
1a00: 31 62 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  1b = sqlite3Crea
1a10: 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65 2c  teIdExpr(pParse,
1a20: 20 7a 41 6c 69 61 73 31 29 3b 0a 20 20 69 66 28   zAlias1);.  if(
1a30: 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29 7b 0a 20   zAlias2==0 ){. 
1a40: 20 20 20 7a 41 6c 69 61 73 32 20 3d 20 70 54 61     zAlias2 = pTa
1a50: 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  b2->zName;.  }. 
1a60: 20 70 45 32 62 20 3d 20 73 71 6c 69 74 65 33 43   pE2b = sqlite3C
1a70: 72 65 61 74 65 49 64 45 78 70 72 28 70 50 61 72  reateIdExpr(pPar
1a80: 73 65 2c 20 7a 41 6c 69 61 73 32 29 3b 0a 20 20  se, zAlias2);.  
1a90: 70 45 31 63 20 3d 20 73 71 6c 69 74 65 33 50 45  pE1c = sqlite3PE
1aa0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
1ab0: 4f 54 2c 20 70 45 31 62 2c 20 70 45 31 61 2c 20  OT, pE1b, pE1a, 
1ac0: 30 29 3b 0a 20 20 70 45 32 63 20 3d 20 73 71 6c  0);.  pE2c = sql
1ad0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1ae0: 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c 20  , TK_DOT, pE2b, 
1af0: 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20 3d  pE2a, 0);.  pE =
1b00: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
1b10: 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31  arse, TK_EQ, pE1
1b20: 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20 20 69  c, pE2c, 0);.  i
1b30: 66 28 20 70 45 20 29 7b 0a 20 20 20 20 45 78 70  f( pE ){.    Exp
1b40: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 2c  rSetProperty(pE,
1b50: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
1b60: 20 20 20 70 45 2d 3e 69 52 69 67 68 74 4a 6f 69     pE->iRightJoi
1b70: 6e 54 61 62 6c 65 20 3d 20 69 52 69 67 68 74 4a  nTable = iRightJ
1b80: 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  oinTable;.  }.  
1b90: 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  *ppExpr = sqlite
1ba0: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
1bb0: 3e 64 62 2c 2a 70 70 45 78 70 72 2c 20 70 45 29  >db,*ppExpr, pE)
1bc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1bd0: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
1be0: 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74  roperty on all t
1bf0: 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65  erms of the give
1c00: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  n expression..**
1c10: 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70   And set the Exp
1c20: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
1c30: 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20  e to iTable for 
1c40: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
1c50: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  e.** expression.
1c60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72  .**.** The EP_Fr
1c70: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
1c80: 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73  is used on terms
1c90: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
1ca0: 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65  n to tell.** the
1cb0: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1cc0: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
1cd0: 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d  c that this term
1ce0: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   is part of the.
1cf0: 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74  ** join restrict
1d00: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
1d10: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
1d20: 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20   clause and not 
1d30: 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  a part.** of the
1d40: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48   more general WH
1d50: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ERE clause.  The
1d60: 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76  se terms are mov
1d70: 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a  ed over to the.*
1d80: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  * WHERE clause d
1d90: 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65  uring join proce
1da0: 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65  ssing but we nee
1db0: 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
1dc0: 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69  at they.** origi
1dd0: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
1de0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
1df0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e  .**.** The Expr.
1e00: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1e10: 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20  tells the WHERE 
1e20: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
1e30: 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78  g that the.** ex
1e40: 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73  pression depends
1e50: 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74   on table iRight
1e60: 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69  JoinTable even i
1e70: 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20  f that table is 
1e80: 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c  not.** explicitl
1e90: 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  y mentioned in t
1ea0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
1eb0: 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  That information
1ec0: 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f   is needed.** fo
1ed0: 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69  r cases like thi
1ee0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  s:.**.**    SELE
1ef0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
1f00: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
1f10: 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d  a=t2.b AND t1.x=
1f20: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72  5.**.** The wher
1f30: 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74  e clause needs t
1f40: 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  o defer the hand
1f50: 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78  ling of the t1.x
1f60: 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c  =5.** term until
1f70: 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f   after the t2 lo
1f80: 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  op of the join. 
1f90: 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a   In that way, a.
1fa0: 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77  ** NULL t2 row w
1fb0: 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
1fc0: 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35  whenever t1.x!=5
1fd0: 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a  .  If we do not.
1fe0: 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  ** defer the han
1ff0: 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c  dling of t1.x=5,
2000: 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63   it will be proc
2010: 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  essed immediatel
2020: 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74  y.** after the t
2030: 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20  1 loop and rows 
2040: 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c  with t1.x!=5 wil
2050: 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69  l never appear i
2060: 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c  n.** the output,
2070: 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72   which is incorr
2080: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
2090: 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  oid setJoinExpr(
20a0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61  Expr *p, int iTa
20b0: 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  ble){.  while( p
20c0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
20d0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
20e0: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 2d 3e  omJoin);.    p->
20f0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2100: 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65  = iTable;.    se
2110: 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65  tJoinExpr(p->pLe
2120: 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  ft, iTable);.   
2130: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
2140: 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68    } .}../*.** Th
2150: 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65  is routine proce
2160: 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e  sses the join in
2170: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
2180: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2190: 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e  ..** ON and USIN
21a0: 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f  G clauses are co
21b0: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74  nverted into ext
21c0: 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ra terms of the 
21d0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
21e0: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61   NATURAL joins a
21f0: 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61  lso create extra
2200: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
2210: 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  rms..**.** The t
2220: 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63  erms of a FROM c
2230: 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69  lause are contai
2240: 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63  ned in the Selec
2250: 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65  t.pSrc structure
2260: 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f  ..** The left mo
2270: 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  st table is the 
2280: 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53  first entry in S
2290: 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65  elect.pSrc.  The
22a0: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74   right-most.** t
22b0: 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74  able is the last
22c0: 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69   entry.  The joi
22d0: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65  n operator is he
22e0: 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ld in the entry 
22f0: 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20  to.** the left. 
2300: 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f   Thus entry 0 co
2310: 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20  ntains the join 
2320: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  operator for the
2330: 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a   join between.**
2340: 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31   entries 0 and 1
2350: 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49  .  Any ON or USI
2360: 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63  NG clauses assoc
2370: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a  iated with the j
2380: 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20  oin are.** also 
2390: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
23a0: 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  left entry..**.*
23b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
23c0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
23d0: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
23e0: 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  untered..*/.stat
23f0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f  ic int sqlitePro
2400: 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a  cessJoin(Parse *
2410: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2420: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
2430: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
2440: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62        /* All tab
2450: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
2460: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
2470: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
2480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2490: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
24a0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
24b0: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20  _item *pLeft;   
24c0: 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20    /* Left table 
24d0: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
24e0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
24f0: 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20  _item *pRight;  
2500: 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65    /* Right table
2510: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
2520: 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ..  pSrc = p->pS
2530: 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70  rc;.  pLeft = &p
2540: 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69  Src->a[0];.  pRi
2550: 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b  ght = &pLeft[1];
2560: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
2570: 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c  rc->nSrc-1; i++,
2580: 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74   pRight++, pLeft
2590: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
25a0: 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74  pLeftTab = pLeft
25b0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c  ->pTab;.    Tabl
25c0: 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70  e *pRightTab = p
25d0: 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 0a 20 20  Right->pTab;..  
25e0: 20 20 69 66 28 20 70 4c 65 66 74 54 61 62 3d 3d    if( pLeftTab==
25f0: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
2600: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
2610: 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e     /* When the N
2620: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69  ATURAL keyword i
2630: 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57  s present, add W
2640: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
2650: 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  s for.    ** eve
2660: 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  ry column that t
2670: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61  he two tables ha
2680: 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20  ve in common..  
2690: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
26a0: 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  ght->jointype & 
26b0: 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20  JT_NATURAL ){.  
26c0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
26d0: 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70  pOn || pRight->p
26e0: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  Using ){.       
26f0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2700: 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55  (pParse, "a NATU
2710: 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74  RAL join may not
2720: 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20   have ".        
2730: 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49     "an ON or USI
2740: 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a  NG clause", 0);.
2750: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
2760: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2770: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66 74  for(j=0; j<pLeft
2780: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
2790: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
27a0: 4e 61 6d 65 20 3d 20 70 4c 65 66 74 54 61 62 2d  Name = pLeftTab-
27b0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
27c0: 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75          if( colu
27d0: 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61  mnIndex(pRightTa
27e0: 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  b, zName)>=0 ){.
27f0: 20 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65            addWhe
2800: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 7a  reTerm(pParse, z
2810: 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20  Name, pLeftTab, 
2820: 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a  pLeft->zAlias, .
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52                pR
2850: 69 67 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d  ightTab, pRight-
2860: 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20  >zAlias,.       
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69         pRight->i
2890: 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65  Cursor, &p->pWhe
28a0: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 0a  re);.          .
28b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28c0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
28d0: 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e  Disallow both ON
28e0: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
28f0: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
2900: 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oin.    */.    i
2910: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26  f( pRight->pOn &
2920: 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  & pRight->pUsing
2930: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2940: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2950: 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62  , "cannot have b
2960: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
2970: 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75   ".        "clau
2980: 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ses in the same 
2990: 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  join");.      re
29a0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  turn 1;.    }.. 
29b0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e     /* Add the ON
29c0: 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65   clause to the e
29d0: 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
29e0: 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65  clause, connecte
29f0: 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41  d by.    ** an A
2a00: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  ND operator..   
2a10: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
2a20: 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20  ht->pOn ){.     
2a30: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69   setJoinExpr(pRi
2a40: 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74  ght->pOn, pRight
2a50: 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2a60: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71    p->pWhere = sq
2a70: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
2a80: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65  rse->db, p->pWhe
2a90: 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29  re, pRight->pOn)
2aa0: 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e  ;.      pRight->
2ab0: 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  pOn = 0;.    }..
2ac0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78      /* Create ex
2ad0: 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  tra terms on the
2ae0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f   WHERE clause fo
2af0: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61  r each column na
2b00: 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  med.    ** in th
2b10: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20  e USING clause. 
2b20: 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65   Example: If the
2b30: 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62   two tables to b
2b40: 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20  e joined are .  
2b50: 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64    ** A and B and
2b60: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
2b70: 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e  e names X, Y, an
2b80: 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68  d Z, then add th
2b90: 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  is.    ** to the
2ba0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20   WHERE clause:  
2bb0: 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e    A.X=B.X AND A.
2bc0: 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e  Y=B.Y AND A.Z=B.
2bd0: 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20  Z.    ** Report 
2be0: 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20  an error if any 
2bf0: 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64  column mentioned
2c00: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
2c10: 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e  ause is.    ** n
2c20: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
2c30: 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62  both tables to b
2c40: 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f  e joined..    */
2c50: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
2c60: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
2c70: 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d   IdList *pList =
2c80: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b   pRight->pUsing;
2c90: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
2ca0: 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b  j<pList->nId; j+
2cb0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
2cc0: 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d   *zName = pList-
2cd0: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[j].zName;.   
2ce0: 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49       if( columnI
2cf0: 6e 64 65 78 28 70 4c 65 66 74 54 61 62 2c 20 7a  ndex(pLeftTab, z
2d00: 4e 61 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d  Name)<0 || colum
2d10: 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62  nIndex(pRightTab
2d20: 2c 20 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a 20 20  , zName)<0 ){.  
2d30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2d40: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2d50: 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69  "cannot join usi
2d60: 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63  ng column %s - c
2d70: 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20  olumn ".        
2d80: 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74      "not present
2d90: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22   in both tables"
2da0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
2db0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2dc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2dd0: 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61  addWhereTerm(pPa
2de0: 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c 65 66  rse, zName, pLef
2df0: 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c  tTab, pLeft->zAl
2e00: 69 61 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ias, .          
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e20: 20 20 70 52 69 67 68 74 54 61 62 2c 20 70 52 69    pRightTab, pRi
2e30: 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20  ght->zAlias,.   
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d           pRight-
2e60: 3e 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57  >iCursor, &p->pW
2e70: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  here);.      }. 
2e80: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2e90: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 0;.}../*.** In
2ea0: 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22  sert code into "
2eb0: 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  v" that will pus
2ec0: 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20  h the record on 
2ed0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a  the top of the.*
2ee0: 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65  * stack into the
2ef0: 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   sorter..*/.stat
2f00: 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f  ic void pushOnto
2f10: 53 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20  Sorter(.  Parse 
2f20: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2f30: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
2f40: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
2f50: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f   *pOrderBy,    /
2f60: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
2f70: 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63  lause */.  Selec
2f80: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
2f90: 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53    /* The whole S
2fa0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2fb0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
2fc0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
2fd0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
2fe0: 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
2ff0: 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  e, pOrderBy);.  
3000: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3010: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
3020: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
3030: 73 6f 72 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  sor, 0);.  sqlit
3040: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3050: 50 5f 50 75 6c 6c 2c 20 70 4f 72 64 65 72 42 79  P_Pull, pOrderBy
3060: 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20 30 29 3b  ->nExpr + 1, 0);
3070: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3080: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
3090: 63 6f 72 64 2c 20 70 4f 72 64 65 72 42 79 2d 3e  cord, pOrderBy->
30a0: 6e 45 78 70 72 20 2b 20 32 2c 20 30 29 3b 0a 20  nExpr + 2, 0);. 
30b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30c0: 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  p(v, OP_IdxInser
30d0: 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  t, pOrderBy->iEC
30e0: 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 69 66 28  ursor, 0);.  if(
30f0: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
3100: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  >=0 ){.    int a
3110: 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20  ddr1, addr2;.   
3120: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
3130: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3140: 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 53 65 6c 65  IfMemZero, pSele
3150: 63 74 2d 3e 69 4c 69 6d 69 74 2b 31 2c 20 30 29  ct->iLimit+1, 0)
3160: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3170: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
3180: 49 6e 63 72 2c 20 2d 31 2c 20 70 53 65 6c 65 63  Incr, -1, pSelec
3190: 74 2d 3e 69 4c 69 6d 69 74 2b 31 29 3b 0a 20 20  t->iLimit+1);.  
31a0: 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
31b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
31c0: 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20  _Goto, 0, 0);.  
31d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
31e0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
31f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3200: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 61 73 74  AddOp(v, OP_Last
3210: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
3220: 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  rsor, 0);.    sq
3230: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3240: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 4f 72  , OP_Delete, pOr
3250: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
3260: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
3270: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
3280: 61 64 64 72 32 29 3b 0a 20 20 20 20 70 53 65 6c  addr2);.    pSel
3290: 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31  ect->iLimit = -1
32a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
32b0: 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  dd code to imple
32c0: 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a  ment the OFFSET.
32d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
32e0: 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62  odeOffset(.  Vdb
32f0: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
3300: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
3310: 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  into this VM */.
3320: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
3330: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
3340: 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
3350: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
3360: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 2f   iContinue,    /
3370: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
3380: 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20  kip the current 
3390: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
33a0: 6e 50 6f 70 20 20 20 20 20 20 20 20 20 20 2f 2a  nPop          /*
33b0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
33c0: 20 74 6f 20 70 6f 70 20 73 74 61 63 6b 20 77 68   to pop stack wh
33d0: 65 6e 20 6a 75 6d 70 69 6e 67 20 2a 2f 0a 29 7b  en jumping */.){
33e0: 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65  .  if( p->iOffse
33f0: 74 3e 3d 30 20 26 26 20 69 43 6f 6e 74 69 6e 75  t>=0 && iContinu
3400: 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e!=0 ){.    int 
3410: 61 64 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  addr;.    sqlite
3420: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3430: 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70 2d  _MemIncr, -1, p-
3440: 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 61  >iOffset);.    a
3450: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
3460: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d  eAddOp(v, OP_IfM
3470: 65 6d 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65  emNeg, p->iOffse
3480: 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  t, 0);.    if( n
3490: 50 6f 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  Pop>0 ){.      s
34a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
34b0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 50 6f 70 2c  v, OP_Pop, nPop,
34c0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
34d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
34e0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
34f0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56  Continue);.    V
3500: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
3510: 23 20 73 6b 69 70 20 4f 46 46 53 45 54 20 72 65  # skip OFFSET re
3520: 63 6f 72 64 73 22 29 29 3b 0a 20 20 20 20 73 71  cords"));.    sq
3530: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
3540: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a  e(v, addr);.  }.
3550: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
3560: 65 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63  e that will chec
3570: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  k to make sure t
3580: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
3590: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63  s of the.** stac
35a0: 6b 20 61 72 65 20 64 69 73 74 69 6e 63 74 2e 20  k are distinct. 
35b0: 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69   iTab is a sorti
35c0: 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f  ng index that ho
35d0: 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  lds previously.*
35e0: 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69  * seen combinati
35f0: 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c  ons of the N val
3600: 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72  ues.  A new entr
3610: 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61  y is made in iTa
3620: 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72  b.** if the curr
3630: 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65  ent N values are
3640: 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75   new..**.** A ju
3650: 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74  mp to addrRepeat
3660: 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65   is made and the
3670: 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20   N+1 values are 
3680: 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a  popped from the.
3690: 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20  ** stack if the 
36a0: 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61  top N elements a
36b0: 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e  re not distinct.
36c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
36d0: 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20  codeDistinct(.  
36e0: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
36f0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
3700: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
3710: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
3720: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f           /* A so
3730: 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64  rting index used
3740: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73   to test for dis
3750: 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69  tinctness */.  i
3760: 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20  nt addrRepeat,  
3770: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
3780: 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63  e if not distinc
3790: 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 20 20 20 20  t */.  int N    
37a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
37b0: 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20   top N elements 
37c0: 6f 66 20 74 68 65 20 73 74 61 63 6b 20 6d 75 73  of the stack mus
37d0: 74 20 62 65 20 64 69 73 74 69 6e 63 74 20 2a 2f  t be distinct */
37e0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .){.  sqlite3Vdb
37f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
3800: 65 52 65 63 6f 72 64 2c 20 2d 4e 2c 20 30 29 3b  eRecord, -N, 0);
3810: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3820: 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e  dOp(v, OP_Distin
3830: 63 74 2c 20 69 54 61 62 2c 20 73 71 6c 69 74 65  ct, iTab, sqlite
3840: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3850: 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74 65  (v)+3);.  sqlite
3860: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3870: 5f 50 6f 70 2c 20 4e 2b 31 2c 20 30 29 3b 0a 20  _Pop, N+1, 0);. 
3880: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3890: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
38a0: 20 61 64 64 72 52 65 70 65 61 74 29 3b 0a 20 20   addrRepeat);.  
38b0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
38c0: 22 23 20 73 6b 69 70 20 69 6e 64 69 73 74 69 6e  "# skip indistin
38d0: 63 74 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20  ct records"));. 
38e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
38f0: 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  p(v, OP_IdxInser
3900: 74 2c 20 69 54 61 62 2c 20 30 29 3b 0a 7d 0a 0a  t, iTab, 0);.}..
3910: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
3920: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
3930: 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73  when a SELECT is
3940: 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 73   used within a s
3950: 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  ubexpression.** 
3960: 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e  (example:  "a IN
3970: 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
3980: 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74 20  table)") but it 
3990: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20  has more than 1 
39a0: 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e  result.** column
39b0: 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e  .  We do this in
39c0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65   a subroutine be
39d0: 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72 20  cause the error 
39e0: 6f 63 63 75 72 73 20 69 6e 20 6d 75 6c 74 69 70  occurs in multip
39f0: 6c 65 0a 2a 2a 20 70 6c 61 63 65 73 2e 0a 2a 2f  le.** places..*/
3a00: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
3a10: 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
3a20: 65 6c 65 63 74 45 72 72 6f 72 28 50 61 72 73 65  electError(Parse
3a30: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 44   *pParse, int eD
3a40: 65 73 74 2c 20 69 6e 74 20 6e 45 78 70 72 29 7b  est, int nExpr){
3a50: 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26  .  if( nExpr>1 &
3a60: 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  & (eDest==SRT_Me
3a70: 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
3a80: 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Set) ){.    sqli
3a90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3aa0: 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  se, "only a sing
3ab0: 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
3ac0: 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
3ad0: 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
3ae0: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
3af0: 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65  ession");.    re
3b00: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
3b10: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3b20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
3b30: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
3b40: 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
3b50: 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68  the inside of th
3b60: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
3b70: 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  of a SELECT..**.
3b80: 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e 64  ** If srcTab and
3b90: 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74   nColumn are bot
3ba0: 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  h zero, then the
3bb0: 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69   pEList expressi
3bc0: 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75  ons.** are evalu
3bd0: 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
3be0: 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f   get the data fo
3bf0: 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20  r this row.  If 
3c00: 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65  nColumn>0.** the
3c10: 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64  n data is pulled
3c20: 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64   from srcTab and
3c30: 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20   pEList is used 
3c40: 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a  only to get the.
3c50: 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f 72  ** datatypes for
3c60: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
3c70: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
3c80: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50  ctInnerLoop(.  P
3c90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3ca0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
3cb0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
3cc0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
3cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3ce0: 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74   complete select
3cf0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
3d00: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72   coded */.  Expr
3d10: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
3d20: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76      /* List of v
3d30: 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72  alues being extr
3d40: 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  acted */.  int s
3d50: 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  rcTab,          
3d60: 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20     /* Pull data 
3d70: 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20  from this table 
3d80: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
3d90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
3da0: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
3db0: 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20  s in the source 
3dc0: 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
3dd0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
3de0: 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c     /* If not NUL
3df0: 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20  L, sort results 
3e00: 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a  using this key *
3e10: 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74  /.  int distinct
3e20: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
3e30: 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65  f >=0, make sure
3e40: 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
3e50: 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 65  tinct */.  int e
3e60: 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Dest,           
3e70: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
3e80: 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75  pose of the resu
3e90: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  lts */.  int iPa
3ea0: 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
3eb0: 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65 6e 74 20   /* An argument 
3ec0: 74 6f 20 74 68 65 20 64 69 73 70 6f 73 61 6c 20  to the disposal 
3ed0: 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20  method */.  int 
3ee0: 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20  iContinue,      
3ef0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
3f00: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
3f10: 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20  h next row */.  
3f20: 69 6e 74 20 69 42 72 65 61 6b 2c 20 20 20 20 20  int iBreak,     
3f30: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
3f40: 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  here to break ou
3f50: 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  t of the inner l
3f60: 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  oop */.  char *a
3f70: 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ff              
3f80: 20 2f 2a 20 61 66 66 69 6e 69 74 79 20 73 74 72   /* affinity str
3f90: 69 6e 67 20 69 66 20 65 44 65 73 74 20 69 73 20  ing if eDest is 
3fa0: 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a  SRT_Union */.){.
3fb0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
3fc0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
3fd0: 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73   i;.  int hasDis
3fe0: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
3ff0: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
4000: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
4010: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 0a 20 20 69   present */..  i
4020: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
4030: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   0;.  assert( pE
4040: 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  List!=0 );..  /*
4050: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
4060: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
4070: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
4080: 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20 74 68  ment, then do th
4090: 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20  e check.  ** to 
40a0: 73 65 65 20 69 66 20 74 68 69 73 20 72 6f 77 20  see if this row 
40b0: 73 68 6f 75 6c 64 20 62 65 20 6f 75 74 70 75 74  should be output
40c0: 2e 0a 20 20 2a 2f 0a 20 20 68 61 73 44 69 73 74  ..  */.  hasDist
40d0: 69 6e 63 74 20 3d 20 64 69 73 74 69 6e 63 74 3e  inct = distinct>
40e0: 3d 30 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  =0 && pEList->nE
40f0: 78 70 72 3e 30 3b 0a 20 20 69 66 28 20 70 4f 72  xpr>0;.  if( pOr
4100: 64 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61 73  derBy==0 && !has
4110: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
4120: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
4130: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 30 29 3b 0a   iContinue, 0);.
4140: 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74    }..  /* Pull t
4150: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
4160: 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  umns..  */.  if(
4170: 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20   nColumn>0 ){.  
4180: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
4190: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
41a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
41b0: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
41c0: 20 73 72 63 54 61 62 2c 20 69 29 3b 0a 20 20 20   srcTab, i);.   
41d0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
41e0: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74  nColumn = pEList
41f0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 73 71 6c  ->nExpr;.    sql
4200: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
4210: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c  List(pParse, pEL
4220: 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
4230: 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  If the DISTINCT 
4240: 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73  keyword was pres
4250: 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  ent on the SELEC
4260: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  T statement.  **
4270: 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61   and this row ha
4280: 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f  s been seen befo
4290: 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  re, then do not 
42a0: 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20  make this row.  
42b0: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  ** part of the r
42c0: 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  esult..  */.  if
42d0: 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b  ( hasDistinct ){
42e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c  .    assert( pEL
42f0: 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ist!=0 );.    as
4300: 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45  sert( pEList->nE
4310: 78 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  xpr==nColumn );.
4320: 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
4330: 28 76 2c 20 64 69 73 74 69 6e 63 74 2c 20 69 43  (v, distinct, iC
4340: 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e  ontinue, nColumn
4350: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  );.    if( pOrde
4360: 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
4370: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
4380: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c   iContinue, nCol
4390: 75 6d 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  umn);.    }.  }.
43a0: 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d  .  if( checkForM
43b0: 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74  ultiColumnSelect
43c0: 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 65 44  Error(pParse, eD
43d0: 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  est, pEList->nEx
43e0: 70 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  pr) ){.    retur
43f0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  n 0;.  }..  swit
4400: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
4410: 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65   /* In this mode
4420: 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65  , write each que
4430: 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65  ry result to the
4440: 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70   key of the temp
4450: 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62  orary.    ** tab
4460: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
4470: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4480: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
4490: 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52  LECT.    case SR
44a0: 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20  T_Union: {.     
44b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
44c0: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
44d0: 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  rd, nColumn, 0);
44e0: 0a 20 20 20 20 20 20 69 66 28 20 61 66 66 20 29  .      if( aff )
44f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4500: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
4510: 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41   -1, aff, P3_STA
4520: 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
4530: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4540: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
4550: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b  sert, iParm, 0);
4560: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4570: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73    }..    /* Cons
4580: 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66  truct a record f
4590: 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65  rom the query re
45a0: 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61  sult, but instea
45b0: 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69  d of.    ** savi
45c0: 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20  ng that record, 
45d0: 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20  use it as a key 
45e0: 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e  to delete elemen
45f0: 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ts from.    ** t
4600: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
4610: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
4620: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
4630: 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  cept: {.      in
4640: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64  t addr;.      ad
4650: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
4660: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
4670: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
4680: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
4690: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
46a0: 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53 54  , -1, aff, P3_ST
46b0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
46c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
46d0: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50   OP_NotFound, iP
46e0: 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20  arm, addr+3);.  
46f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4700: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74  ddOp(v, OP_Delet
4710: 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  e, iParm, 0);.  
4720: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4730: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
4740: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
4750: 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61   as data using a
4760: 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20   unique key..   
4770: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
4780: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
4790: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
47a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
47b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
47c0: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
47d0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  n, 0);.      if(
47e0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
47f0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
4800: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
4810: 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20 20  erBy, p);.      
4820: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
4830: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4840: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
4850: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
4860: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4870: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
4880: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  1, 0);.        s
4890: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
48a0: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
48b0: 61 72 6d 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  arm, OPFLAG_APPE
48c0: 4e 44 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ND);.      }.   
48d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
48e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
48f0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
4900: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
4910: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
4920: 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
4930: 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
4940: 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
4950: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
4960: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
4970: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
4980: 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
4990: 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
49a0: 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
49b0: 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
49c0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
49d0: 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
49e0: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
49f0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
4a00: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  );.      int add
4a10: 72 32 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  r2;..      asser
4a20: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
4a30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4a40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
4a50: 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 31  tNull, -1, addr1
4a60: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
4a70: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4a80: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
4a90: 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
4aa0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4ab0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a  OP_Goto, 0, 0);.
4ac0: 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e 69 74        p->affinit
4ad0: 79 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  y = sqlite3Compa
4ae0: 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73  reAffinity(pELis
4af0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 28 69  t->a[0].pExpr,(i
4b00: 50 61 72 6d 3e 3e 31 36 29 26 30 78 66 66 29 3b  Parm>>16)&0xff);
4b10: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
4b20: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  rBy ){.        /
4b30: 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63  * At first glanc
4b40: 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e  e you would thin
4b50: 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d  k we could optim
4b60: 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20  ize out the.    
4b70: 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
4b80: 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e  in this case sin
4b90: 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  ce the order of 
4ba0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73  entries in the s
4bb0: 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  et.        ** do
4bc0: 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20  es not matter.  
4bd0: 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20  But there might 
4be0: 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  be a LIMIT claus
4bf0: 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20  e, in which.    
4c00: 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20      ** case the 
4c10: 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65  order does matte
4c20: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73  r */.        pus
4c30: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
4c40: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 29  se, pOrderBy, p)
4c50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4c60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4c70: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  beOp3(v, OP_Make
4c80: 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 70  Record, 1, 0, &p
4c90: 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a  ->affinity, 1);.
4ca0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4cb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
4cc0: 64 78 49 6e 73 65 72 74 2c 20 28 69 50 61 72 6d  dxInsert, (iParm
4cd0: 26 30 78 30 30 30 30 46 46 46 46 29 2c 20 30 29  &0x0000FFFF), 0)
4ce0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4cf0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
4d00: 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20  ere(v, addr2);. 
4d10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4d20: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  }..    /* If any
4d30: 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68   row exist in th
4d40: 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65  e result set, re
4d50: 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61  cord that fact a
4d60: 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f  nd abort..    */
4d70: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
4d80: 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71  ists: {.      sq
4d90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4da0: 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20  , OP_MemInt, 1, 
4db0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 73 71  iParm);.      sq
4dc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4dd0: 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d  , OP_Pop, nColum
4de0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20  n, 0);.      /* 
4df0: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
4e00: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
4e10: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
4e20: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
4e30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
4e40: 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
4e50: 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
4e60: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
4e70: 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
4e80: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
4e90: 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
4ea0: 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
4eb0: 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
4ec0: 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
4ed0: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
4ee0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
4ef0: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
4f00: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
4f10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
4f20: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
4f30: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
4f40: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
4f50: 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , p);.      }els
4f60: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
4f70: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4f80: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
4f90: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f  m, 1);.        /
4fa0: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
4fb0: 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
4fc0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
4fd0: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20   us */.      }. 
4fe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4ff0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
5000: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5010: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
5020: 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74   /* Send the dat
5030: 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  a to the callbac
5040: 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f  k function or to
5050: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20   a subroutine.  
5060: 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  In the.    ** ca
5070: 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  se of a subrouti
5080: 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ne, the subrouti
5090: 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72 65 73  ne itself is res
50a0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20  ponsible for.   
50b0: 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20   ** popping the 
50c0: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74  data from the st
50d0: 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
50e0: 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74  case SRT_Subrout
50f0: 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ine:.    case SR
5100: 54 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20  T_Callback: {.  
5110: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
5120: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5130: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5140: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e  OP_MakeRecord, n
5150: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
5160: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
5170: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
5180: 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d  rBy, p);.      }
5190: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d  else if( eDest==
51a0: 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29  SRT_Subroutine )
51b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
51c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
51d0: 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d  _Gosub, 0, iParm
51e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
51f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5200: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
5210: 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e  allback, nColumn
5220: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
5230: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5240: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
5250: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
5260: 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  ER).    /* Disca
5270: 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  rd the results. 
5280: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
5290: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
52a0: 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a  nts inside.    *
52b0: 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  * the body of a 
52c0: 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75  TRIGGER.  The pu
52d0: 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65  rpose of such se
52e0: 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c  lects is to call
52f0: 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66  .    ** user-def
5300: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74  ined functions t
5310: 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66  hat have side ef
5320: 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f  fects.  We do no
5330: 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62  t care.    ** ab
5340: 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72  out the actual r
5350: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
5360: 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lect..    */.   
5370: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
5380: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
5390: 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a  =SRT_Discard );.
53a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
53b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
53c0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
53d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
53e0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
53f0: 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
5400: 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
5410: 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
5420: 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  eached..  */.  i
5430: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20  f( p->iLimit>=0 
5440: 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  && pOrderBy==0 )
5450: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
5460: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
5470: 49 6e 63 72 2c 20 2d 31 2c 20 70 2d 3e 69 4c 69  Incr, -1, p->iLi
5480: 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mit);.    sqlite
5490: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
54a0: 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69  _IfMemZero, p->i
54b0: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a  Limit, iBreak);.
54c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
54d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
54e0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
54f0: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65  t, generate a Ke
5500: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
5510: 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20  that records.** 
5520: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
5530: 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20  quence for each 
5540: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
5550: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  at expression li
5560: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
5570: 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20   ExprList is an 
5580: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
5590: 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e  P BY clause then
55a0: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a   the resulting.*
55b0: 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  * KeyInfo struct
55c0: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
55d0: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
55e0: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e  ing a virtual in
55f0: 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  dex to.** implem
5600: 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e  ent that clause.
5610: 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73    If the ExprLis
5620: 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  t is the result 
5630: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a  set of a SELECT.
5640: 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49  ** then the KeyI
5650: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
5660: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
5670: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
5680: 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78  virtual.** index
5690: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
56a0: 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a  DISTINCT test..*
56b0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
56c0: 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
56d0: 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
56e0: 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  in from malloc. 
56f0: 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   The calling.** 
5700: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
5710: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69  onsible for seei
5720: 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
5730: 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
5740: 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20  ally.** freed.  
5750: 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  Add the KeyInfo 
5760: 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68 65  structure to the
5770: 20 50 33 20 66 69 65 6c 64 20 6f 66 20 61 6e 20   P3 field of an 
5780: 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20  opcode using.** 
5790: 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
57a0: 46 46 20 69 73 20 74 68 65 20 75 73 75 61 6c 20  FF is the usual 
57b0: 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77  way of dealing w
57c0: 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61  ith this..*/.sta
57d0: 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79  tic KeyInfo *key
57e0: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
57f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5800: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
5810: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
5820: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
5830: 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79  int nExpr;.  Key
5840: 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73  Info *pInfo;.  s
5850: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
5860: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
5870: 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20  t i;..  nExpr = 
5880: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
5890: 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  pInfo = sqlite3D
58a0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
58b0: 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b  sizeof(*pInfo) +
58c0: 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43   nExpr*(sizeof(C
58d0: 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20  ollSeq*)+1) );. 
58e0: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
58f0: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
5900: 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66  der = (u8*)&pInf
5910: 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b  o->aColl[nExpr];
5920: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65  .    pInfo->nFie
5930: 6c 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20  ld = nExpr;.    
5940: 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43  pInfo->enc = ENC
5950: 28 64 62 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  (db);.    for(i=
5960: 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
5970: 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c  a; i<nExpr; i++,
5980: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
5990: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
59a0: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
59b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
59c0: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
59d0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  >pExpr);.      i
59e0: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
59f0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d       pColl = db-
5a00: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
5a10: 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d    }.      pInfo-
5a20: 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c  >aColl[i] = pCol
5a30: 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  l;.      pInfo->
5a40: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
5a50: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
5a60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
5a70: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a  turn pInfo;.}...
5a80: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
5a90: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
5aa0: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
5ab0: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
5ac0: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
5ad0: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
5ae0: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
5af0: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
5b00: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
5b10: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
5b20: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
5b30: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
5b40: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
5b50: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
5b60: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
5b70: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
5b80: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
5b90: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
5ba0: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
5bb0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
5bc0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
5bd0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
5be0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
5bf0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
5c00: 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  /.  Vdbe *v,    
5c10: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
5c20: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
5c30: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  VDBE */.  int nC
5c40: 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 4e 75  olumn,     /* Nu
5c50: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
5c60: 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  of data */.  int
5c70: 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 2f 2a   eDest,       /*
5c80: 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65   Write the sorte
5c90: 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  d results here *
5ca0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 20 20  /.  int iParm   
5cb0: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c       /* Optional
5cc0: 20 70 61 72 61 6d 65 74 65 72 20 61 73 73 6f 63   parameter assoc
5cd0: 69 61 74 65 64 20 77 69 74 68 20 65 44 65 73 74  iated with eDest
5ce0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 72 6b   */.){.  int brk
5cf0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
5d00: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e  keLabel(v);.  in
5d10: 74 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  t cont = sqlite3
5d20: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
5d30: 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  ;.  int addr;.  
5d40: 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e 74 20  int iTab;.  int 
5d50: 70 73 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a 20  pseudoTab = 0;. 
5d60: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
5d70: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
5d80: 79 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70 4f 72  y;..  iTab = pOr
5d90: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3b  derBy->iECursor;
5da0: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
5db0: 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c 20 65 44  T_Callback || eD
5dc0: 65 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74  est==SRT_Subrout
5dd0: 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65 75 64  ine ){.    pseud
5de0: 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  oTab = pParse->n
5df0: 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Tab++;.    sqlit
5e00: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5e10: 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 73  P_OpenPseudo, ps
5e20: 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 20  eudoTab, 0);.   
5e30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5e40: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
5e50: 6c 75 6d 6e 73 2c 20 70 73 65 75 64 6f 54 61 62  lumns, pseudoTab
5e60: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d 0a  , nColumn);.  }.
5e70: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
5e80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5e90: 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20   OP_Sort, iTab, 
5ea0: 62 72 6b 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73  brk);.  codeOffs
5eb0: 65 74 28 76 2c 20 70 2c 20 63 6f 6e 74 2c 20 30  et(v, p, cont, 0
5ec0: 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  );.  if( eDest==
5ed0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c 20  SRT_Callback || 
5ee0: 65 44 65 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f  eDest==SRT_Subro
5ef0: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c  utine ){.    sql
5f00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5f10: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
5f20: 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
5f30: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5f40: 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70  _Column, iTab, p
5f50: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b  OrderBy->nExpr +
5f60: 20 31 29 3b 0a 20 20 73 77 69 74 63 68 28 20 65   1);.  switch( e
5f70: 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65  Dest ){.    case
5f80: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
5f90: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
5fa0: 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b: {.      sqlit
5fb0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5fc0: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
5fd0: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  m, 0);.      sql
5fe0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5ff0: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
6000: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6010: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
6020: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 4f 50 46  sert, iParm, OPF
6030: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
6040: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6050: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6060: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
6070: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
6080: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
6090: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
60a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
60b0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  dOp(v, OP_NotNul
60c0: 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 64  l, -1, sqlite3Vd
60d0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
60e0: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
60f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6100: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
6110: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6120: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
6130: 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43   0, sqlite3VdbeC
6140: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
6150: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6160: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  dbeOp3(v, OP_Mak
6170: 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26  eRecord, 1, 0, &
6180: 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  p->affinity, 1);
6190: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
61a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
61b0: 78 49 6e 73 65 72 74 2c 20 28 69 50 61 72 6d 26  xInsert, (iParm&
61c0: 30 78 30 30 30 30 46 46 46 46 29 2c 20 30 29 3b  0x0000FFFF), 0);
61d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
61e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
61f0: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
6200: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
6210: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
6220: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6230: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
6240: 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
6250: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
6260: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
6270: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
6280: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
6290: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
62a0: 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63  case SRT_Callbac
62b0: 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  k:.    case SRT_
62c0: 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20  Subroutine: {.  
62d0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
62e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
62f0: 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  p(v, OP_Insert, 
6300: 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20  pseudoTab, 0);. 
6310: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
6320: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
6330: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6340: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
6350: 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61 62 2c  lumn, pseudoTab,
6360: 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
6370: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
6380: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
6390: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
63a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
63b0: 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  lback, nColumn, 
63c0: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
63d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
63e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
63f0: 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29  Gosub, 0, iParm)
6400: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6410: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6420: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6430: 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
6440: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
6450: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6460: 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
6470: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 68 65 6e  of the loop when
6480: 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
6490: 61 63 68 65 64 0a 20 20 2a 2f 0a 20 20 69 66 28  ached.  */.  if(
64a0: 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b   p->iLimit>=0 ){
64b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
64c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
64d0: 6e 63 72 2c 20 2d 31 2c 20 70 2d 3e 69 4c 69 6d  ncr, -1, p->iLim
64e0: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
64f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6500: 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c  IfMemZero, p->iL
6510: 69 6d 69 74 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a  imit, brk);.  }.
6520: 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d  .  /* The bottom
6530: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a   of the loop.  *
6540: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
6550: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63  esolveLabel(v, c
6560: 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ont);.  sqlite3V
6570: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
6580: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
6590: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
65a0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 62  esolveLabel(v, b
65b0: 72 6b 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74  rk);.  if( eDest
65c0: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c  ==SRT_Callback |
65d0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75 62  | eDest==SRT_Sub
65e0: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 73  routine ){.    s
65f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6600: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65  v, OP_Close, pse
6610: 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a  udoTab, 0);.  }.
6620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6630: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
6640: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
6650: 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69  g the 'declarati
6660: 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a  on type' of the.
6670: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  ** expression pE
6680: 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20  xpr. The string 
6690: 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61  may be treated a
66a0: 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20  s static by the 
66b0: 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  caller..**.** Th
66c0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
66d0: 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74 20  pe is the exact 
66e0: 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69 74  datatype definit
66f0: 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66 72  ion extracted fr
6700: 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  om the.** origin
6710: 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  al CREATE TABLE 
6720: 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65  statement if the
6730: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
6740: 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20   column. The.** 
6750: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
6760: 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65   for a ROWID fie
6770: 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45  ld is INTEGER. E
6780: 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65  xactly when an e
6790: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
67a0: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
67b0: 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  umn can be compl
67c0: 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e  ex in the presen
67d0: 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65 73  ce of subqueries
67e0: 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d  . The.** result-
67f0: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  set expression i
6800: 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  n all of the fol
6810: 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74  lowing SELECT st
6820: 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20  atements is .** 
6830: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
6840: 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63  umn by this func
6850: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45  tion..**.**   SE
6860: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
6870: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
6880: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
6890: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
68a0: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
68b0: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c  M tbl);.**   SEL
68c0: 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45  ECT abc FROM (SE
68d0: 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20  LECT col AS abc 
68e0: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a  FROM tbl);.** .*
68f0: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
6900: 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65  n type for any e
6910: 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20  xpression other 
6920: 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73  than a column is
6930: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
6940: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c   const char *col
6950: 75 6d 6e 54 79 70 65 28 0a 20 20 4e 61 6d 65 43  umnType(.  NameC
6960: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20  ontext *pNC, .  
6970: 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63  Expr *pExpr,.  c
6980: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
6990: 69 67 69 6e 44 62 2c 0a 20 20 63 6f 6e 73 74 20  iginDb,.  const 
69a0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 54  char **pzOriginT
69b0: 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ab,.  const char
69c0: 20 2a 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29   **pzOriginCol.)
69d0: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
69e0: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61  zType = 0;.  cha
69f0: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e  r const *zOrigin
6a00: 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  Db = 0;.  char c
6a10: 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 54 61 62  onst *zOriginTab
6a20: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
6a30: 73 74 20 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d  st *zOriginCol =
6a40: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69   0;.  int j;.  i
6a50: 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70  f( pExpr==0 || p
6a60: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20  NC->pSrcList==0 
6a70: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 73  ) return 0;..  s
6a80: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
6a90: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
6aa0: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
6ab0: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
6ac0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
6ad0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
6ae0: 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68  olumn. Locate th
6af0: 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75  e table the colu
6b00: 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  mn is being.    
6b10: 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66    ** extracted f
6b20: 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65  rom in NameConte
6b30: 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69  xt.pSrcList. Thi
6b40: 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72  s table may be r
6b50: 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  eal.      ** dat
6b60: 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61  abase table or a
6b70: 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20   subquery..     
6b80: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
6b90: 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20  *pTab = 0;      
6ba0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73        /* Table s
6bb0: 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20  tructure column 
6bc0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
6bd0: 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  m */.      Selec
6be0: 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20  t *pS = 0;      
6bf0: 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
6c00: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65   the column is e
6c10: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
6c20: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
6c30: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
6c40: 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63  ;  /* Index of c
6c50: 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f  olumn in pTab */
6c60: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e  .      while( pN
6c70: 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  C && !pTab ){.  
6c80: 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
6c90: 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  TabList = pNC->p
6ca0: 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  SrcList;.       
6cb0: 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c   for(j=0;j<pTabL
6cc0: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
6cd0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
6ce0: 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor!=pExpr->iTab
6cf0: 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20  le;j++);.       
6d00: 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d   if( j<pTabList-
6d10: 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20  >nSrc ){.       
6d20: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
6d30: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
6d40: 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54           pS = pT
6d50: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65  abList->a[j].pSe
6d60: 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  lect;.        }e
6d70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
6d80: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
6d90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6da0: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54   }..      if( pT
6db0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
6dc0: 20 2f 2a 20 46 49 58 20 4d 45 3a 0a 20 20 20 20   /* FIX ME:.    
6dd0: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 6e 20      ** This can 
6de0: 6f 63 63 75 72 73 20 69 66 20 79 6f 75 20 68 61  occurs if you ha
6df0: 76 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b  ve something lik
6e00: 65 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 3b  e "SELECT new.x;
6e10: 22 20 69 6e 73 69 64 65 0a 20 20 20 20 20 20 20  " inside.       
6e20: 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2e 20 20   ** a trigger.  
6e30: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
6e40: 69 66 20 79 6f 75 20 72 65 66 65 72 65 6e 63 65  if you reference
6e50: 20 74 68 65 20 73 70 65 63 69 61 6c 20 22 6e 65   the special "ne
6e60: 77 22 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  w".        ** ta
6e70: 62 6c 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ble in the resul
6e80: 74 20 73 65 74 20 6f 66 20 61 20 73 65 6c 65 63  t set of a selec
6e90: 74 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 68 61  t.  We do not ha
6ea0: 76 65 20 61 20 67 6f 6f 64 20 77 61 79 0a 20 20  ve a good way.  
6eb0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e 64        ** to find
6ec0: 20 74 68 65 20 61 63 74 75 61 6c 20 74 61 62 6c   the actual tabl
6ed0: 65 20 74 79 70 65 2c 20 73 6f 20 63 61 6c 6c 20  e type, so call 
6ee0: 69 74 20 22 54 45 58 54 22 2e 20 20 54 68 69 73  it "TEXT".  This
6ef0: 20 69 73 20 72 65 61 6c 6c 79 0a 20 20 20 20 20   is really.     
6f00: 20 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20     ** something 
6f10: 6f 66 20 61 20 62 75 67 2c 20 62 75 74 20 49 20  of a bug, but I 
6f20: 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20  do not know how 
6f30: 74 6f 20 66 69 78 20 69 74 2e 0a 20 20 20 20 20  to fix it..     
6f40: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
6f50: 20 54 68 69 73 20 63 6f 64 65 20 64 6f 65 73 20   This code does 
6f60: 6e 6f 74 20 70 72 6f 64 75 63 65 20 74 68 65 20  not produce the 
6f70: 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2d  correct answer -
6f80: 20 69 74 20 6a 75 73 74 20 70 72 65 76 65 6e 74   it just prevent
6f90: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73  s.        ** a s
6fa0: 65 67 66 61 75 6c 74 2e 20 20 53 65 65 20 74 69  egfault.  See ti
6fb0: 63 6b 65 74 20 23 31 32 32 39 2e 0a 20 20 20 20  cket #1229..    
6fc0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a      */.        z
6fd0: 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b 0a 20  Type = "TEXT";. 
6fe0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6ff0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
7000: 65 72 74 28 20 70 54 61 62 20 29 3b 0a 20 20 20  ert( pTab );.   
7010: 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20     if( pS ){.   
7020: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62       /* The "tab
7030: 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20  le" is actually 
7040: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
7050: 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52  a view in the FR
7060: 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  OM clause.      
7070: 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45    ** of the SELE
7080: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65  CT statement. Re
7090: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
70a0: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72  tion type and or
70b0: 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  igin.        ** 
70c0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73  data for the res
70d0: 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f  ult-set column o
70e0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
70f0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
7100: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
7110: 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c   && iCol<pS->pEL
7120: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
7130: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43          /* If iC
7140: 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ol is less than 
7150: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65  zero, then the e
7160: 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73  xpression reques
7170: 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  ts the.         
7180: 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65   ** rowid of the
7190: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
71a0: 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73  iew. This expres
71b0: 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73  sion is legal (s
71c0: 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ee .          **
71d0: 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32   test case misc2
71e0: 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79  .2.2) - it alway
71f0: 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  s evaluates to N
7200: 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ULL..          *
7210: 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65  /.          Name
7220: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
7230: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d         Expr *p =
7240: 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69   pS->pEList->a[i
7250: 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  Col].pExpr;.    
7260: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
7270: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
7280: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65           sNC.pNe
7290: 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
72a0: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
72b0: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
72c0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
72d0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
72e0: 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a  , &zOriginDb, &z
72f0: 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69  OriginTab, &zOri
7300: 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20  ginCol); .      
7310: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
7320: 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  if( pTab->pSchem
7330: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
7340: 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  A real table */.
7350: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7360: 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !pS );.        i
7370: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
7380: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
7390: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
73a0: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
73b0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
73c0: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
73d0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
73e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
73f0: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
7400: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e           zOrigin
7410: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
7420: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7430: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
7440: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
7450: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .zType;.        
7460: 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70    zOriginCol = p
7470: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
7480: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
7490: 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e  .        zOrigin
74a0: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
74b0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
74c0: 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20  NC->pParse ){.  
74d0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20          int iDb 
74e0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
74f0: 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72  oIndex(pNC->pPar
7500: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
7510: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
7520: 20 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e    zOriginDb = pN
7530: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  C->pParse->db->a
7540: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
7550: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7560: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7570: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
7580: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
7590: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
75a0: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
75b0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
75c0: 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  s a sub-select. 
75d0: 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61  Return the decla
75e0: 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a  ration type and.
75f0: 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20        ** origin 
7600: 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e  info for the sin
7610: 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  gle column in th
7620: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
7630: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20  the SELECT.     
7640: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20   ** statement.. 
7650: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61       */.      Na
7660: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
7670: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
7680: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
7690: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 20  ;.      Expr *p 
76a0: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
76b0: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
76c0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
76d0: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73  S->pSrc;.      s
76e0: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
76f0: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
7700: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
7710: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
7720: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
7730: 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a  , &zOriginDb, &z
7740: 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69  OriginTab, &zOri
7750: 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20  ginCol); .      
7760: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
7770: 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28  dif.  }.  .  if(
7780: 20 70 7a 4f 72 69 67 69 6e 44 62 20 29 7b 0a 20   pzOriginDb ){. 
7790: 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69     assert( pzOri
77a0: 67 69 6e 54 61 62 20 26 26 20 70 7a 4f 72 69 67  ginTab && pzOrig
77b0: 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a  inCol );.    *pz
77c0: 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f 72 69 67  OriginDb = zOrig
77d0: 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  inDb;.    *pzOri
77e0: 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69 67 69 6e  ginTab = zOrigin
77f0: 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  Tab;.    *pzOrig
7800: 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e 43  inCol = zOriginC
7810: 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ol;.  }.  return
7820: 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zType;.}../*.**
7830: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
7840: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
7850: 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61  e VDBE the decla
7860: 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20  ration types of 
7870: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
7880: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f  e result set..*/
7890: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
78a0: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
78b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
78c0: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
78d0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
78e0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
78f0: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
7900: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
7910: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
7920: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
7930: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
7940: 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   set */.){.  Vdb
7950: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
7960: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
7970: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
7980: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
7990: 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73   = pTabList;.  s
79a0: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
79b0: 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  se;.  for(i=0; i
79c0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
79d0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
79e0: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
79f0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73  .pExpr;.    cons
7a00: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20  t char *zOrigDb 
7a10: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
7a20: 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  har *zOrigTab = 
7a30: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
7a40: 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  r *zOrigCol = 0;
7a50: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
7a60: 2a 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54  *zType = columnT
7a70: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
7a80: 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62  rigDb, &zOrigTab
7a90: 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20  , &zOrigCol);.. 
7aa0: 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d     /* The vdbe m
7ab0: 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e  ust make its own
7ac0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c   copy of the col
7ad0: 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68  umn-type and oth
7ae0: 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  er .    ** colum
7af0: 6e 20 73 70 65 63 69 66 69 63 20 73 74 72 69 6e  n specific strin
7b00: 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  gs, in case the 
7b10: 73 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20  schema is reset 
7b20: 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20  before this.    
7b30: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
7b40: 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20  ne is deleted.. 
7b50: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
7b60: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
7b70: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45  v, i, COLNAME_DE
7b80: 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 50  CLTYPE, zType, P
7b90: 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  3_TRANSIENT);.  
7ba0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
7bb0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
7bc0: 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20  LNAME_DATABASE, 
7bd0: 7a 4f 72 69 67 44 62 2c 20 50 33 5f 54 52 41 4e  zOrigDb, P3_TRAN
7be0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
7bf0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
7c00: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
7c10: 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c  TABLE, zOrigTab,
7c20: 20 50 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a   P3_TRANSIENT);.
7c30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
7c40: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
7c50: 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20  COLNAME_COLUMN, 
7c60: 7a 4f 72 69 67 43 6f 6c 2c 20 50 33 5f 54 52 41  zOrigCol, P3_TRA
7c70: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a  NSIENT);.  }.}..
7c80: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
7c90: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
7ca0: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
7cb0: 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  names of columns
7cc0: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c  .** in the resul
7cd0: 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66  t set.  This inf
7ce0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
7cf0: 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a   to provide the.
7d00: 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65  ** azCol[] value
7d10: 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63  s in the callbac
7d20: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
7d30: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
7d40: 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Names(.  Parse *
7d50: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
7d60: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
7d70: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
7d80: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
7d90: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
7da0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
7db0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
7dc0: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
7dd0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
7de0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
7df0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
7e00: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
7e10: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7e20: 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d  b;.  int fullNam
7e30: 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a  es, shortNames;.
7e40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7e50: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f  OMIT_EXPLAIN.  /
7e60: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
7e70: 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68  EXPLAIN, skip th
7e80: 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28  is step */.  if(
7e90: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
7ea0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
7eb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
7ec0: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
7ed0: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  if( pParse->colN
7ee0: 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30 20  amesSet || v==0 
7ef0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
7f00: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
7f10: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
7f20: 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e  Set = 1;.  fullN
7f30: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
7f40: 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
7f50: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
7f60: 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d  hortNames = (db-
7f70: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
7f80: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d  ShortColNames)!=
7f90: 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  0;.  sqlite3Vdbe
7fa0: 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45  SetNumCols(v, pE
7fb0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
7fc0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
7fd0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
7fe0: 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
7ff0: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
8000: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
8010: 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65   p==0 ) continue
8020: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
8030: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
8040: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
8050: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
8060: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
8070: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8080: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8090: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 73  E_NAME, zName, s
80a0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20  trlen(zName));. 
80b0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
80c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
80d0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
80e0: 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20   pTabList ){.   
80f0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
8100: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
8110: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
8120: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
8130: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
8140: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26  pTabList->nSrc &
8150: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  & pTabList->a[j]
8160: 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61  .iCursor!=p->iTa
8170: 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20  ble; j++){}.    
8180: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62    assert( j<pTab
8190: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
81a0: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
81b0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
81c0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
81d0: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
81e0: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73  iPKey;.      ass
81f0: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
8200: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
8210: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
8220: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
8230: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  0 ){.        zCo
8240: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
8250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8260: 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61    zCol = pTab->a
8270: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
8280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8290: 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26  f( !shortNames &
82a0: 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 26 26 20  & !fullNames && 
82b0: 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  p->span.z && p->
82c0: 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  span.z[0] ){.   
82d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
82e0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
82f0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28   COLNAME_NAME, (
8300: 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c  char*)p->span.z,
8310: 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20   p->span.n);.   
8320: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c     }else if( ful
8330: 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73 68 6f 72  lNames || (!shor
8340: 74 4e 61 6d 65 73 20 26 26 20 70 54 61 62 4c 69  tNames && pTabLi
8350: 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20  st->nSrc>1) ){. 
8360: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
8370: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
8380: 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20  char *zTab;. .  
8390: 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61        zTab = pTa
83a0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69  bList->a[j].zAli
83b0: 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  as;.        if( 
83c0: 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61  fullNames || zTa
83d0: 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20 70 54  b==0 ) zTab = pT
83e0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
83f0: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
8400: 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61 62  ing(&zName, zTab
8410: 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63 68  , ".", zCol, (ch
8420: 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20  ar*)0);.        
8430: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8440: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8450: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
8460: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
8470: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8490: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
84a0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f  OLNAME_NAME, zCo
84b0: 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 29  l, strlen(zCol))
84c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
84d0: 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e  lse if( p->span.
84e0: 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30  z && p->span.z[0
84f0: 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ] ){.      sqlit
8500: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8510: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
8520: 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73  AME, (char*)p->s
8530: 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e  pan.z, p->span.n
8540: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  );.      /* sqli
8550: 74 65 33 56 64 62 65 43 6f 6d 70 72 65 73 73 53  te3VdbeCompressS
8560: 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b 20 2a  pace(v, addr); *
8570: 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
8580: 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30     char zName[30
8590: 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
85a0: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d   p->op!=TK_COLUM
85b0: 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30  N || pTabList==0
85c0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
85d0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
85e0: 66 28 7a 4e 61 6d 65 29 2c 20 7a 4e 61 6d 65 2c  f(zName), zName,
85f0: 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31   "column%d", i+1
8600: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8610: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8620: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
8630: 45 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  E, zName, 0);.  
8640: 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61    }.  }.  genera
8650: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50  teColumnTypes(pP
8660: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
8670: 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e  pEList);.}..#ifn
8680: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8690: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
86a0: 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68  /*.** Name of th
86b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65  e connection ope
86c0: 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20  rator, used for 
86d0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
86e0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
86f0: 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61  char *selectOpNa
8700: 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68  me(int id){.  ch
8710: 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28  ar *z;.  switch(
8720: 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20   id ){.    case 
8730: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20  TK_ALL:       z 
8740: 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20  = "UNION ALL";  
8750: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8760: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a   TK_INTERSECT: z
8770: 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20   = "INTERSECT"; 
8780: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8790: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20  e TK_EXCEPT:    
87a0: 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20  z = "EXCEPT";   
87b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
87c0: 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20  fault:          
87d0: 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20   z = "UNION";   
87e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
87f0: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e   return z;.}.#en
8800: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
8810: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
8820: 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  CT */../*.** For
8830: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
8840: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
8850: 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61  repSelectStmt(Pa
8860: 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a  rse*, Select*);.
8870: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53  ./*.** Given a S
8880: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
8890: 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c   generate a Tabl
88a0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
88b0: 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68   describes.** th
88c0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
88d0: 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  that SELECT..*/.
88e0: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65  Table *sqlite3Re
88f0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
8900: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
8910: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53  har *zTabName, S
8920: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
8930: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
8940: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78    int i, j;.  Ex
8950: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
8960: 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20    Column *aCol, 
8970: 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33  *pCol;.  sqlite3
8980: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
8990: 62 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 65  b;..  while( pSe
89a0: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
89b0: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
89c0: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20  ->pPrior;.  if( 
89d0: 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70  prepSelectStmt(p
89e0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20  Parse, pSelect) 
89f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
8a00: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
8a10: 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
8a20: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
8a30: 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
8a40: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20  n 0;.  }.  pTab 
8a50: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8a60: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
8a70: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
8a80: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
8a90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
8aa0: 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
8ab0: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
8ac0: 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74  zTabName ? sqlit
8ad0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
8ae0: 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20  TabName) : 0;.  
8af0: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
8b00: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54 61 62  ->pEList;.  pTab
8b10: 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d  ->nCol = pEList-
8b20: 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  >nExpr;.  assert
8b30: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29  ( pTab->nCol>0 )
8b40: 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d  ;.  pTab->aCol =
8b50: 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44   aCol = sqlite3D
8b60: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
8b70: 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f  sizeof(pTab->aCo
8b80: 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c  l[0])*pTab->nCol
8b90: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  );.  for(i=0, pC
8ba0: 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d  ol=aCol; i<pTab-
8bb0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
8bc0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
8bd0: 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68 61 72 20  , *pR;.    char 
8be0: 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63 68 61 72  *zType;.    char
8bf0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74   *zName;.    int
8c00: 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 6c   nName;.    Coll
8c10: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
8c20: 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61 6d  int cnt;.    Nam
8c30: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
8c40: 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e    .    /* Get an
8c50: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d   appropriate nam
8c60: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
8c70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20  .    */.    p = 
8c80: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
8c90: 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
8ca0: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  p->pRight==0 || 
8cb0: 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  p->pRight->token
8cc0: 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  .z==0 || p->pRig
8cd0: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d  ht->token.z[0]!=
8ce0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e  0 );.    if( (zN
8cf0: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
8d00: 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  i].zName)!=0 ){.
8d10: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
8d20: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
8d30: 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70  an "AS <name>" p
8d40: 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65  hrase, use <name
8d50: 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  > as the name */
8d60: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
8d70: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
8d80: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b, zName);.    }
8d90: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  else if( p->op==
8da0: 54 4b 5f 44 4f 54 20 0a 20 20 20 20 20 20 20 20  TK_DOT .        
8db0: 20 20 20 20 20 20 26 26 20 28 70 52 3d 70 2d 3e        && (pR=p->
8dc0: 70 52 69 67 68 74 29 21 3d 30 20 26 26 20 70 52  pRight)!=0 && pR
8dd0: 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 52 2d  ->token.z && pR-
8de0: 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  >token.z[0] ){. 
8df0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75       /* For colu
8e00: 6d 6e 73 20 6f 66 20 74 68 65 20 66 72 6f 6d 20  mns of the from 
8e10: 41 2e 42 20 75 73 65 20 42 20 61 73 20 74 68 65  A.B use B as the
8e20: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a   name */.      z
8e30: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
8e40: 72 69 6e 74 66 28 64 62 2c 20 22 25 54 22 2c 20  rintf(db, "%T", 
8e50: 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  &pR->token);.   
8e60: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70   }else if( p->sp
8e70: 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e  an.z && p->span.
8e80: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  z[0] ){.      /*
8e90: 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   Use the origina
8ea0: 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f  l text of the co
8eb0: 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
8ec0: 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20  as its name */. 
8ed0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
8ee0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
8ef0: 22 25 54 22 2c 20 26 70 2d 3e 73 70 61 6e 29 3b  "%T", &p->span);
8f00: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8f10: 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65 6c 73 65    /* If all else
8f20: 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20 75 70 20   fails, make up 
8f30: 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  a name */.      
8f40: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
8f50: 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75  Printf(db, "colu
8f60: 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20  mn%d", i+1);.   
8f70: 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 4e 61 6d   }.    if( !zNam
8f80: 65 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  e || db->mallocF
8f90: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 64  ailed ){.      d
8fa0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8fb0: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
8fc0: 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
8fd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
8fe0: 65 74 65 54 61 62 6c 65 28 70 54 61 62 29 3b 0a  eteTable(pTab);.
8ff0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
9000: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9010: 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
9020: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
9030: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  re the column na
9040: 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49  me is unique.  I
9050: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f  f the name is no
9060: 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a  t unique,.    **
9070: 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65   append a intege
9080: 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f  r to the name so
9090: 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73   that it becomes
90a0: 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a   unique..    */.
90b0: 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c      nName = strl
90c0: 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66  en(zName);.    f
90d0: 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b  or(j=cnt=0; j<i;
90e0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
90f0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
9100: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[j].zName, z
9110: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
9120: 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d      zName[nName]
9130: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = 0;.        zN
9140: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
9150: 69 6e 74 66 28 64 62 2c 20 22 25 7a 3a 25 64 22  intf(db, "%z:%d"
9160: 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b  , zName, ++cnt);
9170: 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b  .        j = -1;
9180: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61  .        if( zNa
9190: 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  me==0 ) break;. 
91a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
91b0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
91c0: 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  Name;..    /* Ge
91d0: 74 20 74 68 65 20 74 79 70 65 6e 61 6d 65 2c 20  t the typename, 
91e0: 74 79 70 65 20 61 66 66 69 6e 69 74 79 2c 20 61  type affinity, a
91f0: 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
9200: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 0a 20 20  uence for the.  
9210: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20    ** column..   
9220: 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
9230: 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
9240: 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 53  NC));.    sNC.pS
9250: 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  rcList = pSelect
9260: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 7a 54 79 70  ->pSrc;.    zTyp
9270: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
9280: 44 75 70 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79  Dup(db, columnTy
9290: 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30  pe(&sNC, p, 0, 0
92a0: 2c 20 30 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d  , 0));.    pCol-
92b0: 3e 7a 54 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a  >zType = zType;.
92c0: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
92d0: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
92e0: 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20  Affinity(p);.   
92f0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
9300: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
9310: 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  se, p);.    if( 
9320: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
9330: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
9340: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
9350: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
9360: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
9370: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
9380: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
9390: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
93a0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
93b0: 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
93c0: 62 79 20 64 6f 69 6e 67 20 74 68 65 20 66 6f 6c  by doing the fol
93d0: 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 69 6e 67 73  lowing.** things
93e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
93f0: 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63  Make sure VDBE c
9400: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
9410: 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
9420: 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20   to every.**    
9430: 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20       element of 
9440: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
9450: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46  .**.**    (2)  F
9460: 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c  ill in the pTabL
9470: 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69  ist->a[].pTab fi
9480: 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c  elds in the SrcL
9490: 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20  ist that .**    
94a0: 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f       defines FRO
94b0: 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20  M clause.  When 
94c0: 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20  views appear in 
94d0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  the FROM clause,
94e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c  .**         fill
94f0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
9500: 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  Select with a co
9510: 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
9520: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
9530: 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65        that imple
9540: 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20  ments the view. 
9550: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
9560: 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45  of the view's SE
9570: 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
9580: 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61  statement so tha
9590: 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20  t we can freely 
95a0: 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65  modify or delete
95b0: 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a   that statement.
95c0: 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f  **         witho
95d0: 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75  ut worrying abou
95e0: 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65  t messing up the
95f0: 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70 72   presistent repr
9600: 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
9610: 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65        of the vie
9620: 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20  w..**.**    (3) 
9630: 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
9640: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
9650: 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65  o accomodate the
9660: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
9670: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
9680: 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
9690: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
96a0: 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
96b0: 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68      (4)  Scan th
96c0: 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
96d0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
96e0: 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
96f0: 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
9700: 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
9710: 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
9720: 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
9730: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
9740: 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
9750: 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
9760: 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
9770: 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
9780: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
9790: 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
97a0: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
97b0: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ABLE..**.** Retu
97c0: 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e  rn 0 on success.
97d0: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70    If there are p
97e0: 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61  roblems, leave a
97f0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
9800: 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  ** in pParse and
9810: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
9820: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9830: 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50  prepSelectStmt(P
9840: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
9850: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
9860: 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53  i, j, k, rc;.  S
9870: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
9880: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
9890: 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
98a0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
98b0: 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  om;.  sqlite3 *d
98c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
98d0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
98e0: 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20 64 62 2d  ->pSrc==0 || db-
98f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
9900: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
9910: 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20   }.  pTabList = 
9920: 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
9930: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a  t = p->pEList;..
9940: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63    /* Make sure c
9950: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
9960: 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
9970: 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   to all entries 
9980: 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  in.  ** the FROM
9990: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53   clause of the S
99a0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
99b0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
99c0: 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
99d0: 6f 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ors(pParse, p->p
99e0: 53 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  Src);..  /* Look
99f0: 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20   up every table 
9a00: 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
9a10: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
9a20: 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a  select.  If.  **
9a30: 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
9a40: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
9a50: 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65  a subquery inste
9a60: 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ad of a table or
9a70: 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e   view,.  ** then
9a80: 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69   create a transi
9a90: 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
9aa0: 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20  ure to describe 
9ab0: 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
9ac0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  */.  for(i=0, pF
9ad0: 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
9ae0: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
9af0: 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
9b00: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
9b10: 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  b;.    if( pFrom
9b20: 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20  ->pTab!=0 ){.   
9b30: 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65     /* This state
9b40: 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79  ment has already
9b50: 20 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20   been prepared. 
9b60: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
9b70: 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f  d.      ** to go
9b80: 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20   further. */.   
9b90: 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20     assert( i==0 
9ba0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9bb0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
9bc0: 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pFrom->zName==0
9bd0: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
9be0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
9bf0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
9c00: 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
9c10: 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
9c20: 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73  LECT */.      as
9c30: 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
9c40: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  lect!=0 );.     
9c50: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69   if( pFrom->zAli
9c60: 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  as==0 ){.       
9c70: 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d   pFrom->zAlias =
9c80: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9c90: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
9ca0: 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25  qlite_subquery_%
9cb0: 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 46 72 6f  p_", (void*)pFro
9cc0: 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
9cd0: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
9ce0: 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
9cf0: 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
9d00: 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
9d10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9d20: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
9d30: 74 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 2d  t(pParse, pFrom-
9d40: 3e 7a 41 6c 69 61 73 2c 20 70 46 72 6f 6d 2d 3e  >zAlias, pFrom->
9d50: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
9d60: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
9d70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
9d80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
9d90: 2a 20 54 68 65 20 69 73 45 70 68 65 6d 20 66 6c  * The isEphem fl
9da0: 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
9db0: 74 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  t the Table stru
9dc0: 63 74 75 72 65 20 68 61 73 20 62 65 65 6e 0a 20  cture has been. 
9dd0: 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61       ** dynamica
9de0: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  lly allocated an
9df0: 64 20 6d 61 79 20 62 65 20 66 72 65 65 64 20 61  d may be freed a
9e00: 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20  t any time.  In 
9e10: 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20  other words,.   
9e20: 20 20 20 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f     ** pTab is no
9e30: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  t pointing to a 
9e40: 70 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65  persistent table
9e50: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
9e60: 64 65 66 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a  defines.      **
9e70: 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 63 68   part of the sch
9e80: 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54  ema. */.      pT
9e90: 61 62 2d 3e 69 73 45 70 68 65 6d 20 3d 20 31 3b  ab->isEphem = 1;
9ea0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
9eb0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
9ec0: 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
9ed0: 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
9ee0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
9ef0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9f00: 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
9f10: 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
9f20: 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20  ab = pTab = .   
9f30: 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
9f40: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 70  teTable(pParse,p
9f50: 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f  From->zName,pFro
9f60: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
9f70: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
9f80: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
9f90: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
9fa0: 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
9fb0: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
9fc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
9fd0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51   || !defined (SQ
9fe0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
9ff0: 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66  LTABLE).      if
a000: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
a010: 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  || IsVirtual(pTa
a020: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  b) ){.        /*
a030: 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69   We reach here i
a040: 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
a050: 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20  e is a really a 
a060: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20  view */.        
a070: 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
a080: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
a090: 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
a0a0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
a0b0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
a0c0: 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d       /* If pFrom
a0d0: 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 69 74 20  ->pSelect!=0 it 
a0e0: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
a0f0: 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20 20  ling with a.    
a100: 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74 68      ** view with
a110: 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65 20  in a view.  The 
a120: 53 45 4c 45 43 54 20 73 74 72 75 63 74 75 72 65  SELECT structure
a130: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
a140: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70  n.        ** cop
a150: 69 65 64 20 62 79 20 74 68 65 20 6f 75 74 65 72  ied by the outer
a160: 20 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e 20   view so we can 
a170: 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73 74  skip the copy st
a180: 65 70 20 68 65 72 65 0a 20 20 20 20 20 20 20 20  ep here.        
a190: 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ** in the inner 
a1a0: 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  view..        */
a1b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72  .        if( pFr
a1c0: 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
a1d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f  {.          pFro
a1e0: 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
a1f0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
a200: 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29  , pTab->pSelect)
a210: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a220: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
a230: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
a240: 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
a250: 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
a260: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
a270: 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
a280: 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  f( sqliteProcess
a290: 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20  Join(pParse, p) 
a2a0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f  ) return 1;..  /
a2b0: 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
a2c0: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
a2d0: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
a2e0: 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
a2f0: 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
a300: 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
a310: 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
a320: 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
a330: 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
a340: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
a350: 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
a360: 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
a370: 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
a380: 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
a390: 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f  e TK_ALL operato
a3a0: 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
a3b0: 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
a3c0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e  the column list.
a3d0: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
a3e0: 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
a3f0: 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
a400: 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f  TK_ALL expressio
a410: 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20  ns and expand.  
a420: 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74  ** each one to t
a430: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63  he list of all c
a440: 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
a450: 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
a460: 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
a470: 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
a480: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
a490: 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
a4a0: 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
a4b0: 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
a4c0: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
a4d0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
a4e0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d  {.    Expr *pE =
a4f0: 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45   pEList->a[k].pE
a500: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
a510: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
a520: 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  eak;.    if( pE-
a530: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
a540: 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d  E->pRight && pE-
a550: 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
a560: 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20  ALL.         && 
a570: 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d  pE->pLeft && pE-
a580: 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
a590: 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  D ) break;.  }. 
a5a0: 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b   rc = 0;.  if( k
a5b0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
a5c0: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
a5d0: 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
a5e0: 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
a5f0: 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
a600: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
a610: 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
a620: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
a630: 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
a640: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
a650: 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
a660: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
a670: 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
a680: 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
a690: 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
a6a0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
a6b0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
a6c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
a6d0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
a6e0: 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
a6f0: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
a700: 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
a710: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
a720: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 20 26 26  lColNames)!=0 &&
a730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a740: 20 20 20 20 20 20 20 28 66 6c 61 67 73 20 26 20         (flags & 
a750: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
a760: 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66  ames)==0;..    f
a770: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
a780: 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
a790: 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
a7a0: 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
a7b0: 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b    if( pE->op!=TK
a7c0: 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20 20 20 20  _ALL &&.        
a7d0: 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44     (pE->op!=TK_D
a7e0: 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  OT || pE->pRight
a7f0: 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  ==0 || pE->pRigh
a800: 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29  t->op!=TK_ALL) )
a810: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
a820: 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70  s particular exp
a830: 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
a840: 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
a850: 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nded..        */
a860: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
a870: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
a880: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
a890: 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20  ew, a[k].pExpr, 
a8a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
a8b0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
a8c0: 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
a8d0: 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
a8e0: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
a8f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a900: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
a910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a920: 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
a930: 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
a940: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  me = 0;.      }e
a950: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
a960: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
a970: 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54  is a "*" or a "T
a980: 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64  ABLE.*" and need
a990: 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20  s to be.        
a9a0: 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a  ** expanded. */.
a9b0: 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c          int tabl
a9c0: 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  eSeen = 0;      
a9d0: 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e  /* Set to 1 when
a9e0: 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a   TABLE matches *
a9f0: 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
aa00: 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  zTName;         
aa10: 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
aa20: 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
aa30: 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
aa40: 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
aa50: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
aa60: 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71 6c      zTName = sql
aa70: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
aa80: 6e 28 64 62 2c 20 26 70 45 2d 3e 70 4c 65 66 74  n(db, &pE->pLeft
aa90: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
aaa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
aab0: 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20     zTName = 0;. 
aac0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
aad0: 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
aae0: 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
aaf0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
ab00: 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
ab10: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
ab20: 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
ab30: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  b;.          cha
ab40: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46  r *zTabName = pF
ab50: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  rom->zAlias;.   
ab60: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
ab70: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61  ame==0 || zTabNa
ab80: 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20  me[0]==0 ){ .   
ab90: 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d           zTabNam
aba0: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
abb0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
abc0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
abd0: 65 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d  e && (zTabName==
abe0: 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  0 || zTabName[0]
abf0: 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ==0 || .        
ac00: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ac10: 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
ac20: 7a 54 61 62 4e 61 6d 65 29 21 3d 30 29 20 29 7b  zTabName)!=0) ){
ac30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
ac40: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
ac50: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61 62   }.          tab
ac60: 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  leSeen = 1;.    
ac70: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
ac80: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
ac90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  ){.            E
aca0: 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 52 69  xpr *pExpr, *pRi
acb0: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
acc0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
acd0: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
ace0: 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  me;..           
acf0: 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20   /* If a column 
ad00: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69  is marked as 'hi
ad10: 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79  dden' (currently
ad20: 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20   only possible. 
ad30: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f             ** fo
ad40: 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  r virtual tables
ad50: 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64  ), do not includ
ad60: 65 20 69 74 20 69 6e 20 74 68 65 20 65 78 70 61  e it in the expa
ad70: 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  nded.           
ad80: 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c   ** result-set l
ad90: 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ist..           
ada0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
adb0: 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75  if( IsHiddenColu
adc0: 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  mn(&pTab->aCol[j
add0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
ade0: 20 20 20 20 61 73 73 65 72 74 28 49 73 56 69 72      assert(IsVir
adf0: 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20  tual(pTab));.   
ae00: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
ae10: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
ae20: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
ae30: 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
ae40: 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
ae50: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
ae60: 65 66 74 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  eft = &pTabList-
ae70: 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20  >a[i-1];.       
ae80: 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 66         if( (pLef
ae90: 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  t[1].jointype & 
aea0: 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26  JT_NATURAL)!=0 &
aeb0: 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
aec0: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
aed0: 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 54 61  Index(pLeft->pTa
aee0: 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  b, zName)>=0 ){.
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20  /* In a NATURAL 
af10: 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a  join, omit the j
af20: 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  oin columns from
af30: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
af40: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f        ** table o
af50: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
af70: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
af80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
af90: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
afa0: 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 4c  e3IdListIndex(pL
afb0: 65 66 74 5b 31 5d 2e 70 55 73 69 6e 67 2c 20 7a  eft[1].pUsing, z
afc0: 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
afe0: 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20  n a join with a 
aff0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d  USING clause, om
b000: 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  it columns in th
b010: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
b020: 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73    ** using claus
b030: 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  e from the table
b040: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a   on the right. *
b050: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
b060: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
b070: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b080: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b090: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73        pRight = s
b0a0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
b0b0: 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  se, TK_ID, 0, 0,
b0c0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
b0d0: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
b0e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
b0f0: 20 20 20 20 73 65 74 51 75 6f 74 65 64 54 6f 6b      setQuotedTok
b100: 65 6e 28 70 50 61 72 73 65 2c 20 26 70 52 69 67  en(pParse, &pRig
b110: 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65  ht->token, zName
b120: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
b130: 66 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 28  f( zTabName && (
b140: 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61  longNames || pTa
b150: 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29  bList->nSrc>1) )
b160: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b170: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
b180: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
b190: 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  e, TK_ID, 0, 0, 
b1a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
b1b0: 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
b1c0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
b1d0: 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
b1e0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
b1f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
b200: 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r==0 ) break;.  
b210: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 51              setQ
b220: 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50 61 72 73  uotedToken(pPars
b230: 65 2c 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  e, &pLeft->token
b240: 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  , zTabName);.   
b250: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54 6f             setTo
b260: 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73 70 61 6e  ken(&pExpr->span
b270: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
b280: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
b290: 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
b2a0: 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
b2b0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
b2c0: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79    pExpr->span.dy
b2d0: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
b2e0: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
b2f0: 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.z = 0;.       
b300: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
b310: 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  ken.n = 0;.     
b320: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
b330: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20  token.dyn = 0;. 
b340: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
b350: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b360: 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
b370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
b380: 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70  xpr->span = pExp
b390: 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  r->token;.      
b3a0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
b3b0: 70 61 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  pan.dyn = 0;.   
b3c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b3d0: 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
b3e0: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
b3f0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
b400: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
b410: 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
b420: 20 70 45 78 70 72 2c 20 26 70 45 78 70 72 2d 3e   pExpr, &pExpr->
b430: 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  span);.         
b440: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b450: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
b460: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
b470: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
b480: 77 2c 20 70 45 78 70 72 2c 20 26 70 52 69 67 68  w, pExpr, &pRigh
b490: 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  t->token);.     
b4a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b4b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
b4c0: 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
b4d0: 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
b4e0: 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
b4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
b500: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
b510: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
b520: 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
b530: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
b540: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
b550: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
b560: 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
b570: 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
b580: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b590: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
b5a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b5b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 4e  sqlite3_free(zTN
b5c0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
b5d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
b5e0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
b5f0: 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45  List);.    p->pE
b600: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
b610: 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
b620: 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   && p->pEList->n
b630: 45 78 70 72 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Expr>SQLITE_MAX_
b640: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 73 71  COLUMN ){.    sq
b650: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
b660: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
b670: 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
b680: 74 20 73 65 74 22 29 3b 0a 20 20 20 20 72 63 20  t set");.    rc 
b690: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
b6a0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61    }.  if( db->ma
b6b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
b6c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
b6d0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
b6e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  n rc;.}../*.** p
b6f0: 45 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  E is a pointer t
b700: 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  o an expression 
b710: 77 68 69 63 68 20 69 73 20 61 20 73 69 6e 67 6c  which is a singl
b720: 65 20 74 65 72 6d 20 69 6e 0a 2a 2a 20 4f 52 44  e term in.** ORD
b730: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
b740: 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  Y clause..**.** 
b750: 49 66 20 70 45 20 65 76 61 6c 75 61 74 65 73 20  If pE evaluates 
b760: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  to an integer co
b770: 6e 73 74 61 6e 74 20 69 2c 20 74 68 65 6e 20 72  nstant i, then r
b780: 65 74 75 72 6e 20 69 2e 0a 2a 2a 20 54 68 69 73  eturn i..** This
b790: 20 69 73 20 61 6e 20 69 6e 64 69 63 61 74 69 6f   is an indicatio
b7a0: 6e 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  n to the caller 
b7b0: 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73  that it should s
b7c0: 6f 72 74 0a 2a 2a 20 62 79 20 74 68 65 20 69 2d  ort.** by the i-
b7d0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
b7e0: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a   result set..**.
b7f0: 2a 2a 20 49 66 20 70 45 20 69 73 20 61 20 77 65  ** If pE is a we
b800: 6c 6c 2d 66 6f 72 6d 65 64 20 65 78 70 72 65 73  ll-formed expres
b810: 73 69 6f 6e 20 61 6e 64 20 74 68 65 20 53 45 4c  sion and the SEL
b820: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
b830: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6f 75 6e 64   is not compound
b840: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 2e  , then return 0.
b850: 20 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73    This indicates
b860: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   to the.** calle
b870: 72 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  r that it should
b880: 20 73 6f 72 74 20 62 79 20 74 68 65 20 76 61 6c   sort by the val
b890: 75 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ue of the ORDER 
b8a0: 42 59 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  BY.** expression
b8b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ..**.** If the S
b8c0: 45 4c 45 43 54 20 69 73 20 63 6f 6d 70 6f 75 6e  ELECT is compoun
b8d0: 64 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20  d, then attempt 
b8e0: 74 6f 20 6d 61 74 63 68 20 70 45 20 61 67 61 69  to match pE agai
b8f0: 6e 73 74 0a 2a 2a 20 72 65 73 75 6c 74 20 73 65  nst.** result se
b900: 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
b910: 20 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43   left-most SELEC
b920: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65  T statement.  Re
b930: 74 75 72 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  turn.** the inde
b940: 78 20 69 20 6f 66 20 74 68 65 20 6d 61 74 63 68  x i of the match
b950: 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 61 73 20 61  ing column, as a
b960: 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20  n indication to 
b970: 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74  the .** caller t
b980: 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73 6f  hat it should so
b990: 72 74 20 62 79 20 74 68 65 20 69 2d 74 68 20 63  rt by the i-th c
b9a0: 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 65 72 65  olumn.  If there
b9b0: 20 69 73 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 2c   is.** no match,
b9c0: 20 72 65 74 75 72 6e 20 2d 31 20 61 6e 64 20 6c   return -1 and l
b9d0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
b9e0: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
b9f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
ba00: 61 74 63 68 4f 72 64 65 72 42 79 54 65 72 6d 54  atchOrderByTermT
ba10: 6f 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  oExprList(.  Par
ba20: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ba30: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
ba40: 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  xt for error mes
ba50: 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63  sages */.  Selec
ba60: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a  t *pSelect,   /*
ba70: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
ba80: 65 6d 65 6e 74 20 77 69 74 68 20 74 68 65 20 4f  ement with the O
ba90: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
baa0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 20 20  /.  Expr *pE,   
bab0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
bac0: 65 63 69 66 69 63 20 4f 52 44 45 52 20 42 59 20  ecific ORDER BY 
bad0: 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 64  term */.  int id
bae0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
baf0: 57 68 65 6e 20 4f 52 44 45 52 20 42 59 20 74 65  When ORDER BY te
bb00: 72 6d 20 69 73 20 74 68 69 73 20 2a 2f 0a 20 20  rm is this */.  
bb10: 69 6e 74 20 69 73 43 6f 6d 70 6f 75 6e 64 2c 20  int isCompound, 
bb20: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
bb30: 69 73 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  is is a compound
bb40: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 75 38 20   SELECT */.  u8 
bb50: 2a 70 48 61 73 41 67 67 20 20 20 20 20 20 20 20  *pHasAgg        
bb60: 2f 2a 20 54 72 75 65 20 69 66 20 65 78 70 72 65  /* True if expre
bb70: 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61  ssion contains a
bb80: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
bb90: 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ns */.){.  int i
bba0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
bbb0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
bbc0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
bbd0: 69 73 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6c  ist;  /* The col
bbe0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 72 65 73 75  umns of the resu
bbf0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 4e 61 6d 65  lt set */.  Name
bc00: 43 6f 6e 74 65 78 74 20 6e 63 3b 20 20 20 20 2f  Context nc;    /
bc10: 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
bc20: 6f 72 20 72 65 73 6f 6c 76 69 6e 67 20 70 45 20  or resolving pE 
bc30: 2a 2f 0a 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  */...  /* If the
bc40: 20 74 65 72 6d 20 69 73 20 61 6e 20 69 6e 74 65   term is an inte
bc50: 67 65 72 20 63 6f 6e 73 74 61 6e 74 2c 20 72 65  ger constant, re
bc60: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
bc70: 66 20 74 68 61 74 0a 20 20 2a 2a 20 63 6f 6e 73  f that.  ** cons
bc80: 74 61 6e 74 20 2a 2f 0a 20 20 70 45 4c 69 73 74  tant */.  pEList
bc90: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
bca0: 73 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  st;.  if( sqlite
bcb0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
bcc0: 45 2c 20 26 69 29 20 29 7b 0a 20 20 20 20 69 66  E, &i) ){.    if
bcd0: 28 20 69 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i<=0 ){.      
bce0: 2f 2a 20 49 66 20 69 20 69 73 20 74 6f 6f 20 73  /* If i is too s
bcf0: 6d 61 6c 6c 2c 20 6d 61 6b 65 20 69 74 20 74 6f  mall, make it to
bd00: 6f 20 62 69 67 2e 20 20 54 68 61 74 20 77 61 79  o big.  That way
bd10: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 20 20 20   the calling.   
bd20: 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73     ** function s
bd30: 74 69 6c 6c 20 73 65 65 73 20 61 20 76 61 6c 75  till sees a valu
bd40: 65 20 74 68 61 74 20 69 73 20 6f 75 74 20 6f 66  e that is out of
bd50: 20 72 61 6e 67 65 2c 20 62 75 74 20 64 6f 65 73   range, but does
bd60: 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f  .      ** not co
bd70: 6e 66 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  nfuse the column
bd80: 20 6e 75 6d 62 65 72 20 77 69 74 68 20 30 20 6f   number with 0 o
bd90: 72 20 2d 31 20 72 65 73 75 6c 74 20 63 6f 64 65  r -1 result code
bda0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
bdb0: 20 69 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78   i = pEList->nEx
bdc0: 70 72 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pr+1;.    }.    
bdd0: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 0a 20  return i;.  }.. 
bde0: 20 2f 2a 20 49 66 20 74 68 65 20 74 65 72 6d 20   /* If the term 
bdf0: 69 73 20 61 20 73 69 6d 70 6c 65 20 69 64 65 6e  is a simple iden
be00: 74 69 66 69 65 72 20 74 68 61 74 20 74 72 79 20  tifier that try 
be10: 74 6f 20 6d 61 74 63 68 20 74 68 61 74 20 69 64  to match that id
be20: 65 6e 74 69 66 69 65 72 0a 20 20 2a 2a 20 61 67  entifier.  ** ag
be30: 61 69 6e 73 74 20 61 20 63 6f 6c 75 6d 6e 20 6e  ainst a column n
be40: 61 6d 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ame in the resul
be50: 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
be60: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  ( pE->op==TK_ID 
be70: 7c 7c 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53  || (pE->op==TK_S
be80: 54 52 49 4e 47 20 26 26 20 70 45 2d 3e 74 6f 6b  TRING && pE->tok
be90: 65 6e 2e 7a 5b 30 5d 21 3d 27 5c 27 27 29 20 29  en.z[0]!='\'') )
bea0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
beb0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
bec0: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d      char *zCol =
bed0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
bee0: 54 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d 3e 74  Token(db, &pE->t
bef0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a  oken);.    if( z
bf00: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col==0 ){.      
bf10: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
bf20: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
bf30: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
bf40: 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ++){.      char 
bf50: 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61  *zAs = pEList->a
bf60: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
bf70: 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73   if( zAs!=0 && s
bf80: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
bf90: 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  s, zCol)==0 ){. 
bfa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
bfb0: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  ree(zCol);.     
bfc0: 20 20 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20     return i+1;. 
bfd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
bfe0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
bff0: 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ol);.  }..  /* R
c000: 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73  esolve all names
c010: 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
c020: 20 74 65 72 6d 20 65 78 70 72 65 73 73 69 6f 6e   term expression
c030: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
c040: 6e 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6e 63  nc, 0, sizeof(nc
c050: 29 29 3b 0a 20 20 6e 63 2e 70 50 61 72 73 65 20  ));.  nc.pParse 
c060: 3d 20 70 50 61 72 73 65 3b 0a 20 20 6e 63 2e 70  = pParse;.  nc.p
c070: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
c080: 74 2d 3e 70 53 72 63 3b 0a 20 20 6e 63 2e 70 45  t->pSrc;.  nc.pE
c090: 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20  List = pEList;. 
c0a0: 20 6e 63 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31   nc.allowAgg = 1
c0b0: 3b 0a 20 20 6e 63 2e 6e 45 72 72 20 3d 20 30 3b  ;.  nc.nErr = 0;
c0c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
c0d0: 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
c0e0: 6e 63 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 69  nc, pE) ){.    i
c0f0: 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64 20 29 7b  f( isCompound ){
c100: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
c110: 72 6f 72 43 6c 65 61 72 28 70 50 61 72 73 65 29  rorClear(pParse)
c120: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
c130: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c140: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
c150: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 63    }.  }.  if( nc
c160: 2e 68 61 73 41 67 67 20 26 26 20 70 48 61 73 41  .hasAgg && pHasA
c170: 67 67 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 41  gg ){.    *pHasA
c180: 67 67 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  gg = 1;.  }..  /
c190: 2a 20 46 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64  * For a compound
c1a0: 20 53 45 4c 45 43 54 2c 20 77 65 20 6e 65 65 64   SELECT, we need
c1b0: 20 74 6f 20 74 72 79 20 74 6f 20 6d 61 74 63 68   to try to match
c1c0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
c1d0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67  ** expression ag
c1e0: 61 69 6e 73 74 20 61 6e 20 65 78 70 72 65 73 73  ainst an express
c1f0: 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ion in the resul
c200: 74 20 73 65 74 0a 20 20 2a 2f 0a 20 20 69 66 28  t set.  */.  if(
c210: 20 69 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20   isCompound ){. 
c220: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
c230: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
c240: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
c250: 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
c260: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
c270: 70 72 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20  pr, pE) ){.     
c280: 20 20 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20     return i+1;. 
c290: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c2a0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
c2b0: 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61  ./*.** Analyze a
c2c0: 6e 64 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  nd ORDER BY or G
c2d0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69  ROUP BY clause i
c2e0: 6e 20 61 20 73 69 6d 70 6c 65 20 53 45 4c 45 43  n a simple SELEC
c2f0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
c300: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
c310: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
c320: 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 74 65  ..**.** Every te
c330: 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  rm of the ORDER 
c340: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
c350: 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 62  lause needs to b
c360: 65 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  e an.** expressi
c370: 6f 6e 2e 20 20 49 66 20 61 6e 79 20 65 78 70 72  on.  If any expr
c380: 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74  ession is an int
c390: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2c 20 74  eger constant, t
c3a0: 68 65 6e 0a 2a 2a 20 74 68 61 74 20 65 78 70 72  hen.** that expr
c3b0: 65 73 73 69 6f 6e 20 69 73 20 72 65 70 6c 61 63  ession is replac
c3c0: 65 64 20 62 79 20 74 68 65 20 63 6f 72 72 65 73  ed by the corres
c3d0: 70 6f 6e 64 69 6e 67 20 0a 2a 2a 20 65 78 70 72  ponding .** expr
c3e0: 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ession from the 
c3f0: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73  result set..*/.s
c400: 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73  tatic int proces
c410: 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 0a 20  sOrderGroupBy(. 
c420: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c430: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
c440: 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65 61 76  g context.  Leav
c450: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  e error messages
c460: 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63   here */.  Selec
c470: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
c480: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
c490: 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e  tatement contain
c4a0: 69 6e 67 20 74 68 65 20 63 6c 61 75 73 65 20 2a  ing the clause *
c4b0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
c4c0: 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 54 68 65  rderBy,   /* The
c4d0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
c4e0: 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  UP BY clause to 
c4f0: 62 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  be processed */.
c500: 20 20 69 6e 74 20 69 73 4f 72 64 65 72 2c 20 20    int isOrder,  
c510: 20 20 20 20 20 20 20 20 2f 2a 20 31 20 66 6f 72          /* 1 for
c520: 20 4f 52 44 45 52 20 42 59 2e 20 20 30 20 66 6f   ORDER BY.  0 fo
c530: 72 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  r GROUP BY */.  
c540: 75 38 20 2a 70 48 61 73 41 67 67 20 20 20 20 20  u8 *pHasAgg     
c550: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
c560: 54 52 55 45 20 69 66 20 61 6e 79 20 74 65 72 6d  TRUE if any term
c570: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 61 67 67   contains an agg
c580: 72 65 67 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69  regate */.){.  i
c590: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
c5a0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c5b0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
c5c0: 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4f 72  List;..  if( pOr
c5d0: 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
c5e0: 6e 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  n 0;.  if( pOrde
c5f0: 72 42 79 2d 3e 6e 45 78 70 72 3e 53 51 4c 49 54  rBy->nExpr>SQLIT
c600: 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  E_MAX_COLUMN ){.
c610: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c620: 7a 54 79 70 65 20 3d 20 69 73 4f 72 64 65 72 20  zType = isOrder 
c630: 3f 20 22 4f 52 44 45 52 22 20 3a 20 22 47 52 4f  ? "ORDER" : "GRO
c640: 55 50 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  UP";.    sqlite3
c650: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
c660: 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73   "too many terms
c670: 20 69 6e 20 25 73 20 42 59 20 63 6c 61 75 73 65   in %s BY clause
c680: 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 72  ", zType);.    r
c690: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70  eturn 1;.  }.  p
c6a0: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
c6b0: 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
c6c0: 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  EList==0 ){.    
c6d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c6e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
c6f0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
c700: 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  {.    int iCol;.
c710: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
c720: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
c730: 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  xpr;.    iCol = 
c740: 6d 61 74 63 68 4f 72 64 65 72 42 79 54 65 72 6d  matchOrderByTerm
c750: 54 6f 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  ToExprList(pPars
c760: 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 45 2c 20  e, pSelect, pE, 
c770: 69 2b 31 2c 20 30 2c 20 70 48 61 73 41 67 67 29  i+1, 0, pHasAgg)
c780: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
c790: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c7a0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
c7b0: 28 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e  ( iCol>pEList->n
c7c0: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 63 6f  Expr ){.      co
c7d0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
c7e0: 3d 20 69 73 4f 72 64 65 72 20 3f 20 22 4f 52 44  = isOrder ? "ORD
c7f0: 45 52 22 20 3a 20 22 47 52 4f 55 50 22 3b 0a 20  ER" : "GROUP";. 
c800: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
c810: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
c820: 20 20 20 20 20 20 20 22 25 72 20 25 73 20 42 59         "%r %s BY
c830: 20 74 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e   term out of ran
c840: 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22  ge - should be "
c850: 0a 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65  .         "betwe
c860: 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 2b  en 1 and %d", i+
c870: 31 2c 20 7a 54 79 70 65 2c 20 70 45 4c 69 73 74  1, zType, pEList
c880: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
c890: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
c8a0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29      if( iCol>0 )
c8b0: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
c8c0: 2a 70 43 6f 6c 6c 20 3d 20 70 45 2d 3e 70 43 6f  *pColl = pE->pCo
c8d0: 6c 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c  ll;.      int fl
c8e0: 61 67 73 20 3d 20 70 45 2d 3e 66 6c 61 67 73 20  ags = pE->flags 
c8f0: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  & EP_ExpCollate;
c900: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
c910: 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20 20  prDelete(pE);.  
c920: 20 20 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33      pE = sqlite3
c930: 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69  ExprDup(db, pELi
c940: 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45  st->a[iCol-1].pE
c950: 78 70 72 29 3b 0a 20 20 20 20 20 20 70 4f 72 64  xpr);.      pOrd
c960: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
c970: 20 3d 20 70 45 3b 0a 20 20 20 20 20 20 69 66 28   = pE;.      if(
c980: 20 70 43 6f 6c 6c 20 26 26 20 66 6c 61 67 73 20   pColl && flags 
c990: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 70  ){.        pE->p
c9a0: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  Coll = pColl;.  
c9b0: 20 20 20 20 20 20 70 45 2d 3e 66 6c 61 67 73 20        pE->flags 
c9c0: 7c 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20  |= flags;.      
c9d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
c9e0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
c9f0: 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f 52 44   Analyze and ORD
ca00: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
ca10: 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20 53 45  Y clause in a SE
ca20: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
ca30: 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e   Return.** the n
ca40: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
ca50: 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  seen..**.** The 
ca60: 70 72 6f 63 65 73 73 69 6e 67 20 64 65 70 65 6e  processing depen
ca70: 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68  ds on whether th
ca80: 65 20 53 45 4c 45 43 54 20 69 73 20 73 69 6d 70  e SELECT is simp
ca90: 6c 65 20 6f 72 20 63 6f 6d 70 6f 75 6e 64 2e 0a  le or compound..
caa0: 2a 2a 20 46 6f 72 20 61 20 73 69 6d 70 6c 65 20  ** For a simple 
cab0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
cac0: 2c 20 65 76 72 79 20 74 65 72 6d 20 6f 66 20 74  , evry term of t
cad0: 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  he ORDER BY or G
cae0: 52 4f 55 50 20 42 59 0a 2a 2a 20 63 6c 61 75 73  ROUP BY.** claus
caf0: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6e  e needs to be an
cb00: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 66   expression.  If
cb10: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
cb20: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 0a 2a 2a  is an integer.**
cb30: 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
cb40: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20  that expression 
cb50: 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 74  is replaced by t
cb60: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
cb70: 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20   .** expression 
cb80: 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 20  from the result 
cb90: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63  set..**.** For c
cba0: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
cbb0: 74 61 74 65 6d 65 6e 74 73 2c 20 65 76 65 72 79  tatements, every
cbc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 65 65 64   expression need
cbd0: 73 20 74 6f 20 62 65 20 6f 66 0a 2a 2a 20 74 79  s to be of.** ty
cbe0: 70 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 77 69 74  pe TK_COLUMN wit
cbf0: 68 20 61 20 69 54 61 62 6c 65 20 76 61 6c 75 65  h a iTable value
cc00: 20 61 73 20 67 69 76 65 6e 20 69 6e 20 74 68 65   as given in the
cc10: 20 34 74 68 20 70 61 72 61 6d 65 74 65 72 2e 0a   4th parameter..
cc20: 2a 2a 20 49 66 20 61 6e 79 20 65 78 70 72 65 73  ** If any expres
cc30: 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67  sion is an integ
cc40: 65 72 2c 20 74 68 61 74 20 62 65 63 6f 6d 65 73  er, that becomes
cc50: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
cc60: 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
cc70: 2c 20 6d 61 74 63 68 20 74 68 65 20 65 78 70 72  , match the expr
cc80: 65 73 73 69 6f 6e 20 61 67 61 69 6e 73 74 20 72  ession against r
cc90: 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
cca0: 73 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6c 65  s from.** the le
ccb0: 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 2e 0a  ft-most SELECT..
ccc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
ccd0: 6f 63 65 73 73 43 6f 6d 70 6f 75 6e 64 4f 72 64  ocessCompoundOrd
cce0: 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
ccf0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
cd00: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
cd10: 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d  .  Leave error m
cd20: 65 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a  essages here */.
cd30: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
cd40: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53  t,      /* The S
cd50: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
cd60: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 4f  containing the O
cd70: 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 69 6e 74  RDER BY */.  int
cd80: 20 69 54 61 62 6c 65 20 20 20 20 20 20 20 20 20   iTable         
cd90: 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 61 62     /* Output tab
cda0: 6c 65 20 66 6f 72 20 63 6f 6d 70 6f 75 6e 64 20  le for compound 
cdb0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
cdc0: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
cdd0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
cde0: 64 65 72 42 79 3b 0a 20 20 45 78 70 72 4c 69 73  derBy;.  ExprLis
cdf0: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c  t *pEList;.  sql
ce00: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
ce10: 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 0a 20  moreToDo = 1;.. 
ce20: 20 70 4f 72 64 65 72 42 79 20 3d 20 70 53 65 6c   pOrderBy = pSel
ce30: 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  ect->pOrderBy;. 
ce40: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
ce50: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
ce60: 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  f( pOrderBy->nEx
ce70: 70 72 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  pr>SQLITE_MAX_CO
ce80: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  LUMN ){.    sqli
ce90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
cea0: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65  se, "too many te
ceb0: 72 6d 73 20 69 6e 20 4f 52 44 45 52 20 42 59 20  rms in ORDER BY 
cec0: 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 72 65  clause");.    re
ced0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 64 62  turn 1;.  }.  db
cee0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
cef0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
cf00: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
cf10: 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d  ){.    pOrderBy-
cf20: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a  >a[i].done = 0;.
cf30: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65    }.  while( pSe
cf40: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  lect->pPrior ){.
cf50: 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53      pSelect = pS
cf60: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
cf70: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c   }.  while( pSel
cf80: 65 63 74 20 26 26 20 6d 6f 72 65 54 6f 44 6f 20  ect && moreToDo 
cf90: 29 7b 0a 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20  ){.    moreToDo 
cfa0: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
cfb0: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
cfc0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
cfd0: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20   int iCol;.     
cfe0: 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 44 75 70   Expr *pE, *pDup
cff0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
d000: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
d010: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
d020: 20 20 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d    pE = pOrderBy-
d030: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
d040: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
d050: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 29  3ExprDup(db, pE)
d060: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 75 70  ;.      if( pDup
d070: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
d080: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
d090: 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6d 61  .      iCol = ma
d0a0: 74 63 68 4f 72 64 65 72 42 79 54 65 72 6d 54 6f  tchOrderByTermTo
d0b0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
d0c0: 20 70 53 65 6c 65 63 74 2c 20 70 44 75 70 2c 20   pSelect, pDup, 
d0d0: 69 2b 31 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  i+1, 1, 0);.    
d0e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
d0f0: 65 74 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20  ete(pDup);.     
d100: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
d110: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
d120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
d130: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
d140: 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 69  >pEList;.      i
d150: 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a  f( pEList==0 ){.
d160: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
d170: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d180: 69 66 28 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d  if( iCol>pEList-
d190: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
d1a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d1b0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
d1c0: 20 20 20 20 20 20 22 25 72 20 4f 52 44 45 52 20        "%r ORDER 
d1d0: 42 59 20 74 65 72 6d 20 6f 75 74 20 6f 66 20 72  BY term out of r
d1e0: 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65  ange - should be
d1f0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 62   ".           "b
d200: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22  etween 1 and %d"
d210: 2c 20 69 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e  , i+1, pEList->n
d220: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72  Expr);.        r
d230: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
d240: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  .      if( iCol>
d250: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 2d  0 ){.        pE-
d260: 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
d270: 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 69 54 61  .        pE->iTa
d280: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
d290: 20 20 20 20 20 20 70 45 2d 3e 69 41 67 67 20 3d        pE->iAgg =
d2a0: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 45 2d   -1;.        pE-
d2b0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 2d  >iColumn = iCol-
d2c0: 31 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 70  1;.        pE->p
d2d0: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tab = 0;.       
d2e0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
d2f0: 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  done = 1;.      
d300: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
d310: 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 20 20 20  oreToDo = 1;.   
d320: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
d330: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
d340: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 66  ->pNext;.  }.  f
d350: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
d360: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
d370: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
d380: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 3d 3d 30 20  y->a[i].done==0 
d390: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d3a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
d3b0: 20 22 25 72 20 4f 52 44 45 52 20 42 59 20 74 65   "%r ORDER BY te
d3c0: 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  rm does not matc
d3d0: 68 20 61 6e 79 20 22 0a 20 20 20 20 20 20 20 20  h any ".        
d3e0: 20 20 20 20 22 63 6f 6c 75 6d 6e 20 69 6e 20 74      "column in t
d3f0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 22 2c 20  he result set", 
d400: 69 2b 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  i+1);.      retu
d410: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
d420: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
d430: 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20  *.** Get a VDBE 
d440: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
d450: 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43  rser context.  C
d460: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
d470: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
d480: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
d490: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
d4a0: 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73   and leave a mes
d4b0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
d4c0: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
d4d0: 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70  GetVdbe(Parse *p
d4e0: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
d4f0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
d500: 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  e;.  if( v==0 ){
d510: 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d  .    v = pParse-
d520: 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33  >pVdbe = sqlite3
d530: 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73  VdbeCreate(pPars
d540: 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65  e->db);.  }.  re
d550: 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn v;.}.../*.*
d560: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c  * Compute the iL
d570: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
d580: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53   fields of the S
d590: 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74  ELECT based on t
d5a0: 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64  he.** pLimit and
d5b0: 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73 73   pOffset express
d5c0: 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e  ions.  pLimit an
d5d0: 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74  d pOffset hold t
d5e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  he expressions.*
d5f0: 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  * that appear in
d600: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
d610: 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65  L statement afte
d620: 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  r the LIMIT and 
d630: 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72  OFFSET.** keywor
d640: 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20  ds.  Or NULL if 
d650: 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61  those keywords a
d660: 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d  re omitted. iLim
d670: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a  it and iOffset .
d680: 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  ** are the integ
d690: 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  er memory regist
d6a0: 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63  er numbers for c
d6b0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20  ounters used to 
d6c0: 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20  compute .** the 
d6d0: 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
d6e0: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
d6f0: 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f  o limit and/or o
d700: 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20  ffset, then .** 
d710: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
d720: 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e  et are negative.
d730: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
d740: 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20  ine changes the 
d750: 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74  values of iLimit
d760: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c   and iOffset onl
d770: 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20  y if.** a limit 
d780: 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66  or offset is def
d790: 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61  ined by pLimit a
d7a0: 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69  nd pOffset.  iLi
d7b0: 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73  mit and.** iOffs
d7c0: 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  et should have b
d7d0: 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70  een preset to ap
d7e0: 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c  propriate defaul
d7f0: 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75  t values.** (usu
d800: 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77  ally but not alw
d810: 61 79 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f  ays -1) prior to
d820: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
d830: 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69  utine..** Only i
d840: 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70  f pLimit!=0 or p
d850: 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65  Offset!=0 do the
d860: 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73   limit registers
d870: 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65   get.** redefine
d880: 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c  d.  The UNION AL
d890: 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20  L operator uses 
d8a0: 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f  this property to
d8b0: 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65   force.** the re
d8c0: 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  use of the same 
d8d0: 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
d8e0: 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73   registers acros
d8f0: 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45  s multiple.** SE
d900: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
d910: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d920: 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
d930: 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61  sters(Parse *pPa
d940: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
d950: 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56  int iBreak){.  V
d960: 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e  dbe *v = 0;.  in
d970: 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  t iLimit = 0;.  
d980: 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69  int iOffset;.  i
d990: 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b  nt addr1, addr2;
d9a0: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49  ..  /* .  ** "LI
d9b0: 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73  MIT -1" always s
d9c0: 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20  hows all rows.  
d9d0: 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20  There is some.  
d9e0: 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20 61  ** contraversy a
d9f0: 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f  bout what the co
da00: 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73  rrect behavior s
da10: 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54  hould be..  ** T
da20: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
da30: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70  mentation interp
da40: 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74  rets "LIMIT 0" t
da50: 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72  o mean.  ** no r
da60: 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ows..  */.  if( 
da70: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
da80: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69   p->iLimit = iLi
da90: 6d 69 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  mit = pParse->nM
daa0: 65 6d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  em;.    pParse->
dab0: 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 76  nMem += 2;.    v
dac0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
dad0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
dae0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
daf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
db00: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d  rCode(pParse, p-
db10: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
db20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
db30: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
db40: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
db50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
db60: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4c 69 6d  P_MemStore, iLim
db70: 69 74 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65  it, 1);.    Vdbe
db80: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4c  Comment((v, "# L
db90: 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
dba0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
dbb0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65  AddOp(v, OP_IfMe
dbc0: 6d 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69  mZero, iLimit, i
dbd0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69  Break);.    sqli
dbe0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
dbf0: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 4c 69 6d  OP_MemLoad, iLim
dc00: 69 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  it, 0);.  }.  if
dc10: 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a  ( p->pOffset ){.
dc20: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
dc30: 20 69 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73   iOffset = pPars
dc40: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 76  e->nMem++;.    v
dc50: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
dc60: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
dc70: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
dc80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
dc90: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d  rCode(pParse, p-
dca0: 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73  >pOffset);.    s
dcb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
dcc0: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
dcd0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
dce0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
dcf0: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4f 66  OP_MemStore, iOf
dd00: 66 73 65 74 2c 20 70 2d 3e 70 4c 69 6d 69 74 3d  fset, p->pLimit=
dd10: 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  =0);.    VdbeCom
dd20: 6d 65 6e 74 28 28 76 2c 20 22 23 20 4f 46 46 53  ment((v, "# OFFS
dd30: 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  ET counter"));. 
dd40: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
dd50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
dd60: 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 4f 66 66  P_IfMemPos, iOff
dd70: 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  set, 0);.    sql
dd80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
dd90: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
dda0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ddb0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
ddc0: 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  er, 0, 0);.    s
ddd0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
dde0: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
ddf0: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
de00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
de10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
de20: 41 64 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Add, 0, 0);.    
de30: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  }.  }.  if( p->p
de40: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 61 64 64  Limit ){.    add
de50: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
de60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65  AddOp(v, OP_IfMe
de70: 6d 50 6f 73 2c 20 69 4c 69 6d 69 74 2c 20 30 29  mPos, iLimit, 0)
de80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
de90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
dea0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 1, 0);.    sql
deb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
dec0: 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 2d 31 2c 20   OP_MemInt, -1, 
ded0: 69 4c 69 6d 69 74 2b 31 29 3b 0a 20 20 20 20 61  iLimit+1);.    a
dee0: 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
def0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
df00: 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  to, 0, 0);.    s
df10: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
df20: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
df30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
df40: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
df50: 65 2c 20 69 4c 69 6d 69 74 2b 31 2c 20 31 29 3b  e, iLimit+1, 1);
df60: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
df70: 28 28 76 2c 20 22 23 20 4c 49 4d 49 54 2b 4f 46  ((v, "# LIMIT+OF
df80: 46 53 45 54 22 29 29 3b 0a 20 20 20 20 73 71 6c  FSET"));.    sql
df90: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
dfa0: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a  (v, addr2);.  }.
dfb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
dfc0: 65 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  e a virtual inde
dfd0: 78 20 74 6f 20 75 73 65 20 66 6f 72 20 73 6f 72  x to use for sor
dfe0: 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ting..*/.static 
dff0: 76 6f 69 64 20 63 72 65 61 74 65 53 6f 72 74 69  void createSorti
e000: 6e 67 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  ngIndex(Parse *p
e010: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
e020: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64  , ExprList *pOrd
e030: 65 72 42 79 29 7b 0a 20 20 69 66 28 20 70 4f 72  erBy){.  if( pOr
e040: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74  derBy ){.    int
e050: 20 61 64 64 72 3b 0a 20 20 20 20 61 73 73 65 72   addr;.    asser
e060: 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  t( pOrderBy->iEC
e070: 75 72 73 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20  ursor==0 );.    
e080: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
e090: 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
e0a0: 62 2b 2b 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  b++;.    addr = 
e0b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e0c0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
e0d0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
e0e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
e100: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
e110: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
e120: 72 2b 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r+1);.    assert
e130: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
e140: 6d 5b 32 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[2] == -1 );.  
e150: 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
e160: 6d 5b 32 5d 20 3d 20 61 64 64 72 3b 0a 20 20 7d  m[2] = addr;.  }
e170: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
e180: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
e190: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
e1a0: 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
e1b0: 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
e1c0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
e1d0: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
e1e0: 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
e1f0: 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
e200: 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
e210: 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
e220: 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
e230: 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
e240: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
e250: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
e260: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
e270: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
e280: 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
e290: 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
e2a0: 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
e2b0: 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
e2c0: 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
e2d0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
e2e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
e2f0: 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
e300: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
e310: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
e320: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
e330: 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
e340: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
e350: 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
e360: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
e370: 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
e380: 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
e390: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
e3a0: 20 20 7d 0a 20 20 69 66 28 20 70 52 65 74 3d 3d    }.  if( pRet==
e3b0: 30 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  0 ){.    pRet = 
e3c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
e3d0: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  eq(pParse, p->pE
e3e0: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
e3f0: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  xpr);.  }.  retu
e400: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn pRet;.}.#endi
e410: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
e420: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
e430: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
e440: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
e450: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54  D_SELECT./*.** T
e460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
e470: 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73  alled to process
e480: 20 61 20 71 75 65 72 79 20 74 68 61 74 20 69 73   a query that is
e490: 20 72 65 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f   really the unio
e4a0: 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65 63  n.** or intersec
e4b0: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d  tion of two or m
e4c0: 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65  ore separate que
e4d0: 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20  ries..**.** "p" 
e4e0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69  points to the ri
e4f0: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20  ght-most of the 
e500: 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68  two queries.  th
e510: 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a  e query on the.*
e520: 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72  * left is p->pPr
e530: 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71  ior.  The left q
e540: 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20  uery could also 
e550: 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  be a compound qu
e560: 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ery.** in which 
e570: 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
e580: 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
e590: 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a   recursively. .*
e5a0: 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
e5b0: 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   of the total qu
e5c0: 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72  ery are to be wr
e5d0: 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73  itten into a des
e5e0: 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  tination.** of t
e5f0: 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70  ype eDest with p
e600: 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a  arameter iParm..
e610: 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a  **.** Example 1:
e620: 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72    Consider a thr
e630: 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20  ee-way compound 
e640: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
e650: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
e660: 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  a FROM t1 UNION 
e670: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
e680: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20   UNION SELECT c 
e690: 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68  FROM t3.**.** Th
e6a0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  is statement is 
e6b0: 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c  parsed up as fol
e6c0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
e6d0: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
e6e0: 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  .**      |.**   
e6f0: 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45     `----->  SELE
e700: 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20  CT b FROM t2.** 
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
e720: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
e730: 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c     `------>  SEL
e740: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a  ECT a FROM t1.**
e750: 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69  .** The arrows i
e760: 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62  n the diagram ab
e770: 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68  ove represent th
e780: 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20  e Select.pPrior 
e790: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69  pointer..** So i
e7a0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
e7b0: 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20  s called with p 
e7c0: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20  equal to the t3 
e7d0: 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70  query, then.** p
e7e0: 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68  Prior will be th
e7f0: 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e  e t2 query.  p->
e800: 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e  op will be TK_UN
e810: 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65  ION in this case
e820: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74  ..**.** Notice t
e830: 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74  hat because of t
e840: 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61  he way SQLite pa
e850: 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45  rses compound SE
e860: 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e  LECTs, the.** in
e870: 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73  dividual selects
e880: 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72   always group fr
e890: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
e8a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e8b0: 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50  multiSelect(.  P
e8c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
e8d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e8e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
e8f0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
e900: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
e910: 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
e920: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
e930: 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20   int eDest,     
e940: 20 20 20 20 20 20 20 2f 2a 20 5c 5f 5f 5f 20 20         /* \___  
e950: 53 74 6f 72 65 20 71 75 65 72 79 20 72 65 73 75  Store query resu
e960: 6c 74 73 20 61 73 20 73 70 65 63 69 66 69 65 64  lts as specified
e970: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c   */.  int iParm,
e980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2f              /* /
e990: 20 20 20 20 20 62 79 20 74 68 65 73 65 20 74 77       by these tw
e9a0: 6f 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 20  o parameters.   
e9b0: 20 20 20 20 20 20 2a 2f 0a 20 20 63 68 61 72 20        */.  char 
e9c0: 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20  *aff            
e9d0: 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20   /* If eDest is 
e9e0: 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61  SRT_Union, the a
e9f0: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
ea00: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
ea10: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
ea20: 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
ea30: 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
ea40: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
ea50: 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
ea60: 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
ea70: 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
ea80: 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
ea90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
eaa0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
eab0: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
eac0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
ead0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
eae0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
eaf0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
eb00: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
eb10: 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
eb20: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
eb30: 20 6f 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20 61   on p */.  int a
eb40: 53 65 74 50 32 5b 32 5d 3b 20 20 20 20 20 20 20  SetP2[2];       
eb50: 20 2f 2a 20 53 65 74 20 50 32 20 76 61 6c 75 65   /* Set P2 value
eb60: 20 6f 66 20 74 68 65 73 65 20 6f 70 20 74 6f 20   of these op to 
eb70: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
eb80: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 74 50  s */.  int nSetP
eb90: 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  2 = 0;       /* 
eba0: 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20  Number of slots 
ebb0: 69 6e 20 61 53 65 74 50 32 5b 5d 20 75 73 65 64  in aSetP2[] used
ebc0: 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73   */..  /* Make s
ebd0: 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
ebe0: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
ebf0: 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f  T clause on prio
ec00: 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79  r SELECTs.  Only
ec10: 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28  .  ** the last (
ec20: 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45  right-most) SELE
ec30: 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73  CT in the series
ec40: 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44   may have an ORD
ec50: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a  ER BY or LIMIT..
ec60: 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20    */.  if( p==0 
ec70: 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  || p->pPrior==0 
ec80: 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  ){.    rc = 1;. 
ec90: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
eca0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
ecb0: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
ecc0: 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
ecd0: 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74  rior->pRightmost
ece0: 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73  !=pPrior );.  as
ecf0: 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52  sert( pPrior->pR
ed00: 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69  ightmost==p->pRi
ed10: 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 69 66 28  ghtmost );.  if(
ed20: 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
ed30: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
ed40: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
ed50: 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
ed60: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
ed70: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
ed80: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
ed90: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
eda0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
edb0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
edc0: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
edd0: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
ede0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
edf0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
ee00: 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
ee10: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
ee20: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
ee30: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
ee40: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
ee50: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
ee60: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
ee70: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
ee80: 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61  ure we have a va
ee90: 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65  lid query engine
eea0: 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74  .  If not, creat
eeb0: 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a  e a new one..  *
eec0: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
eed0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
eee0: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
eef0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
ef00: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
ef10: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  end;.  }..  /* C
ef20: 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
ef30: 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
ef40: 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
ef50: 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  ry.  */.  if( eD
ef60: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
ef70: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
ef80: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
ef90: 20 20 61 73 73 65 72 74 28 20 6e 53 65 74 50 32    assert( nSetP2
efa0: 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29 2f  <sizeof(aSetP2)/
efb0: 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30 5d  sizeof(aSetP2[0]
efc0: 29 20 29 3b 0a 20 20 20 20 61 53 65 74 50 32 5b  ) );.    aSetP2[
efd0: 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 73 71 6c 69  nSetP2++] = sqli
efe0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
eff0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
f000: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
f010: 20 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62   eDest = SRT_Tab
f020: 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  le;.  }..  /* Ge
f030: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
f040: 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
f050: 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ht SELECT statem
f060: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72  ents..  */.  pOr
f070: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
f080: 72 42 79 3b 0a 20 20 73 77 69 74 63 68 28 20 70  rBy;.  switch( p
f090: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
f0a0: 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20   TK_ALL: {.     
f0b0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
f0c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
f0d0: 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
f0e0: 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
f0f0: 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
f100: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69       pPrior->pLi
f110: 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
f120: 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
f130: 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  >pOffset = p->pO
f140: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 72  ffset;.        r
f150: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
f160: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
f170: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
f180: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
f190: 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74         p->pLimit
f1a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
f1b0: 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
f1c0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
f1d0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
f1e0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
f1f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f200: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
f210: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69  ;.        p->iLi
f220: 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c  mit = pPrior->iL
f230: 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d  imit;.        p-
f240: 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f  >iOffset = pPrio
f250: 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  r->iOffset;.    
f260: 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69      if( p->iLimi
f270: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t>=0 ){.        
f280: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
f290: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f2a0: 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c  IfMemZero, p->iL
f2b0: 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  imit, 0);.      
f2c0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
f2d0: 28 76 2c 20 22 23 20 4a 75 6d 70 20 61 68 65 61  (v, "# Jump ahea
f2e0: 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68  d if LIMIT reach
f2f0: 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  ed"));.        }
f300: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
f310: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
f320: 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50  se, p, eDest, iP
f330: 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  arm, 0, 0, 0, af
f340: 66 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  f);.        p->p
f350: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
f360: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
f370: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
f380: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
f390: 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
f3a0: 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
f3b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
f3c0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
f3d0: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20  , addr);.       
f3e0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
f3f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f400: 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c  /* For UNION ALL
f410: 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61   ... ORDER BY fa
f420: 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
f430: 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20  e next case */. 
f440: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
f450: 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73  _EXCEPT:.    cas
f460: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
f470: 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
f480: 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
f490: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
f4a0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c  porary table hol
f4b0: 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
f4c0: 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b       int op = 0;
f4d0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
f4e0: 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
f4f0: 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
f500: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  self */.      in
f510: 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
f520: 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
f530: 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
f540: 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
f550: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
f560: 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20  imit, *pOffset; 
f570: 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20  /* Saved values 
f580: 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64  of p->nLimit and
f590: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20   p->nOffset */. 
f5a0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a       int addr;..
f5b0: 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
f5c0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20  p->op==TK_ALL ? 
f5d0: 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f  SRT_Table : SRT_
f5e0: 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  Union;.      if(
f5f0: 20 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20   eDest==priorOp 
f600: 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  && pOrderBy==0 &
f610: 26 20 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20  & !p->pLimit && 
f620: 21 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20  !p->pOffset ){. 
f630: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e         /* We can
f640: 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61   reuse a tempora
f650: 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74  ry table generat
f660: 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74  ed by a SELECT t
f670: 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  o our.        **
f680: 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20   right..        
f690: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
f6a0: 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20  Tab = iParm;.   
f6b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f6c0: 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
f6d0: 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
f6e0: 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
f6f0: 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
f700: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
f710: 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
f720: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
f730: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
f740: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
f750: 20 20 20 20 20 20 20 69 66 28 20 70 72 6f 63 65         if( proce
f760: 73 73 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42  ssCompoundOrderB
f770: 79 28 70 50 61 72 73 65 2c 20 70 2c 20 75 6e 69  y(pParse, p, uni
f780: 6f 6e 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  onTab) ){.      
f790: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
f7a0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
f7b0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
f7c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
f7d0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
f7e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
f7f0: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f  nEphemeral, unio
f800: 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
f810: 20 20 69 66 28 20 70 72 69 6f 72 4f 70 3d 3d 53    if( priorOp==S
f820: 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  RT_Table ){.    
f830: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 53        assert( nS
f840: 65 74 50 32 3c 73 69 7a 65 6f 66 28 61 53 65 74  etP2<sizeof(aSet
f850: 50 32 29 2f 73 69 7a 65 6f 66 28 61 53 65 74 50  P2)/sizeof(aSetP
f860: 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 20  2[0]) );.       
f870: 20 20 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32     aSetP2[nSetP2
f880: 2b 2b 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  ++] = addr;.    
f890: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f8a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
f8b0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
f8c0: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  == -1 );.       
f8d0: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
f8e0: 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
f8f0: 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68          p->pRigh
f900: 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20  tmost->usesEphm 
f910: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
f920: 20 20 20 20 20 20 20 63 72 65 61 74 65 53 6f 72         createSor
f930: 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65  tingIndex(pParse
f940: 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , p, pOrderBy);.
f950: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f960: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
f970: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
f980: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
f990: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
f9a0: 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
f9b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
f9c0: 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
f9d0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
f9e0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
f9f0: 65 2c 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72  e, pPrior, prior
fa00: 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c  Op, unionTab, 0,
fa10: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
fa20: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
fa30: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
fa40: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
fa50: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
fa60: 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
fa70: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
fa80: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
fa90: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
faa0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
fab0: 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53  _EXCEPT:  op = S
fac0: 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65  RT_Except;   bre
fad0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
fae0: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70  e TK_UNION:   op
faf0: 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20   = SRT_Union;   
fb00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
fb10: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
fb20: 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65    op = SRT_Table
fb30: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
fb40: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
fb50: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
fb60: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
fb70: 20 20 20 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f        p->disallo
fb80: 77 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  wOrderBy = pOrde
fb90: 72 42 79 21 3d 30 3b 0a 20 20 20 20 20 20 70 4c  rBy!=0;.      pL
fba0: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
fbb0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
fbc0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
fbd0: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
fbe0: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
fbf0: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  set = 0;.      r
fc00: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
fc10: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c  t(pParse, p, op,
fc20: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c   unionTab, 0, 0,
fc30: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
fc40: 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e  /* Query flatten
fc50: 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65  ing in sqlite3Se
fc60: 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66  lect() might ref
fc70: 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e  ill p->pOrderBy.
fc80: 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72  .      ** Be sur
fc90: 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70  e to delete p->p
fca0: 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f  OrderBy, therefo
fcb0: 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  re, to avoid a m
fcc0: 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20  emory leak. */. 
fcd0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fce0: 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4f  ListDelete(p->pO
fcf0: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70  rderBy);.      p
fd00: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
fd10: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  r;.      p->pOrd
fd20: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
fd30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
fd40: 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d  prDelete(p->pLim
fd50: 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  it);.      p->pL
fd60: 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
fd70: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
fd80: 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  = pOffset;.     
fd90: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b   p->iLimit = -1;
fda0: 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
fdb0: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  t = -1;.      if
fdc0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
fdd0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
fde0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
fdf0: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  .      /* Conver
fe00: 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68  t the data in th
fe10: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
fe20: 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
fe30: 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74  form.      ** it
fe40: 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72   is that we curr
fe50: 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20  ently need..    
fe60: 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20    */      .     
fe70: 20 69 66 28 20 65 44 65 73 74 21 3d 70 72 69 6f   if( eDest!=prio
fe80: 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21  rOp || unionTab!
fe90: 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20  =iParm ){.      
fea0: 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
feb0: 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
fec0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
fed0: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
fee0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
fef0: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
ff00: 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
ff10: 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
ff20: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
ff30: 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
ff40: 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
ff50: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rior;.          
ff60: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
ff70: 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
ff80: 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
ff90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ffa0: 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
ffb0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
ffc0: 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
ffd0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
ffe0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
fff0: 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
10000 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
10010 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
10020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10030 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
10040 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  wind, unionTab, 
10050 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
10060 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
10070 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
10080 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  (v);.        rc 
10090 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  = selectInnerLoo
100a0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
100b0 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62  pEList, unionTab
100c0 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
100d0 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65   pOrderBy, -1, e
10100 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20  Dest, iParm, .  
10110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10120 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74             iCont
10130 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20  , iBreak, 0);.  
10140 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
10150 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
10160 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
10170 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
10180 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
10190 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
101a0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
101b0 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
101c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
101d0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
101e0 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a  onTab, iStart);.
101f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10200 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
10210 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
10220 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10230 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
10240 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
10250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
10260 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
10270 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
10280 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61  : {.      int ta
10290 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
102a0 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
102b0 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
102c0 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
102d0 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
102e0 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20  nt addr;..      
102f0 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
10300 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
10310 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
10320 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
10330 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
10340 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
10350 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
10360 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
10370 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
10380 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
10390 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
103a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
103b0 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
103c0 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
103d0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
103e0 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f 63 65  .      if( proce
103f0 73 73 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42  ssCompoundOrderB
10400 79 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61 62  y(pParse, p, tab
10410 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
10420 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
10430 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
10440 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
10450 20 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67     createSorting
10460 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c  Index(pParse, p,
10470 20 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20 20   pOrderBy);..   
10480 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
10490 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
104a0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
104b0 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
104c0 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
104d0 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
104e0 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
104f0 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61  rOpenEphm[0] = a
10500 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52  ddr;.      p->pR
10510 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70  ightmost->usesEp
10520 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73  hm = 1;.      as
10530 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
10540 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
10550 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
10560 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
10570 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
10580 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  tab1"..      */.
10590 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
105a0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
105b0 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69   pPrior, SRT_Uni
105c0 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c 20  on, tab1, 0, 0, 
105d0 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69  0, aff);.      i
105e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
105f0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
10600 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
10610 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
10620 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
10630 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  T into temporary
10640 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20   table "tab2".  
10650 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
10660 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
10670 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  ddOp(v, OP_OpenE
10680 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
10690 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
106a0 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
106b0 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[1] == -1 );.  
106c0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
106d0 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
106e0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
106f0 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
10700 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
10710 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
10720 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
10730 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
10740 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
10750 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
10760 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
10770 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69  arse, p, SRT_Uni
10780 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c 20  on, tab2, 0, 0, 
10790 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70  0, aff);.      p
107a0 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
107b0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
107c0 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
107d0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
107e0 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
107f0 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
10800 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
10810 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10820 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
10830 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
10840 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
10850 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
10860 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
10870 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
10880 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
10890 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
108a0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
108b0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
108c0 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
108d0 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
108e0 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
108f0 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
10900 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
10910 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
10920 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
10930 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e  ior;.        gen
10940 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
10950 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
10960 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
10970 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61     }.      iBrea
10980 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
10990 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
109a0 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
109b0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
109c0 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74  v);.      comput
109d0 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
109e0 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
109f0 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
10a00 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10a10 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
10a20 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 69 53  Break);.      iS
10a30 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
10a40 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
10a50 77 4b 65 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a  wKey, tab1, 0);.
10a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10a70 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
10a80 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f  Found, tab2, iCo
10a90 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  nt);.      rc = 
10aa0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
10ab0 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
10ac0 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70  List, tab1, p->p
10ad0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
10ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10af0 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
10b00 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  rBy, -1, eDest, 
10b10 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20  iParm, .        
10b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b30 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65       iCont, iBre
10b40 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ak, 0);.      if
10b50 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
10b60 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
10b70 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
10b80 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
10b90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10ba0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
10bb0 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  iCont);.      sq
10bc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10bd0 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c  , OP_Next, tab1,
10be0 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
10bf0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
10c00 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
10c10 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
10c20 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10c30 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
10c40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10c50 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
10c60 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
10c70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10c80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
10c90 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43  e sure all SELEC
10ca0 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  Ts in the statem
10cb0 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ent have the sam
10cc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
10cd0 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ents.  ** in the
10ce0 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ir result sets..
10cf0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
10d00 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69  ->pEList && pPri
10d10 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20  or->pEList );.  
10d20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
10d30 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45  Expr!=pPrior->pE
10d40 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
10d50 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
10d60 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
10d70 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
10d80 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
10d90 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20  .      " do not 
10da0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
10db0 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
10dc0 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f  olumns", selectO
10dd0 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
10de0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
10df0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
10e00 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
10e10 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
10e20 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 65 6d  f columns in tem
10e30 70 6f 72 61 72 79 20 74 61 62 6c 65 73 0a 20 20  porary tables.  
10e40 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70  */.  nCol = p->p
10e50 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
10e60 77 68 69 6c 65 28 20 6e 53 65 74 50 32 20 29 7b  while( nSetP2 ){
10e70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10e80 43 68 61 6e 67 65 50 32 28 76 2c 20 61 53 65 74  ChangeP2(v, aSet
10e90 50 32 5b 2d 2d 6e 53 65 74 50 32 5d 2c 20 6e 43  P2[--nSetP2], nC
10ea0 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ol);.  }..  /* C
10eb0 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67  ompute collating
10ec0 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20   sequences used 
10ed0 62 79 20 65 69 74 68 65 72 20 74 68 65 20 4f 52  by either the OR
10ee0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
10ef0 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20 74 65 6d  .  ** by any tem
10f00 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
10f10 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
10f20 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
10f30 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
10f40 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
10f50 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
10f60 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
10f70 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 0a 20 20  .  Invoke the.  
10f80 2a 2a 20 4f 52 44 45 52 20 42 59 20 70 72 6f 63  ** ORDER BY proc
10f90 65 73 73 69 6e 67 20 69 66 20 74 68 65 72 65 20  essing if there 
10fa0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
10fb0 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
10fc0 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
10fd0 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68   run by the righ
10fe0 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
10ff0 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20  atement only..  
11000 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
11010 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ents to the left
11020 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69   always skip thi
11030 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67  s part.  The rig
11040 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c  ht-most.  ** SEL
11050 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73  ECT might also s
11060 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66  kip this part if
11070 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52   it has no ORDER
11080 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20   BY clause and. 
11090 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c   ** no temp tabl
110a0 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  es are required.
110b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
110c0 65 72 42 79 20 7c 7c 20 70 2d 3e 75 73 65 73 45  erBy || p->usesE
110d0 70 68 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  phm ){.    int i
110e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
110f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
11100 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
11110 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
11120 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
11130 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
11140 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75  nce for the resu
11150 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65  lt set */.    Se
11160 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  lect *pLoop;    
11170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
11180 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
11190 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  gh SELECT statem
111a0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ents */.    int 
111b0 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20  nKeyCol;        
111c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
111d0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
111e0 6e 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  n pKeyInfo->aCol
111f0 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65  [] */.    CollSe
11200 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20  q **apColl;     
11210 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
11220 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70  ooping through p
11230 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d  KeyInfo->aColl[]
11240 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
11250 2a 2a 61 43 6f 70 79 3b 20 20 20 20 20 20 20 20  **aCopy;        
11260 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20        /* A copy 
11270 6f 66 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  of pKeyInfo->aCo
11280 6c 6c 5b 5d 20 2a 2f 0a 0a 20 20 20 20 61 73 73  ll[] */..    ass
11290 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f  ert( p->pRightmo
112a0 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 4b 65  st==p );.    nKe
112b0 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2b 20 28 70  yCol = nCol + (p
112c0 4f 72 64 65 72 42 79 20 3f 20 70 4f 72 64 65 72  OrderBy ? pOrder
112d0 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  By->nExpr : 0);.
112e0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
112f0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
11300 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  ro(pParse->db,. 
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11320 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b        sizeof(*pK
11330 65 79 49 6e 66 6f 29 2b 6e 4b 65 79 43 6f 6c 2a  eyInfo)+nKeyCol*
11340 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
11350 29 20 2b 20 31 29 29 3b 0a 20 20 20 20 69 66 28  ) + 1));.    if(
11360 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
11370 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11380 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
11390 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
113a0 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  nd;.    }..    p
113b0 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45  KeyInfo->enc = E
113c0 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  NC(pParse->db);.
113d0 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46      pKeyInfo->nF
113e0 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20  ield = nCol;..  
113f0 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c    for(i=0, apCol
11400 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  l=pKeyInfo->aCol
11410 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
11420 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20  apColl++){.     
11430 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69   *apColl = multi
11440 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
11450 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
11460 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c     if( 0==*apCol
11470 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70  l ){.        *ap
11480 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
11490 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
114a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
114b0 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
114c0 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
114d0 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
114e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
114f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
11500 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61   addr = pLoop->a
11510 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a  ddrOpenEphm[i];.
11520 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72          if( addr
11530 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
11540 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75  /* If [0] is unu
11550 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20  sed then [1] is 
11560 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f  also unused.  So
11570 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20   we can.        
11580 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65    ** always safe
11590 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e  ly abort as soon
115a0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e   as the first un
115b0 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75  used slot is fou
115c0 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
115d0 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
115e0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30  ddrOpenEphm[1]<0
115f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   );.          br
11600 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
11610 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11620 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
11630 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  dr, nCol);.     
11640 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
11650 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
11660 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
11670 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P3_KEYINFO);.  
11680 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64        pLoop->add
11690 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d  rOpenEphm[i] = -
116a0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
116b0 0a 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  ..    if( pOrder
116c0 42 79 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  By ){.      stru
116d0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
116e0 20 2a 70 4f 54 65 72 6d 20 3d 20 70 4f 72 64 65   *pOTerm = pOrde
116f0 72 42 79 2d 3e 61 3b 0a 20 20 20 20 20 20 69 6e  rBy->a;.      in
11700 74 20 6e 4f 72 64 65 72 42 79 45 78 70 72 20 3d  t nOrderByExpr =
11710 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
11720 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
11730 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 53 6f 72  ;.      u8 *pSor
11740 74 4f 72 64 65 72 3b 0a 0a 20 20 20 20 20 20 2f  tOrder;..      /
11750 2a 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65  * Reuse the same
11760 20 70 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68   pKeyInfo for th
11770 65 20 4f 52 44 45 52 20 42 59 20 61 73 20 77 61  e ORDER BY as wa
11780 73 20 75 73 65 64 20 61 62 6f 76 65 20 66 6f 72  s used above for
11790 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
117a0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 73 74  mpound select st
117b0 61 74 65 6d 65 6e 74 73 2e 20 20 45 78 63 65 70  atements.  Excep
117c0 74 20 77 65 20 68 61 76 65 20 74 6f 20 63 68 61  t we have to cha
117d0 6e 67 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20  nge out the.    
117e0 20 20 2a 2a 20 70 4b 65 79 49 6e 66 6f 2d 3e 61    ** pKeyInfo->a
117f0 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65 73 2e 20 20  Coll[] values.  
11800 53 6f 6d 65 20 6f 66 20 74 68 65 20 61 43 6f 6c  Some of the aCol
11810 6c 5b 5d 20 76 61 6c 75 65 73 20 77 69 6c 6c 20  l[] values will 
11820 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 75 73  be.      ** reus
11830 65 64 20 77 68 65 6e 20 63 6f 6e 73 74 72 75 63  ed when construc
11840 74 69 6e 67 20 74 68 65 20 70 4b 65 79 49 6e 66  ting the pKeyInf
11850 6f 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20  o for the ORDER 
11860 42 59 2c 20 73 6f 20 6d 61 6b 65 0a 20 20 20 20  BY, so make.    
11870 20 20 2a 2a 20 61 20 63 6f 70 79 2e 20 20 53 75    ** a copy.  Su
11880 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
11890 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 20  o hold both the 
118a0 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 66 6f 72  nCol entries for
118b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
118c0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 61 6e  mpound select an
118d0 64 20 74 68 65 20 6e 4f 72 64 65 72 62 79 45 78  d the nOrderbyEx
118e0 70 72 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  pr entries for t
118f0 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20  he ORDER BY.    
11900 20 20 2a 2a 20 77 61 73 20 61 6c 6c 6f 63 61 74    ** was allocat
11910 65 64 20 61 62 6f 76 65 2e 20 20 42 75 74 20 77  ed above.  But w
11920 65 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 74  e need to move t
11930 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
11940 63 74 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74 72  ct.      ** entr
11950 69 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 77  ies out of the w
11960 61 79 20 62 65 66 6f 72 65 20 63 6f 6e 73 74 72  ay before constr
11970 75 63 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52  ucting the ORDER
11980 20 42 59 20 65 6e 74 72 69 65 73 2e 0a 20 20 20   BY entries..   
11990 20 20 20 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63     ** Move the c
119a0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 65  ompound select e
119b0 6e 74 72 69 65 73 20 69 6e 74 6f 20 61 43 6f 70  ntries into aCop
119c0 79 5b 5d 20 77 68 65 72 65 20 74 68 65 79 20 63  y[] where they c
119d0 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 61  an be.      ** a
119e0 63 63 65 73 73 65 64 20 61 6e 64 20 72 65 75 73  ccessed and reus
119f0 65 64 20 77 68 65 6e 20 63 6f 6e 73 74 72 75 63  ed when construc
11a00 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
11a10 59 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  Y entries..     
11a20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 43 6f 6c   ** Because nCol
11a30 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65   might be greate
11a40 72 20 74 68 61 6e 20 6f 72 20 6c 65 73 73 20 74  r than or less t
11a50 68 61 6e 20 6e 4f 72 64 65 72 42 79 45 78 70 72  han nOrderByExpr
11a60 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 68 61 76  .      ** we hav
11a70 65 20 74 6f 20 75 73 65 20 6d 65 6d 6d 6f 76 65  e to use memmove
11a80 28 29 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  () when doing th
11a90 65 20 63 6f 70 79 2e 0a 20 20 20 20 20 20 2a 2f  e copy..      */
11aa0 0a 20 20 20 20 20 20 61 43 6f 70 79 20 3d 20 26  .      aCopy = &
11ab0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
11ac0 6e 4f 72 64 65 72 42 79 45 78 70 72 5d 3b 0a 20  nOrderByExpr];. 
11ad0 20 20 20 20 20 70 53 6f 72 74 4f 72 64 65 72 20       pSortOrder 
11ae0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  = pKeyInfo->aSor
11af0 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 61  tOrder = (u8*)&a
11b00 43 6f 70 79 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20  Copy[nCol];.    
11b10 20 20 6d 65 6d 6d 6f 76 65 28 61 43 6f 70 79 2c    memmove(aCopy,
11b20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
11b30 2c 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f  , nCol*sizeof(Co
11b40 6c 6c 53 65 71 2a 29 29 3b 0a 0a 20 20 20 20 20  llSeq*));..     
11b50 20 61 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   apColl = pKeyIn
11b60 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a 20 20 20 20 20  fo->aColl;.     
11b70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
11b80 65 72 42 79 45 78 70 72 3b 20 69 2b 2b 2c 20 70  erByExpr; i++, p
11b90 4f 54 65 72 6d 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  OTerm++, apColl+
11ba0 2b 2c 20 70 53 6f 72 74 4f 72 64 65 72 2b 2b 29  +, pSortOrder++)
11bb0 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
11bc0 70 45 78 70 72 20 3d 20 70 4f 54 65 72 6d 2d 3e  pExpr = pOTerm->
11bd0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
11be0 66 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  f( (pExpr->flags
11bf0 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
11c00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
11c10 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 43  ssert( pExpr->pC
11c20 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  oll!=0 );.      
11c30 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 45      *apColl = pE
11c40 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  xpr->pColl;.    
11c50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11c60 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 61       *apColl = a
11c70 43 6f 70 79 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  Copy[pExpr->iCol
11c80 75 6d 6e 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  umn];.        }.
11c90 20 20 20 20 20 20 20 20 2a 70 53 6f 72 74 4f 72          *pSortOr
11ca0 64 65 72 20 3d 20 70 4f 54 65 72 6d 2d 3e 73 6f  der = pOTerm->so
11cb0 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d  rtOrder;.      }
11cc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11cd0 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20  ->pRightmost==p 
11ce0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11cf0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
11d00 5b 32 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  [2]>=0 );.      
11d10 61 64 64 72 20 3d 20 70 2d 3e 61 64 64 72 4f 70  addr = p->addrOp
11d20 65 6e 45 70 68 6d 5b 32 5d 3b 0a 20 20 20 20 20  enEphm[2];.     
11d30 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11d40 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 70 2d  geP2(v, addr, p-
11d50 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
11d60 2b 32 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  +2);.      pKeyI
11d70 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4f  nfo->nField = nO
11d80 72 64 65 72 42 79 45 78 70 72 3b 0a 20 20 20 20  rderByExpr;.    
11d90 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
11da0 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28  ngeP3(v, addr, (
11db0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
11dc0 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
11dd0 46 46 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  FF);.      pKeyI
11de0 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 67  nfo = 0;.      g
11df0 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
11e00 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d  pParse, p, v, p-
11e10 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
11e20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20  eDest, iParm);. 
11e30 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
11e40 33 5f 66 72 65 65 28 70 4b 65 79 49 6e 66 6f 29  3_free(pKeyInfo)
11e50 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c  ;.  }..multi_sel
11e60 65 63 74 5f 65 6e 64 3a 0a 20 20 72 65 74 75 72  ect_end:.  retur
11e70 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
11e80 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
11e90 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
11ea0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11eb0 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 20 46 6f  _OMIT_VIEW./* Fo
11ec0 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f  rward Declaratio
11ed0 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ns */.static voi
11ee0 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
11ef0 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69  sqlite3*, ExprLi
11f00 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  st*, int, ExprLi
11f10 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
11f20 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71  d substSelect(sq
11f30 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a  lite3*, Select *
11f40 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20  , int, ExprList 
11f50 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  *);../*.** Scan 
11f60 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
11f70 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
11f80 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
11f90 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
11fa0 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
11fb0 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
11fc0 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
11fd0 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
11fe0 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
11ff0 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
12000 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
12010 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
12020 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
12030 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
12040 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
12050 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
12060 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
12070 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
12080 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
12090 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
120a0 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
120b0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
120c0 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
120d0 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
120e0 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
120f0 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
12100 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
12110 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
12120 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65  ne make the nece
12130 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
12140 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
12150 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
12160 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
12170 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
12180 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
12190 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
121a0 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
121b0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
121c0 69 64 20 73 75 62 73 74 45 78 70 72 28 0a 20 20  id substExpr(.  
121d0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
121e0 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
121f0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74  lloc errors to t
12200 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  his connection *
12210 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
12220 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20          /* Expr 
12230 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74  in which substit
12240 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a  ution occurs */.
12250 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
12260 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
12270 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
12280 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
12290 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62  pEList    /* Sub
122a0 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73 69  stitute expressi
122b0 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ons */.){.  if( 
122c0 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
122d0 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
122e0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
122f0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
12300 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66  iTable ){.    if
12310 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
12320 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  <0 ){.      pExp
12330 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b  r->op = TK_NULL;
12340 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12350 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
12360 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
12370 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  st!=0 && pExpr->
12380 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e  iColumn<pEList->
12390 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
123a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
123b0 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
123c0 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45  >pRight==0 && pE
123d0 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b  xpr->pList==0 );
123e0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 45  .      pNew = pE
123f0 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69  List->a[pExpr->i
12400 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20  Column].pExpr;. 
12410 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
12420 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  w!=0 );.      pE
12430 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e  xpr->op = pNew->
12440 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  op;.      assert
12450 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
12460 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
12470 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
12480 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65  3ExprDup(db, pNe
12490 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  w->pLeft);.     
124a0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
124b0 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
124c0 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
124d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
124e0 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 52 69 67  p(db, pNew->pRig
124f0 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ht);.      asser
12500 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d  t( pExpr->pList=
12510 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
12520 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  r->pList = sqlit
12530 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
12540 2c 20 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a  , pNew->pList);.
12550 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
12560 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62  ble = pNew->iTab
12570 6c 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  le;.      pExpr-
12580 3e 70 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54  >pTab = pNew->pT
12590 61 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  ab;.      pExpr-
125a0 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d  >iColumn = pNew-
125b0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
125c0 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e  pExpr->iAgg = pN
125d0 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20  ew->iAgg;.      
125e0 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
125f0 28 64 62 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b  (db, &pExpr->tok
12600 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e  en, &pNew->token
12610 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12620 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70  TokenCopy(db, &p
12630 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65  Expr->span, &pNe
12640 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20  w->span);.      
12650 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d  pExpr->pSelect =
12660 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
12670 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 53 65 6c  p(db, pNew->pSel
12680 65 63 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70  ect);.      pExp
12690 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d  r->flags = pNew-
126a0 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
126b0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74  }else{.    subst
126c0 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
126d0 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
126e0 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
126f0 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
12700 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c  >pRight, iTable,
12710 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75   pEList);.    su
12720 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45  bstSelect(db, pE
12730 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54  xpr->pSelect, iT
12740 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
12750 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
12760 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  (db, pExpr->pLis
12770 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
12780 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
12790 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
127a0 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist(.  sqlite3 *
127b0 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
127c0 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
127d0 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78  ors here */.  Ex
127e0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
127f0 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
12800 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
12810 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
12820 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  tes */.  int iTa
12830 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
12840 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
12850 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
12860 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
12870 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
12880 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
12890 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
128a0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
128b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
128c0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
128d0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64  .    substExpr(d
128e0 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  b, pList->a[i].p
128f0 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  Expr, iTable, pE
12900 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
12910 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
12920 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20  lect(.  sqlite3 
12930 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
12940 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
12950 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53  rors here */.  S
12960 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
12970 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
12980 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68  atement in which
12990 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
129a0 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  utions */.  int 
129b0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
129c0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
129d0 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78  replaced */.  Ex
129e0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
129f0 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
12a00 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
12a10 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
12a20 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
12a30 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
12a40 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
12a50 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
12a60 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
12a70 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
12a80 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
12a90 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  st(db, p->pOrder
12aa0 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
12ab0 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
12ac0 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
12ad0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
12ae0 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 64 62  ;.  substExpr(db
12af0 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61  , p->pWhere, iTa
12b00 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
12b10 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
12b20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c  p->pPrior, iTabl
12b30 65 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65  e, pEList);.}.#e
12b40 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
12b50 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
12b60 57 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  W) */..#ifndef S
12b70 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
12b80 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
12b90 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
12ba0 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
12bb0 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70  s in order to sp
12bc0 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  eed.** execution
12bd0 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20  .  It returns 1 
12be0 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
12bf0 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
12c00 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63  flattening.** oc
12c10 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75  curs..**.** To u
12c20 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f  nderstand the co
12c30 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e  ncept of flatten
12c40 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  ing, consider th
12c50 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71  e following.** q
12c60 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
12c70 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53  SELECT a FROM (S
12c80 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
12c90 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
12ca0 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a  00) WHERE a>5.**
12cb0 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
12cc0 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
12cd0 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69  ing this query i
12ce0 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
12cf0 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72  .** subquery fir
12d00 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  st and store the
12d10 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65   results in a te
12d20 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
12d30 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f  hen.** run the o
12d40 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68  uter query on th
12d50 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  at temporary tab
12d60 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72  le.  This requir
12d70 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73  es two.** passes
12d80 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20   over the data. 
12d90 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65   Furthermore, be
12da0 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72  cause the tempor
12db0 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73  ary table.** has
12dc0 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65   no indices, the
12dd0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e   WHERE clause on
12de0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
12df0 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70   cannot be.** op
12e00 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  timized..**.** T
12e10 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
12e20 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20  mpts to rewrite 
12e30 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
12e40 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a  the above into.*
12e50 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  * a single flat 
12e60 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69  select, like thi
12e70 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
12e80 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
12e90 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
12ea0 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54   AND a>5.**.** T
12eb0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
12ec0 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69  d for this simpi
12ed0 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74  fication gives t
12ee0 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a  he same result.*
12ef0 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74  * but only has t
12f00 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20  o scan the data 
12f10 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75  once.  And becau
12f20 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74  se indices might
12f30 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68   .** exist on th
12f40 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f  e table t1, a co
12f50 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74  mplete scan of t
12f60 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65  he data might be
12f70 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a  .** avoided..**.
12f80 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73  ** Flattening is
12f90 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
12fa0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
12fb0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
12fc0 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54  :.**.**   (1)  T
12fd0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
12fe0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
12ff0 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
13000 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
13010 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62  *   (2)  The sub
13020 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
13030 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65  aggregate or the
13040 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
13050 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
13060 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62  *   (3)  The sub
13070 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65  query is not the
13080 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
13090 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a  f a left outer j
130a0 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20  oin, or.**      
130b0 20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69    the subquery i
130c0 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a  s not itself a j
130d0 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33  oin.  (Ticket #3
130e0 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  06).**.**   (4) 
130f0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
13100 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72   not DISTINCT or
13110 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
13120 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
13130 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65  **.**   (5)  The
13140 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
13150 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65   DISTINCT or the
13160 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
13170 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
13180 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
13190 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65  **.**   (6)  The
131a0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
131b0 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
131c0 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
131d0 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
131e0 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a        DISTINCT..
131f0 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65  **.**   (7)  The
13200 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20   subquery has a 
13210 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
13220 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75  **   (8)  The su
13230 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
13240 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
13250 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
13260 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
13270 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62  *   (9)  The sub
13280 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
13290 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
132a0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
132b0 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
132c0 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
132d0 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20  *.**  (10)  The 
132e0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
132f0 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
13300 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
13310 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
13320 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54         use LIMIT
13330 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ..**.**  (11)  T
13340 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
13350 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
13360 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65  do not both have
13370 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
13380 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20  s..**.**  (12)  
13390 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
133a0 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 74 65  not the right te
133b0 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  rm of a LEFT OUT
133c0 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a  ER JOIN or the.*
133d0 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72  *        subquer
133e0 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
133f0 6c 61 75 73 65 2e 20 20 28 61 64 64 65 64 20 62  lause.  (added b
13400 79 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a  y ticket #350).*
13410 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20  *.**  (13)  The 
13420 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74  subquery and out
13430 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
13440 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 0a 2a  both use LIMIT.*
13450 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20  *.**  (14)  The 
13460 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
13470 74 20 75 73 65 20 4f 46 46 53 45 54 0a 2a 2a 0a  t use OFFSET.**.
13480 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75  **  (15)  The ou
13490 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
134a0 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
134b0 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68  und select or th
134c0 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71  e.**        subq
134d0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61  uery does not ha
134e0 76 65 20 62 6f 74 68 20 61 6e 20 4f 52 44 45 52  ve both an ORDER
134f0 20 42 59 20 61 6e 64 20 61 20 4c 49 4d 49 54 20   BY and a LIMIT 
13500 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20  clause..**      
13510 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32    (See ticket #2
13520 33 33 39 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  339).**.** In th
13530 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  is routine, the 
13540 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
13550 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
13560 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a  e outer query..*
13570 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
13580 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72  s p->pSrc->a[iFr
13590 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74  om].  isAgg is t
135a0 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  rue if the outer
135b0 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61   query.** uses a
135c0 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75  ggregates and su
135d0 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74  bqueryIsAgg is t
135e0 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
135f0 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
13600 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c  tes..**.** If fl
13610 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20  attening is not 
13620 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20  attempted, this 
13630 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
13640 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30  op and returns 0
13650 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  ..** If flatteni
13660 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  ng is attempted 
13670 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
13680 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c  urns 1..**.** Al
13690 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  l of the express
136a0 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73  ion analysis mus
136b0 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20  t occur on both 
136c0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
136d0 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75  and.** the subqu
136e0 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20  ery before this 
136f0 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f  routine runs..*/
13700 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74  .static int flat
13710 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 73  tenSubquery(.  s
13720 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
13730 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
13740 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
13750 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
13760 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
13770 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45  nt or outer SELE
13780 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
13790 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20    int iFrom,    
137a0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
137b0 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20  in p->pSrc->a[] 
137c0 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62  of the inner sub
137d0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
137e0 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20  sAgg,           
137f0 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72  /* True if outer
13800 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67   SELECT uses agg
13810 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
13820 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65   */.  int subque
13830 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72  ryIsAgg    /* Tr
13840 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
13850 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
13860 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
13870 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  {.  Select *pSub
13880 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
13890 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73  nner query or "s
138a0 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 72  ubquery" */.  Sr
138b0 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
138c0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
138d0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
138e0 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  r query */.  Src
138f0 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20  List *pSubSrc;  
13900 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
13910 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
13920 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ery */.  ExprLis
13930 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  t *pList;    /* 
13940 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  The result set o
13950 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
13960 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  y */.  int iPare
13970 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44  nt;        /* VD
13980 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
13990 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73   of the pSub res
139a0 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62  ult set temp tab
139b0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
139c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
139d0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
139e0 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a00 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
13a10 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
13a20 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
13a30 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54  pSubitem;   /* T
13a40 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 0a  he subquery */..
13a50 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
13a60 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  e if flattening 
13a70 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52  is permitted.  R
13a80 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a  eturn 0 if not..
13a90 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20    */.  if( p==0 
13aa0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
13ab0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
13ac0 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20  assert( pSrc && 
13ad0 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f  iFrom>=0 && iFro
13ae0 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a  m<pSrc->nSrc );.
13af0 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53    pSubitem = &pS
13b00 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20  rc->a[iFrom];.  
13b10 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d  pSub = pSubitem-
13b20 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65  >pSelect;.  asse
13b30 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20  rt( pSub!=0 );. 
13b40 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75   if( isAgg && su
13b50 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65  bqueryIsAgg ) re
13b60 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
13b70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
13b80 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20  iction (1)  */. 
13b90 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
13ba0 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63  gg && pSrc->nSrc
13bb0 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  >1 ) return 0;  
13bc0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
13bd0 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20  iction (2)  */. 
13be0 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d   pSubSrc = pSub-
13bf0 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
13c00 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a   pSubSrc );.  /*
13c10 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f   Prior to versio
13c20 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49  n 3.1.2, when LI
13c30 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68  MIT and OFFSET h
13c40 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20  ad to be simple 
13c50 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20  constants,.  ** 
13c60 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78  not arbitrary ex
13c70 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20 61  presssions, we a
13c80 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62  llowed some comb
13c90 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61  ining of LIMIT a
13ca0 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
13cb0 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c  ecause they coul
13cc0 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74  d be computed at
13cd0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20   compile-time.  
13ce0 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  But when LIMIT a
13cf0 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
13d00 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20  ecame arbitrary 
13d10 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20  expressions, we 
13d20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61  were forced to a
13d30 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  dd restrictions 
13d40 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31  (13).  ** and (1
13d50 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  4). */.  if( pSu
13d60 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
13d70 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
13d80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13d90 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
13da0 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  13) */.  if( pSu
13db0 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74  b->pOffset ) ret
13dc0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
13dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13de0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
13df0 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  14) */.  if( p->
13e00 70 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70 53  pRightmost && pS
13e10 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 53  ub->pLimit && pS
13e20 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
13e30 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
13e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
13e70 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a  riction (15) */.
13e80 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72    }.  if( pSubSr
13e90 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74  c->nSrc==0 ) ret
13ea0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13ec0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20  Restriction (7) 
13ed0 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 2d   */.  if( (pSub-
13ee0 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70  >isDistinct || p
13ef0 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20 0a 20 20  Sub->pLimit) .  
13f00 20 20 20 20 20 20 20 26 26 20 28 70 53 72 63 2d         && (pSrc-
13f10 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67  >nSrc>1 || isAgg
13f20 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a  ) ){          /*
13f30 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34   Restrictions (4
13f40 29 28 35 29 28 38 29 28 39 29 20 2a 2f 0a 20 20  )(5)(8)(9) */.  
13f50 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
13f60 20 20 20 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d     .  }.  if( p-
13f70 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 73  >isDistinct && s
13f80 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
13f90 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
13fa0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
13fb0 28 36 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  (6)  */.  if( (p
13fc0 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42  ->disallowOrderB
13fd0 79 20 7c 7c 20 70 2d 3e 70 4f 72 64 65 72 42 79  y || p->pOrderBy
13fe0 29 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  ) && pSub->pOrde
13ff0 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75  rBy ){.     retu
14000 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
14010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14030 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
14040 31 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  11) */.  }..  /*
14050 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20   Restriction 3: 
14060 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
14070 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65   is a join, make
14080 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
14090 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20  ry is .  ** not 
140a0 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68  used as the righ
140b0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20  t operand of an 
140c0 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61  outer join.  Exa
140d0 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
140e0 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c  s.  ** is not al
140f0 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
14100 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
14110 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20   OUTER JOIN (t2 
14120 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20  JOIN t3).  **.  
14130 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
14140 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
14150 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
14160 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
14170 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
14180 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a  2) JOIN t3.  **.
14190 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f    ** which is no
141a0 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d  t at all the sam
141b0 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  e thing..  */.  
141c0 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
141d0 63 3e 31 20 26 26 20 28 70 53 75 62 69 74 65 6d  c>1 && (pSubitem
141e0 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
141f0 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20  OUTER)!=0 ){.   
14200 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
14210 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
14220 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62   12:  If the sub
14230 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
14240 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
14250 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20  left outer.  ** 
14260 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
14270 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
14280 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
14290 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c  ..  ** An exampl
142a0 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69  es of why this i
142b0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
142c0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
142d0 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
142e0 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52  OIN (SELECT * FR
142f0 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78  OM t2 WHERE t2.x
14300 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  >0).  **.  ** If
14310 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
14320 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
14330 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
14340 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
14350 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48  UTER JOIN t2) WH
14360 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a  ERE t2.x>0.  **.
14370 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e    ** But the t2.
14380 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c  x>0 test will al
14390 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e  ways fail on a N
143a0 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77  ULL row of t2, w
143b0 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74  hich.  ** effect
143c0 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74  ively converts t
143d0 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e  he OUTER JOIN in
143e0 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e  to an INNER JOIN
143f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  ..  */.  if( (pS
14400 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
14410 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
14420 26 26 20 70 53 75 62 2d 3e 70 57 68 65 72 65 21  && pSub->pWhere!
14430 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
14440 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
14450 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
14460 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 66  oint, it means f
14470 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
14480 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a 20  mitted for the. 
14490 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74   ** iFrom-th ent
144a0 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
144b0 6c 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74  lause in the out
144c0 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a  er query..  */..
144d0 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66    /* Move all of
144e0 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e   the FROM elemen
144f0 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ts of the subque
14500 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ry into the.  **
14510 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
14520 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
14530 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69  ery.  Before doi
14540 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65  ng this, remembe
14550 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  r.  ** the curso
14560 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
14570 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20   original outer 
14580 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65  query FROM eleme
14590 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65  nt in.  ** iPare
145a0 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
145b0 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
145c0 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
145d0 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a  sequent code.  *
145e0 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72  * will scan expr
145f0 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20  essions looking 
14600 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65  for iParent refe
14610 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61  rences and repla
14620 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65  ce.  ** those re
14630 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78  ferences with ex
14640 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
14650 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75  esolve to the su
14660 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a  bquery FROM.  **
14670 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65   elements we are
14680 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e   now copying in.
14690 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20  .  */.  iParent 
146a0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
146b0 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74  sor;.  {.    int
146c0 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53   nSubSrc = pSubS
146d0 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e  rc->nSrc;.    in
146e0 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75  t jointype = pSu
146f0 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b  bitem->jointype;
14700 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ..    sqlite3Del
14710 65 74 65 54 61 62 6c 65 28 70 53 75 62 69 74 65  eteTable(pSubite
14720 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71  m->pTab);.    sq
14730 6c 69 74 65 33 5f 66 72 65 65 28 70 53 75 62 69  lite3_free(pSubi
14740 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
14750 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
14760 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  e(pSubitem->zNam
14770 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
14780 66 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a  free(pSubitem->z
14790 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 53 75 62  Alias);.    pSub
147a0 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
147b0 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44      pSubitem->zD
147c0 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 20  atabase = 0;.   
147d0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
147e0 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 69 74   = 0;.    pSubit
147f0 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a  em->zAlias = 0;.
14800 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
14810 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  1 ){.      int e
14820 78 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d  xtra = nSubSrc -
14830 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   1;.      for(i=
14840 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b  1; i<nSubSrc; i+
14850 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63  +){.        pSrc
14860 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
14870 74 41 70 70 65 6e 64 28 64 62 2c 20 70 53 72 63  tAppend(db, pSrc
14880 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
14890 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a   if( pSrc==0 ){.
148a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 53 72            p->pSr
148b0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  c = 0;.         
148c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
148d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
148e0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
148f0 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  c;.      for(i=p
14900 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65  Src->nSrc-1; i-e
14910 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d  xtra>=iFrom; i--
14920 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d  ){.        pSrc-
14930 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b  >a[i] = pSrc->a[
14940 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20  i-extra];.      
14950 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
14960 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
14970 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63  i++){.      pSrc
14980 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
14990 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
149a0 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
149b0 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
149c0 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
149d0 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
149e0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
149f0 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
14a00 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  pe;.  }..  /* No
14a10 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
14a20 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
14a30 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
14a40 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72  ions for .  ** r
14a50 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
14a60 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
14a70 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
14a80 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  * .  ** Example:
14a90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c  .  **.  **   SEL
14aa0 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52  ECT a+5, b*10 FR
14ab0 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41  OM (SELECT x*3 A
14ac0 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46  S a, y+10 AS b F
14ad0 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e  ROM t1) WHERE a>
14ae0 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20 20  b;.  **   \     
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b00 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73  \_____________ s
14b10 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  ubquery ________
14b20 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20  __/          /. 
14b30 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f   **    \________
14b40 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
14b50 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
14b60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
14b70 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20  ________/.  **. 
14b80 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
14b90 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
14ba0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
14bb0 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
14bc0 63 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20 22  ce we see.  ** "
14bd0 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
14be0 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
14bf0 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
14c00 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
14c10 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 70  "y+10"..  */.  p
14c20 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
14c30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
14c40 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
14c50 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
14c60 70 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  pr;.    if( pLis
14c70 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
14c80 20 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69   && (pExpr = pLi
14c90 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d  st->a[i].pExpr)-
14ca0 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20  >span.z!=0 ){.  
14cb0 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
14cc0 7a 4e 61 6d 65 20 3d 20 0a 20 20 20 20 20 20 20  zName = .       
14cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
14ce0 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
14cf0 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c  *)pExpr->span.z,
14d00 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b   pExpr->span.n);
14d10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 75 62  .    }.  }.  sub
14d20 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
14d30 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
14d40 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
14d50 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  ;.  if( isAgg ){
14d60 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
14d70 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  st(db, p->pGroup
14d80 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
14d90 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
14da0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
14db0 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
14dc0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
14dd0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  ;.  }.  if( pSub
14de0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
14df0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
14e00 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
14e10 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53  p->pOrderBy = pS
14e20 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
14e30 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
14e40 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
14e50 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
14e60 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
14e70 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  st(db, p->pOrder
14e80 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
14e90 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  b->pEList);.  }.
14ea0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
14eb0 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65  re ){.    pWhere
14ec0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
14ed0 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65  p(db, pSub->pWhe
14ee0 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  re);.  }else{.  
14ef0 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
14f00 7d 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  }.  if( subquery
14f10 49 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73  IsAgg ){.    ass
14f20 65 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d  ert( p->pHaving=
14f30 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  =0 );.    p->pHa
14f40 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65  ving = p->pWhere
14f50 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
14f60 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75  = pWhere;.    su
14f70 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
14f80 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
14f90 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
14fa0 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
14fb0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
14fc0 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  db, p->pHaving, 
14fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ff0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
15000 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e  db, pSub->pHavin
15010 67 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  g));.    assert(
15020 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
15030 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70  );.    p->pGroup
15040 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
15050 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62  ListDup(db, pSub
15060 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d  ->pGroupBy);.  }
15070 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45  else{.    substE
15080 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  xpr(db, p->pWher
15090 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  e, iParent, pSub
150a0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  ->pEList);.    p
150b0 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
150c0 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 2d  e3ExprAnd(db, p-
150d0 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29  >pWhere, pWhere)
150e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
150f0 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
15100 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65  is distinct if e
15110 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
15120 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65  or the.  ** oute
15130 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
15140 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e  nct. .  */.  p->
15150 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
15160 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53  isDistinct || pS
15170 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a  ub->isDistinct;.
15180 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45 43  .  /*.  ** SELEC
15190 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45  T ... FROM (SELE
151a0 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f  CT ... LIMIT a O
151b0 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78  FFSET b) LIMIT x
151c0 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 2a 2a 0a   OFFSET y;.  **.
151d0 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70    ** One is temp
151e0 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64  ted to try to ad
151f0 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d  d a and b to com
15200 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e  bine the limits.
15210 20 20 42 75 74 20 74 68 69 73 0a 20 20 2a 2a 20    But this.  ** 
15220 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66  does not work if
15230 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73   either limit is
15240 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 2a 2f 0a   negative..  */.
15250 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
15260 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 69  it ){.    p->pLi
15270 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d  mit = pSub->pLim
15280 69 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4c  it;.    pSub->pL
15290 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  imit = 0;.  }.. 
152a0 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
152b0 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
152c0 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
152d0 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
152e0 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
152f0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
15300 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20 72  elete(pSub);.  r
15310 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
15320 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
15330 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VIEW */../*.** 
15340 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45  Analyze the SELE
15350 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  CT statement pas
15360 73 65 64 20 69 6e 20 61 73 20 61 6e 20 61 72 67  sed in as an arg
15370 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20  ument to see if 
15380 69 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c  it.** is a simpl
15390 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
153a0 20 71 75 65 72 79 2e 20 20 49 66 20 69 74 20 69   query.  If it i
153b0 73 20 61 6e 64 20 74 68 69 73 20 71 75 65 72 79  s and this query
153c0 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73   can be.** satis
153d0 66 69 65 64 20 75 73 69 6e 67 20 61 20 73 69 6e  fied using a sin
153e0 67 6c 65 20 73 65 65 6b 20 74 6f 20 74 68 65 20  gle seek to the 
153f0 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64  beginning or end
15400 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a   of an index,.**
15410 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20 74   then generate t
15420 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73  he code for this
15430 20 53 45 4c 45 43 54 20 61 6e 64 20 72 65 74 75   SELECT and retu
15440 72 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20 69  rn 1.  If this i
15450 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70  s not a .** simp
15460 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  le min() or max(
15470 29 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72 65  ) query, then re
15480 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20  turn 0;.**.** A 
15490 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20  simply min() or 
154a0 6d 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b  max() query look
154b0 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
154c0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e  **    SELECT min
154d0 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a  (a) FROM table;.
154e0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78  **    SELECT max
154f0 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a  (a) FROM table;.
15500 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20  **.** The query 
15510 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61 20  may have only a 
15520 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
15530 69 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e  its FROM argumen
15540 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e  t.  There.** can
15550 20 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59 20   be no GROUP BY 
15560 6f 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48 45  or HAVING or WHE
15570 52 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65  RE clauses.  The
15580 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73 74   result set must
15590 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28 29  .** be the min()
155a0 20 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20 73   or max() of a s
155b0 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
155c0 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  the table.  The 
155d0 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65  column.** in the
155e0 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
155f0 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
15600 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20   indexed..**.** 
15610 54 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74  The parameters t
15620 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  o this routine a
15630 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 66  re the same as f
15640 6f 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  or sqlite3Select
15650 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68  ()..** See the h
15660 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
15670 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f   that routine fo
15680 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
15690 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
156a0 74 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69  tic int simpleMi
156b0 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20  nMaxQuery(Parse 
156c0 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
156d0 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  *p, int eDest, i
156e0 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 45 78 70  nt iParm){.  Exp
156f0 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74 20  r *pExpr;.  int 
15700 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iCol;.  Table *p
15710 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
15720 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a  dx;.  int base;.
15730 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
15740 20 73 65 65 6b 4f 70 3b 0a 20 20 45 78 70 72 4c   seekOp;.  ExprL
15750 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 2a 70 4c  ist *pEList, *pL
15760 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20 20 73 74  ist, eList;.  st
15770 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
15780 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20  em eListItem;.  
15790 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
157a0 20 69 6e 74 20 62 72 6b 3b 0a 20 20 69 6e 74 20   int brk;.  int 
157b0 69 44 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  iDb;..  /* Check
157c0 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
157d0 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c  query is a simpl
157e0 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
157f0 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a   query.  Return.
15800 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20    ** zero if it 
15810 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  is  not..  */.  
15820 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
15830 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c  || p->pHaving ||
15840 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
15850 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
15860 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70  p->pSrc;.  if( p
15870 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
15880 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73  eturn 0;.  pELis
15890 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
158a0 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
158b0 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
158c0 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69  ;.  pExpr = pELi
158d0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
158e0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
158f0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
15900 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
15910 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
15920 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  ist;.  if( pList
15930 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45  ==0 || pList->nE
15940 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
15950 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
15960 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74  token.n!=3 ) ret
15970 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  urn 0;.  if( sql
15980 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
15990 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
159a0 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29  .z,"min",3)==0 )
159b0 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f  {.    seekOp = O
159c0 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73  P_Rewind;.  }els
159d0 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
159e0 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78  NICmp((char*)pEx
159f0 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78  pr->token.z,"max
15a00 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ",3)==0 ){.    s
15a10 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b  eekOp = OP_Last;
15a20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
15a30 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45  turn 0;.  }.  pE
15a40 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30  xpr = pList->a[0
15a50 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
15a60 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
15a70 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
15a80 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e    iCol = pExpr->
15a90 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20  iColumn;.  pTab 
15aa0 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  = pSrc->a[0].pTa
15ab0 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6f 70  b;..  /* This op
15ac0 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f  timization canno
15ad0 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 76  t be used with v
15ae0 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 2a  irtual tables. *
15af0 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
15b00 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
15b10 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   0;..  /* If we 
15b20 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20  get to here, it 
15b30 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79 20  means the query 
15b40 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63  is of the correc
15b50 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65  t form..  ** Che
15b60 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
15b70 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78  we have an index
15b80 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70   and make pIdx p
15b90 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  oint to the.  **
15ba0 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
15bb0 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28  ex.  If the min(
15bc0 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
15bd0 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
15be0 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c  ARY.  ** key col
15bf0 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73  umn, no index is
15c00 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73 65   necessary so se
15c10 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20  t pIdx to NULL. 
15c20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62   If no.  ** usab
15c30 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e  le index is foun
15c40 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  d, return 0..  *
15c50 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29  /.  if( iCol<0 )
15c60 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a  {.    pIdx = 0;.
15c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f 6c    }else{.    Col
15c80 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
15c90 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
15ca0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
15cb0 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d  .    if( pColl==
15cc0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
15cd0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
15ce0 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
15cf0 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
15d00 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
15d10 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31  pIdx->nColumn>=1
15d20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
15d30 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
15d40 3d 69 43 6f 6c 20 26 26 20 0a 20 20 20 20 20 20  =iCol && .      
15d50 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74      0==sqlite3St
15d60 72 49 43 6d 70 28 70 49 64 78 2d 3e 61 7a 43 6f  rICmp(pIdx->azCo
15d70 6c 6c 5b 30 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  ll[0], pColl->zN
15d80 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
15d90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
15da0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64     }.    if( pId
15db0 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  x==0 ) return 0;
15dc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  .  }..  /* Ident
15dd0 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73  ify column types
15de0 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75   if we will be u
15df0 73 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63  sing the callbac
15e00 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74  k.  This.  ** st
15e10 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ep is skipped if
15e20 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67   the output is g
15e30 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20  oing to a table 
15e40 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  or a memory cell
15e50 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ..  ** The colum
15e60 6e 20 6e 61 6d 65 73 20 68 61 76 65 20 61 6c 72  n names have alr
15e70 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61  eady been genera
15e80 74 65 64 20 69 6e 20 74 68 65 20 63 61 6c 6c 69  ted in the calli
15e90 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  ng function..  *
15ea0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
15eb0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
15ec0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
15ed0 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  urn 0;..  /* If 
15ee0 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65  the output is de
15ef0 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d  stined for a tem
15f00 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70  porary table, op
15f10 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20  en that table.. 
15f20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
15f30 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
15f40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15f50 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
15f60 45 70 68 65 6d 65 72 61 6c 2c 20 69 50 61 72 6d  Ephemeral, iParm
15f70 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 1);.  }..  /* 
15f80 47 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20  Generating code 
15f90 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 20  to find the min 
15fa0 6f 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61 73  or the max.  Bas
15fb0 69 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61  ically all we ha
15fc0 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73  ve.  ** to do is
15fd0 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20   find the first 
15fe0 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  or the last entr
15ff0 79 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e 20  y in the chosen 
16000 69 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20  index.  If.  ** 
16010 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
16020 28 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e 54  () is on the INT
16030 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
16040 2c 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65 20  , then find the 
16050 66 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61  first.  ** or la
16060 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
16070 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  main table..  */
16080 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
16090 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
160a0 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
160b0 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65  pSchema);.  asse
160c0 72 74 28 20 69 44 62 3e 3d 30 20 7c 7c 20 70 54  rt( iDb>=0 || pT
160d0 61 62 2d 3e 69 73 45 70 68 65 6d 20 29 3b 0a 20  ab->isEphem );. 
160e0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
160f0 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
16100 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
16110 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
16120 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
16130 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
16140 65 29 3b 0a 20 20 62 61 73 65 20 3d 20 70 53 72  e);.  base = pSr
16150 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b  c->a[0].iCursor;
16160 0a 20 20 62 72 6b 20 3d 20 73 71 6c 69 74 65 33  .  brk = sqlite3
16170 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
16180 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
16190 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
161a0 2c 20 70 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28  , p, brk);.  if(
161b0 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c   pSrc->a[0].pSel
161c0 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
161d0 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
161e0 50 61 72 73 65 2c 20 62 61 73 65 2c 20 69 44 62  Parse, base, iDb
161f0 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
16200 65 61 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ead);.  }.  if( 
16210 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pIdx==0 ){.    s
16220 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
16230 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c  v, seekOp, base,
16240 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
16250 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
16260 20 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64   the cursor used
16270 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 69 6e 64   to open the ind
16280 65 78 20 68 65 72 65 20 69 73 20 63 6c 6f 73 65  ex here is close
16290 64 0a 20 20 20 20 2a 2a 20 61 73 20 73 6f 6f 6e  d.    ** as soon
162a0 20 61 73 20 61 20 73 69 6e 67 6c 65 20 76 61 6c   as a single val
162b0 75 65 20 68 61 73 20 62 65 65 6e 20 72 65 61 64  ue has been read
162c0 20 66 72 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63 61   from it, alloca
162d0 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 75 73 69  te it.    ** usi
162e0 6e 67 20 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  ng (pParse->nTab
162f0 2b 2b 29 20 74 6f 20 70 72 65 76 65 6e 74 20 74  ++) to prevent t
16300 68 65 20 63 75 72 73 6f 72 20 69 64 20 66 72 6f  he cursor id fro
16310 6d 20 62 65 69 6e 67 20 0a 20 20 20 20 2a 2a 20  m being .    ** 
16320 72 65 75 73 65 64 2e 20 54 68 69 73 20 69 73 20  reused. This is 
16330 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20 73 74  important for st
16340 61 74 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  atements of the 
16350 66 6f 72 6d 20 0a 20 20 20 20 2a 2a 20 22 49 4e  form .    ** "IN
16360 53 45 52 54 20 49 4e 54 4f 20 78 20 53 45 4c 45  SERT INTO x SELE
16370 43 54 20 6d 61 78 28 29 20 46 52 4f 4d 20 78 22  CT max() FROM x"
16380 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
16390 20 69 49 64 78 3b 0a 20 20 20 20 4b 65 79 49 6e   iIdx;.    KeyIn
163a0 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  fo *pKey = sqlit
163b0 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
163c0 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
163d0 20 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d    iIdx = pParse-
163e0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 61 73 73  >nTab++;.    ass
163f0 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65  ert( pIdx->pSche
16400 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
16410 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
16420 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
16430 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29  Integer, iDb, 0)
16440 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16450 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  eOp3(v, OP_OpenR
16460 65 61 64 2c 20 69 49 64 78 2c 20 70 49 64 78 2d  ead, iIdx, pIdx-
16470 3e 74 6e 75 6d 2c 20 0a 20 20 20 20 20 20 20 20  >tnum, .        
16480 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 33 5f  (char*)pKey, P3_
16490 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
164a0 3b 0a 20 20 20 20 69 66 28 20 73 65 65 6b 4f 70  ;.    if( seekOp
164b0 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 7b 0a 20  ==OP_Rewind ){. 
164c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
164d0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
164e0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
164f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
16500 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
16510 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
16520 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d 6f 76 65 47  eekOp = OP_MoveG
16530 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
16540 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
16550 72 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  r[0]==SQLITE_SO_
16560 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a  DESC ){.      /*
16570 20 54 69 63 6b 65 74 20 23 32 35 31 34 3a 20 69   Ticket #2514: i
16580 6e 76 65 72 74 20 74 68 65 20 73 65 65 6b 20 6f  nvert the seek o
16590 70 65 72 61 74 6f 72 20 69 66 20 77 65 20 61 72  perator if we ar
165a0 65 20 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a  e using.      **
165b0 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
165c0 64 65 78 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  dex. */.      if
165d0 28 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 4c 61 73  ( seekOp==OP_Las
165e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65  t ){.        see
165f0 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b  kOp = OP_Rewind;
16600 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16610 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
16620 65 6b 4f 70 3d 3d 4f 50 5f 4d 6f 76 65 47 74 20  ekOp==OP_MoveGt 
16630 29 3b 0a 20 20 20 20 20 20 20 20 73 65 65 6b 4f  );.        seekO
16640 70 20 3d 20 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20  p = OP_MoveLt;. 
16650 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16660 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16670 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64  p(v, seekOp, iId
16680 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  x, 0);.    sqlit
16690 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
166a0 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
166b0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
166c0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
166d0 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29  _Close, iIdx, 0)
166e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
166f0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
16700 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  eGe, base, 0);. 
16710 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72   }.  eList.nExpr
16720 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 1;.  memset(&
16730 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69  eListItem, 0, si
16740 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29  zeof(eListItem))
16750 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65  ;.  eList.a = &e
16760 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73  ListItem;.  eLis
16770 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70  t.a[0].pExpr = p
16780 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e  Expr;.  selectIn
16790 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
167a0 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c  p, &eList, 0, 0,
167b0 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69   0, -1, eDest, i
167c0 50 61 72 6d 2c 20 62 72 6b 2c 20 62 72 6b 2c 20  Parm, brk, brk, 
167d0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
167e0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
167f0 20 62 72 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33   brk);.  sqlite3
16800 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
16810 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b  Close, base, 0);
16820 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  .  .  return 1;.
16830 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
16840 75 74 69 6e 65 20 72 65 73 6f 6c 76 65 73 20 61  utine resolves a
16850 6e 79 20 6e 61 6d 65 73 20 75 73 65 64 20 69 6e  ny names used in
16860 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
16870 6f 66 20 74 68 65 0a 2a 2a 20 73 75 70 70 6c 69  of the.** suppli
16880 65 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ed SELECT statem
16890 65 6e 74 2e 20 49 66 20 74 68 65 20 53 45 4c 45  ent. If the SELE
168a0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
168b0 6e 67 20 72 65 73 6f 6c 76 65 64 0a 2a 2a 20 69  ng resolved.** i
168c0 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2c 20  s a sub-select, 
168d0 74 68 65 6e 20 70 4f 75 74 65 72 4e 43 20 69 73  then pOuterNC is
168e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
168f0 65 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 0a 2a  e NameContext .*
16900 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  * of the parent 
16910 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69 6e 74 20 73  SELECT..*/.int s
16920 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f  qlite3SelectReso
16930 6c 76 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  lve(.  Parse *pP
16940 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
16950 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
16960 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
16970 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
16980 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
16990 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
169a0 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  ded. */.  NameCo
169b0 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20  ntext *pOuterNC 
169c0 20 2f 2a 20 54 68 65 20 6f 75 74 65 72 20 6e 61   /* The outer na
169d0 6d 65 20 63 6f 6e 74 65 78 74 2e 20 4d 61 79 20  me context. May 
169e0 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20  be NULL. */.){. 
169f0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
16a00 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  t;          /* R
16a10 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20  esult set. */.  
16a20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
16a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
16a40 72 2d 6c 6f 6f 70 20 76 61 72 69 61 62 6c 65 20  r-loop variable 
16a50 75 73 65 64 20 69 6e 20 6d 75 6c 74 69 70 6c 65  used in multiple
16a60 20 70 6c 61 63 65 73 20 2a 2f 0a 20 20 4e 61 6d   places */.  Nam
16a70 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
16a80 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
16a90 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 2a 2f   name-context */
16aa0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
16ab0 6f 75 70 42 79 3b 20 20 20 20 20 20 20 20 2f 2a  oupBy;        /*
16ac0 20 54 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c   The group by cl
16ad0 61 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  ause */..  /* If
16ae0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   this routine ha
16af0 73 20 72 75 6e 20 62 65 66 6f 72 65 2c 20 72 65  s run before, re
16b00 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
16b10 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73  . */.  if( p->is
16b20 52 65 73 6f 6c 76 65 64 20 29 7b 0a 20 20 20 20  Resolved ){.    
16b30 61 73 73 65 72 74 28 20 21 70 4f 75 74 65 72 4e  assert( !pOuterN
16b40 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C );.    return 
16b50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
16b60 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 3d   p->isResolved =
16b70 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   1;..  /* If the
16b80 72 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  re have already 
16b90 62 65 65 6e 20 65 72 72 6f 72 73 2c 20 64 6f 20  been errors, do 
16ba0 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69 66  nothing. */.  if
16bb0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  ( pParse->nErr>0
16bc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
16bd0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
16be0 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74  ..  /* Prepare t
16bf0 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
16c00 65 6e 74 2e 20 54 68 69 73 20 63 61 6c 6c 20 77  ent. This call w
16c10 69 6c 6c 20 61 6c 6c 6f 63 61 74 65 20 61 6c 6c  ill allocate all
16c20 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 72 65   cursors.  ** re
16c30 71 75 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65  quired to handle
16c40 20 74 68 65 20 74 61 62 6c 65 73 20 61 6e 64 20   the tables and 
16c50 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 74 68  subqueries in th
16c60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20  e FROM clause.. 
16c70 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 70 53 65   */.  if( prepSe
16c80 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c  lectStmt(pParse,
16c90 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   p) ){.    retur
16ca0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
16cb0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76    }..  /* Resolv
16cc0 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
16cd0 73 20 69 6e 20 74 68 65 20 4c 49 4d 49 54 20 61  s in the LIMIT a
16ce0 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  nd OFFSET clause
16cf0 73 2e 20 54 68 65 73 65 0a 20 20 2a 2a 20 61 72  s. These.  ** ar
16d00 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  e not allowed to
16d10 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 61   refer to any na
16d20 6d 65 73 2c 20 73 6f 20 70 61 73 73 20 61 6e 20  mes, so pass an 
16d30 65 6d 70 74 79 20 4e 61 6d 65 43 6f 6e 74 65 78  empty NameContex
16d40 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  t..  */.  memset
16d50 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
16d60 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 50  (sNC));.  sNC.pP
16d70 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
16d80 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
16d90 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
16da0 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c  C, p->pLimit) ||
16db0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
16dc0 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
16dd0 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29  sNC, p->pOffset)
16de0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
16df0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
16e00 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68  ..  /* Set up th
16e10 65 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e  e local name-con
16e20 74 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20  text to pass to 
16e30 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
16e40 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65 73 6f 6c  () to.  ** resol
16e50 76 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ve the expressio
16e60 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 73  n-list..  */.  s
16e70 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b  NC.allowAgg = 1;
16e80 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
16e90 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 73 4e 43  = p->pSrc;.  sNC
16ea0 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74 65 72 4e  .pNext = pOuterN
16eb0 43 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  C;..  /* Resolve
16ec0 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65   names in the re
16ed0 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 70  sult set. */.  p
16ee0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
16ef0 74 3b 0a 20 20 69 66 28 20 21 70 45 4c 69 73 74  t;.  if( !pEList
16f00 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
16f10 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 69 3d  _ERROR;.  for(i=
16f20 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
16f30 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
16f40 70 72 20 2a 70 58 20 3d 20 70 45 4c 69 73 74 2d  pr *pX = pEList-
16f50 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
16f60 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
16f70 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
16f80 43 2c 20 70 58 29 20 29 7b 0a 20 20 20 20 20 20  C, pX) ){.      
16f90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
16fa0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ROR;.    }.  }..
16fb0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
16fc0 65 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66  e no aggregate f
16fd0 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20  unctions in the 
16fe0 72 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64 20  result-set, and 
16ff0 6e 6f 20 47 52 4f 55 50 20 42 59 20 0a 20 20 2a  no GROUP BY .  *
17000 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f  * expression, do
17010 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72 65   not allow aggre
17020 67 61 74 65 73 20 69 6e 20 61 6e 79 20 6f 66 20  gates in any of 
17030 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
17040 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73  sions..  */.  as
17050 73 65 72 74 28 20 21 70 2d 3e 69 73 41 67 67 20  sert( !p->isAgg 
17060 29 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20  );.  pGroupBy = 
17070 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 69  p->pGroupBy;.  i
17080 66 28 20 70 47 72 6f 75 70 42 79 20 7c 7c 20 73  f( pGroupBy || s
17090 4e 43 2e 68 61 73 41 67 67 20 29 7b 0a 20 20 20  NC.hasAgg ){.   
170a0 20 70 2d 3e 69 73 41 67 67 20 3d 20 31 3b 0a 20   p->isAgg = 1;. 
170b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 4e 43 2e   }else{.    sNC.
170c0 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20  allowAgg = 0;.  
170d0 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 48 41 56  }..  /* If a HAV
170e0 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70 72  ING clause is pr
170f0 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 72  esent, then ther
17100 65 20 6d 75 73 74 20 62 65 20 61 20 47 52 4f 55  e must be a GROU
17110 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a  P BY clause..  *
17120 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69  /.  if( p->pHavi
17130 6e 67 20 26 26 20 21 70 47 72 6f 75 70 42 79 20  ng && !pGroupBy 
17140 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
17150 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
17160 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
17170 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
17180 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20  fore HAVING");. 
17190 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
171a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
171b0 2a 20 41 64 64 20 74 68 65 20 65 78 70 72 65 73  * Add the expres
171c0 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 74 68 65  sion list to the
171d0 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62 65   name-context be
171e0 66 6f 72 65 20 70 61 72 73 69 6e 67 20 74 68 65  fore parsing the
171f0 0a 20 20 2a 2a 20 6f 74 68 65 72 20 65 78 70 72  .  ** other expr
17200 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 53  essions in the S
17210 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
17220 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74   This is so that
17230 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
17240 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
17250 6c 61 75 73 65 20 28 65 74 63 2e 29 20 63 61 6e  lause (etc.) can
17260 20 72 65 66 65 72 20 74 6f 20 65 78 70 72 65 73   refer to expres
17270 73 69 6f 6e 73 20 62 79 0a 20 20 2a 2a 20 61 6c  sions by.  ** al
17280 69 61 73 65 73 20 69 6e 20 74 68 65 20 72 65 73  iases in the res
17290 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20  ult set..  **.  
172a0 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20  ** Minor point: 
172b0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
172c0 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ase, then the ex
172d0 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65  pression will be
172e0 0a 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74  .  ** re-evaluat
172f0 65 64 20 66 6f 72 20 65 61 63 68 20 72 65 66 65  ed for each refe
17300 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20 2a  rence to it..  *
17310 2f 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d  /.  sNC.pEList =
17320 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
17330 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
17340 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20  olveNames(&sNC, 
17350 70 2d 3e 70 57 68 65 72 65 29 20 7c 7c 0a 20 20  p->pWhere) ||.  
17360 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 52 65     sqlite3ExprRe
17370 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
17380 20 70 2d 3e 70 48 61 76 69 6e 67 29 20 29 7b 0a   p->pHaving) ){.
17390 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
173a0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
173b0 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  f( p->pPrior==0 
173c0 29 7b 0a 20 20 20 20 69 66 28 20 70 72 6f 63 65  ){.    if( proce
173d0 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  ssOrderGroupBy(p
173e0 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
173f0 64 65 72 42 79 2c 20 31 2c 20 26 73 4e 43 2e 68  derBy, 1, &sNC.h
17400 61 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20  asAgg) ){.      
17410 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
17420 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ROR;.    }.  }. 
17430 20 69 66 28 20 70 72 6f 63 65 73 73 4f 72 64 65   if( processOrde
17440 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
17450 20 70 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c   p, pGroupBy, 0,
17460 20 26 73 4e 43 2e 68 61 73 41 67 67 29 20 29 7b   &sNC.hasAgg) ){
17470 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17480 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
17490 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
174a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
174b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
174c0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
174d0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
174e0 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
174f0 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  e does not conta
17500 69 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  in aggregate fun
17510 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
17520 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
17530 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
17540 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
17550 20 20 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20    .    for(i=0, 
17560 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e  pItem=pGroupBy->
17570 61 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  a; i<pGroupBy->n
17580 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
17590 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 45  ++){.      if( E
175a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
175b0 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Item->pExpr, EP_
175c0 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Agg) ){.        
175d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
175e0 70 50 61 72 73 65 2c 20 22 61 67 67 72 65 67 61  pParse, "aggrega
175f0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  te functions are
17600 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20   not allowed in 
17610 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 74  ".            "t
17620 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
17630 73 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  se");.        re
17640 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
17650 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
17660 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
17670 69 73 20 69 73 20 6f 6e 65 20 53 45 4c 45 43 54  is is one SELECT
17680 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2c 20   of a compound, 
17690 62 65 20 73 75 72 65 20 74 6f 20 72 65 73 6f 6c  be sure to resol
176a0 76 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 69 6e  ve names.  ** in
176b0 20 74 68 65 20 6f 74 68 65 72 20 53 45 4c 45 43   the other SELEC
176c0 54 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  Ts..  */.  if( p
176d0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
176e0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 65  return sqlite3Se
176f0 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72  lectResolve(pPar
17700 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 70  se, p->pPrior, p
17710 4f 75 74 65 72 4e 43 29 3b 0a 20 20 7d 65 6c 73  OuterNC);.  }els
17720 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
17730 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
17740 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
17750 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
17760 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lator..**.** The
17770 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
17780 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20  ulator is a set 
17790 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  of memory cells 
177a0 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74  that hold.** int
177b0 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
177c0 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74  s while calculat
177d0 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65  ing an aggregate
177e0 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
177f0 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73  ne simply stores
17800 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66   NULLs in all of
17810 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65   those memory ce
17820 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lls..*/.static v
17830 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c  oid resetAccumul
17840 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
17850 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
17860 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
17870 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
17880 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
17890 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
178a0 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20  c *pFunc;.  if( 
178b0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b  pAggInfo->nFunc+
178c0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
178d0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  n==0 ){.    retu
178e0 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  rn;.  }.  for(i=
178f0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
17900 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
17910 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17920 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c  Op(v, OP_MemNull
17930 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  , pAggInfo->aCol
17940 5b 69 5d 2e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20  [i].iMem, 0);.  
17950 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41  }.  for(pFunc=pA
17960 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69  ggInfo->aFunc, i
17970 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
17980 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e  nFunc; i++, pFun
17990 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  c++){.    sqlite
179a0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
179b0 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 46 75 6e 63 2d  _MemNull, pFunc-
179c0 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 69  >iMem, 0);.    i
179d0 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  f( pFunc->iDisti
179e0 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
179f0 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63  Expr *pE = pFunc
17a00 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->pExpr;.      i
17a10 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d 30 20  f( pE->pList==0 
17a20 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45  || pE->pList->nE
17a30 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
17a40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
17a50 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  g(pParse, "DISTI
17a60 4e 43 54 20 69 6e 20 61 67 67 72 65 67 61 74 65  NCT in aggregate
17a70 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65   must be followe
17a80 64 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  d ".           "
17a90 62 79 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  by an expression
17aa0 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
17ab0 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
17ac0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
17ad0 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
17ae0 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49  *pKeyInfo = keyI
17af0 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
17b00 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73  pParse, pE->pLis
17b10 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
17b20 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
17b30 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
17b40 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
17b50 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
17b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b70 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
17b80 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
17b90 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OFF);.      }.  
17ba0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
17bb0 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
17bc0 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
17bd0 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
17be0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
17bf0 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
17c00 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
17c10 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
17c20 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
17c30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
17c40 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
17c50 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
17c60 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
17c70 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
17c80 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
17c90 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
17ca0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
17cb0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
17cc0 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
17cd0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
17ce0 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
17cf0 3e 70 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69  >pList;.    sqli
17d00 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
17d10 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69  _AggFinal, pF->i
17d20 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69  Mem, pList ? pLi
17d30 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 0a 20  st->nExpr : 0,. 
17d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d50 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
17d60 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45  pFunc, P3_FUNCDE
17d70 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  F);.  }.}../*.**
17d80 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75   Update the accu
17d90 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63  mulator memory c
17da0 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72  ells for an aggr
17db0 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a  egate based on.*
17dc0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  * the current cu
17dd0 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
17de0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70  /.static void up
17df0 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
17e00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
17e10 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
17e20 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
17e30 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
17e40 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
17e50 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
17e60 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
17e70 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70  fo_col *pC;..  p
17e80 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
17e90 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  ode = 1;.  for(i
17ea0 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
17eb0 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
17ec0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
17ed0 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  pF++){.    int n
17ee0 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Arg;.    int add
17ef0 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 45  rNext = 0;.    E
17f00 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
17f10 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73   pF->pExpr->pLis
17f20 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  t;.    if( pList
17f30 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d   ){.      nArg =
17f40 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
17f50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17f60 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
17f70 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  rse, pList);.   
17f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41   }else{.      nA
17f90 72 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  rg = 0;.    }.  
17fa0 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
17fb0 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
17fc0 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
17fd0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
17fe0 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
17ff0 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20  ( nArg==1 );.   
18000 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
18010 76 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  v, pF->iDistinct
18020 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 29 3b 0a  , addrNext, 1);.
18030 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
18040 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c  ->pFunc->needCol
18050 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 43 6f  lSeq ){.      Co
18060 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
18070 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
18080 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
18090 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  tem;.      int j
180a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
180b0 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20  pList!=0 );  /* 
180c0 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e  pList!=0 if pF->
180d0 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53  pFunc->needCollS
180e0 65 71 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20  eq is true */.  
180f0 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
18100 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43  em=pList->a; !pC
18110 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a  oll && j<nArg; j
18120 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
18130 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
18140 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
18150 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
18160 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
18170 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
18180 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
18190 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
181a0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
181b0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
181c0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  VdbeOp3(v, OP_Co
181d0 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68  llSeq, 0, 0, (ch
181e0 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43  ar *)pColl, P3_C
181f0 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20  OLLSEQ);.    }. 
18200 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
18210 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c  3(v, OP_AggStep,
18220 20 70 46 2d 3e 69 4d 65 6d 2c 20 6e 41 72 67 2c   pF->iMem, nArg,
18230 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
18240 63 2c 20 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P3_FUNCDEF);.
18250 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
18260 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18270 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
18280 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
18290 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
182a0 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f  i=0, pC=pAggInfo
182b0 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e  ->aCol; i<pAggIn
182c0 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
182d0 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20  ; i++, pC++){.  
182e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
182f0 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45  e(pParse, pC->pE
18300 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
18310 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
18320 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 43 2d 3e 69  _MemStore, pC->i
18330 4d 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 70  Mem, 1);.  }.  p
18340 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
18350 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 6e  ode = 0;.}..#ifn
18360 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18370 54 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a 20 54 68  TRIGGER./*.** Th
18380 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
18390 73 65 64 20 77 68 65 6e 20 61 20 53 45 4c 45 43  sed when a SELEC
183a0 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75  T statement is u
183b0 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a  sed to create a.
183c0 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
183d0 6c 65 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67  le for iterating
183e0 20 74 68 72 6f 75 67 68 20 77 68 65 6e 20 72 75   through when ru
183f0 6e 6e 69 6e 67 20 61 6e 20 49 4e 53 54 45 41 44  nning an INSTEAD
18400 20 4f 46 0a 2a 2a 20 55 50 44 41 54 45 20 6f 72   OF.** UPDATE or
18410 20 49 4e 53 54 45 41 44 20 4f 46 20 44 45 4c 45   INSTEAD OF DELE
18420 54 45 20 74 72 69 67 67 65 72 2e 20 0a 2a 2a 0a  TE trigger. .**.
18430 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  ** If possible, 
18440 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
18450 6d 65 6e 74 20 69 73 20 6d 6f 64 69 66 69 65 64  ment is modified
18460 20 73 6f 20 74 68 61 74 20 4e 55 4c 4c 20 76 61   so that NULL va
18470 6c 75 65 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  lues.** are stor
18480 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ed in the tempor
18490 61 72 79 20 74 61 62 6c 65 20 66 6f 72 20 61 6c  ary table for al
184a0 6c 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68  l columns for wh
184b0 69 63 68 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72  ich the .** corr
184c0 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
184d0 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69   argument mask i
184e0 73 20 6e 6f 74 20 73 65 74 2e 20 49 66 20 6d 61  s not set. If ma
184f0 73 6b 20 74 61 6b 65 73 20 74 68 65 0a 2a 2a 20  sk takes the.** 
18500 73 70 65 63 69 61 6c 20 76 61 6c 75 65 20 30 78  special value 0x
18510 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 61  ffffffff, then a
18520 6c 6c 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70  ll columns are p
18530 6f 70 75 6c 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  opulated..*/.int
18540 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4d 61   sqlite3SelectMa
18550 73 6b 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  sk(Parse *pParse
18560 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 75 33 32  , Select *p, u32
18570 20 6d 61 73 6b 29 7b 0a 20 20 69 66 28 20 21 70   mask){.  if( !p
18580 2d 3e 70 50 72 69 6f 72 20 26 26 20 21 70 2d 3e  ->pPrior && !p->
18590 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 6d 61  isDistinct && ma
185a0 73 6b 21 3d 30 78 66 66 66 66 66 66 66 66 20 29  sk!=0xffffffff )
185b0 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
185c0 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  pEList;.    int 
185d0 69 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  i;.    if( sqlit
185e0 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
185f0 70 50 61 72 73 65 2c 20 70 2c 20 30 29 20 29 7b  pParse, p, 0) ){
18600 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18610 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
18620 7d 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70  }.    pEList = p
18630 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f  ->pEList;.    fo
18640 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
18650 3e 6e 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20  >nExpr && i<32; 
18660 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
18670 21 28 6d 61 73 6b 26 28 28 75 33 32 29 31 3c 3c  !(mask&((u32)1<<
18680 69 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  i)) ){.        s
18690 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
186a0 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  (pEList->a[i].pE
186b0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45  xpr);.        pE
186c0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
186d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 70   = sqlite3Expr(p
186e0 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 4e 55  Parse->db, TK_NU
186f0 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  LL, 0, 0, 0);.  
18700 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18710 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18720 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
18730 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
18740 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
18750 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
18760 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
18770 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75  lts are distribu
18780 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77  ted in various w
18790 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ays depending on
187a0 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
187b0 20 65 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d   eDest and iParm
187c0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73  ..**.**     eDes
187d0 74 20 56 61 6c 75 65 20 20 20 20 20 20 20 52 65  t Value       Re
187e0 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d  sult.**     ----
187f0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
18800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18820 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53  -------.**     S
18830 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49  RT_Callback    I
18840 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61  nvoke the callba
18850 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  ck for each row 
18860 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  of the result..*
18870 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d  *.**     SRT_Mem
18880 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66           Store f
18890 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d  irst result in m
188a0 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d  emory cell iParm
188b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53  .**.**     SRT_S
188c0 65 74 20 20 20 20 20 20 20 20 20 53 74 6f 72 65  et         Store
188d0 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73   results as keys
188e0 20 6f 66 20 74 61 62 6c 65 20 69 50 61 72 6d 2e   of table iParm.
188f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55  .**.**     SRT_U
18900 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65  nion       Store
18910 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65   results as a ke
18920 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  y in a temporary
18930 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a   table iParm.**.
18940 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70  **     SRT_Excep
18950 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65  t      Remove re
18960 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74  sults from the t
18970 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
18980 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
18990 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20  SRT_Table       
189a0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e  Store results in
189b0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
189c0 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65   iParm.**.** The
189d0 20 74 61 62 6c 65 20 61 62 6f 76 65 20 69 73 20   table above is 
189e0 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64  incomplete.  Add
189f0 69 74 69 6f 6e 61 6c 20 65 44 69 73 74 20 76 61  itional eDist va
18a00 6c 75 65 20 68 61 76 65 20 62 65 20 61 64 64 65  lue have be adde
18a10 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69 73 20  d.** since this 
18a20 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72 69 74  comment was writ
18a30 74 65 6e 2e 20 20 53 65 65 20 74 68 65 20 73 65  ten.  See the se
18a40 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20  lectInnerLoop() 
18a50 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  function for.** 
18a60 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69  a complete listi
18a70 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65  ng of the allowe
18a80 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73  d values of eDes
18a90 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e  t and their mean
18aa0 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ings..**.** This
18ab0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
18ac0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
18ad0 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65  rrors.  If any e
18ae0 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63  rrors are.** enc
18af0 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61  ountered, then a
18b00 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
18b10 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c  ror message is l
18b20 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  eft in.** pParse
18b30 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
18b40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
18b50 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20  es NOT free the 
18b60 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
18b70 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65   passed in.  The
18b80 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  .** calling func
18b90 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f  tion needs to do
18ba0 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   that..**.** The
18bb0 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74   pParent, parent
18bc0 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e  Tab, and *pParen
18bd0 74 41 67 67 20 66 69 65 6c 64 73 20 61 72 65 20  tAgg fields are 
18be0 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69  filled in if thi
18bf0 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61  s.** SELECT is a
18c00 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73   subquery.  This
18c10 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79   routine may try
18c20 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73   to combine this
18c30 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20   SELECT.** with 
18c40 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f  its parent to fo
18c50 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  rm a single flat
18c60 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64   query.  In so d
18c70 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a  oing, it might.*
18c80 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 72  * change the par
18c90 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61  ent query from a
18ca0 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74   non-aggregate t
18cb0 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  o an aggregate q
18cc0 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61  uery..** For tha
18cd0 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50  t reason, the pP
18ce0 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73  arentAgg flag is
18cf0 20 70 61 73 73 65 64 20 61 73 20 61 20 70 6f 69   passed as a poi
18d00 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63  nter, so it.** c
18d10 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  an be changed..*
18d20 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
18d30 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
18d40 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 61 72   the pParent par
18d50 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  ameter..**.**   
18d60 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
18d70 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78  1 JOIN (SELECT x
18d80 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  , count(*) FROM 
18d90 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20  t2) JOIN t3;.** 
18da0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
18db0 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
18dc0 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
18dd0 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a  ___/        /.**
18de0 20 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20       \          
18df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a              /.**
18e20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
18e30 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
18e40 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
18e50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a  ___________/.**.
18e60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18e70 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  is called for th
18e80 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 66 69  e outer query fi
18e90 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20  rst.   For that 
18ea0 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74  call,.** pParent
18eb0 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20   will be NULL.  
18ec0 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65  During the proce
18ed0 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74  ssing of the out
18ee0 65 72 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a  er query, this .
18ef0 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
18f00 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
18f10 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73   to handle the s
18f20 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68  ubquery.  For th
18f30 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63  e recursive.** c
18f40 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c  all, pParent wil
18f50 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f  l point to the o
18f60 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 63  uter query.  Bec
18f70 61 75 73 65 20 74 68 65 20 73 75 62 71 75 65 72  ause the subquer
18f80 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f  y is.** the seco
18f90 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20  nd element in a 
18fa0 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20  three-way join, 
18fb0 74 68 65 20 70 61 72 65 6e 74 54 61 62 20 70 61  the parentTab pa
18fc0 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20  rameter will.** 
18fd0 62 65 20 31 20 28 74 68 65 20 32 6e 64 20 76 61  be 1 (the 2nd va
18fe0 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78  lue of a 0-index
18ff0 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e  ed array.).*/.in
19000 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  t sqlite3Select(
19010 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
19020 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
19030 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
19040 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
19050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19060 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
19070 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
19080 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c   */.  int eDest,
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
190a0 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
190b0 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  f the results */
190c0 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20  .  int iParm,   
190d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70            /* A p
190e0 61 72 61 6d 65 74 65 72 20 75 73 65 64 20 62 79  arameter used by
190f0 20 74 68 65 20 65 44 65 73 74 20 64 69 73 70 6f   the eDest dispo
19100 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  sal method */.  
19110 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c  Select *pParent,
19120 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
19130 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69  r SELECT for whi
19140 63 68 20 74 68 69 73 20 69 73 20 61 20 73 75 62  ch this is a sub
19150 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  -query */.  int 
19160 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20  parentTab,      
19170 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
19180 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20  Parent->pSrc of 
19190 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20  this query */.  
191a0 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67 2c  int *pParentAgg,
191b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
191c0 66 20 70 50 61 72 65 6e 74 20 75 73 65 73 20 61  f pParent uses a
191d0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
191e0 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66  ns */.  char *af
191f0 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f              /
19200 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52  * If eDest is SR
19210 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66  T_Union, the aff
19220 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  inity string */.
19230 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
19240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
19250 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
19260 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
19270 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75  nfo;     /* Retu
19280 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57  rn from sqlite3W
19290 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20  hereBegin() */. 
192a0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
192b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
192c0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75  irtual machine u
192d0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
192e0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  n */.  int isAgg
192f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
19300 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
19310 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
19320 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
19330 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
19340 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
19350 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
19360 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
19370 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
19380 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
19390 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
193a0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
193b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
193c0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
193d0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
193e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
193f0 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  erBy;    /* The 
19400 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
19410 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
19420 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
19430 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  oupBy;    /* The
19440 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
19450 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
19460 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
19470 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g;         /* Th
19480 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
19490 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
194a0 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  .  int isDistinc
194b0 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
194c0 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
194d0 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
194e0 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69  sent */.  int di
194f0 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
19500 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65   /* Table to use
19510 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
19520 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72  t set */.  int r
19530 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
19540 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
19550 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
19560 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  unction */.  int
19570 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20   addrSortIndex; 
19580 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19590 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65  f an OP_OpenEphe
195a0 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
195b0 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73  n */.  AggInfo s
195c0 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a  AggInfo;      /*
195d0 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   Information use
195e0 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71  d by aggregate q
195f0 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ueries */.  int 
19600 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  iEnd;           
19610 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
19620 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
19630 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
19640 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
19650 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
19660 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
19670 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
19680 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  db;.  if( p==0 |
19690 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
196a0 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
196b0 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rr ){.    return
196c0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   1;.  }.  if( sq
196d0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
196e0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
196f0 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29  LECT, 0, 0, 0) )
19700 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d   return 1;.  mem
19710 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30  set(&sAggInfo, 0
19720 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66  , sizeof(sAggInf
19730 6f 29 29 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79  o));..  pOrderBy
19740 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
19750 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f    if( IgnorableO
19760 72 64 65 72 62 79 28 65 44 65 73 74 29 20 29 7b  rderby(eDest) ){
19770 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
19780 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
19790 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
197a0 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2c 20  olve(pParse, p, 
197b0 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  0) ){.    goto s
197c0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
197d0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
197e0 4f 72 64 65 72 42 79 3b 0a 0a 23 69 66 6e 64 65  OrderBy;..#ifnde
197f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
19800 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
19810 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
19820 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  re a sequence of
19830 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65   queries, do the
19840 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69   earlier ones fi
19850 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rst..  */.  if( 
19860 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
19870 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f   if( p->pRightmo
19880 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  st==0 ){.      S
19890 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70  elect *pLoop, *p
198a0 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20  Right = 0;.     
198b0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
198c0 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
198d0 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
198e0 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74  oop->pPrior, cnt
198f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  ++){.        pLo
19900 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d  op->pRightmost =
19910 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   p;.        pLoo
19920 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69 67 68  p->pNext = pRigh
19930 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69 67 68  t;.        pRigh
19940 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 20  t = pLoop;.     
19950 20 7d 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c   }.      if( SQL
19960 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
19970 5f 53 45 4c 45 43 54 3e 30 20 26 26 20 63 6e 74  _SELECT>0 && cnt
19980 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50  >SQLITE_MAX_COMP
19990 4f 55 4e 44 5f 53 45 4c 45 43 54 20 29 7b 0a 20  OUND_SELECT ){. 
199a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
199b0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
199c0 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69  too many terms i
199d0 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  n compound SELEC
199e0 54 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  T");.        ret
199f0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
19a00 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
19a10 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72  multiSelect(pPar
19a20 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50  se, p, eDest, iP
19a30 61 72 6d 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 23  arm, aff);.  }.#
19a40 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
19a50 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66   local copies of
19a60 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   the parameters 
19a70 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a  for this query..
19a80 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20    */.  pTabList 
19a90 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68  = p->pSrc;.  pWh
19aa0 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
19ab0 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
19ac0 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
19ad0 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
19ae0 67 3b 0a 20 20 69 73 41 67 67 20 3d 20 70 2d 3e  g;.  isAgg = p->
19af0 69 73 41 67 67 3b 0a 20 20 69 73 44 69 73 74 69  isAgg;.  isDisti
19b00 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
19b10 6e 63 74 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  nct;.  pEList = 
19b20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
19b30 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74   pEList==0 ) got
19b40 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
19b50 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74   /* .  ** Do not
19b60 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f   even attempt to
19b70 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f   generate any co
19b80 64 65 20 69 66 20 77 65 20 68 61 76 65 20 61 6c  de if we have al
19b90 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20  ready seen.  ** 
19ba0 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68  errors before th
19bb0 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74  is routine start
19bc0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  s..  */.  if( pP
19bd0 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67  arse->nErr>0 ) g
19be0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
19bf0 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
19c00 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
19c10 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
19c20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
19c30 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
19c40 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66  output..  */.#if
19c50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19c60 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
19c70 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c  checkForMultiCol
19c80 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70  umnSelectError(p
19c90 50 61 72 73 65 2c 20 65 44 65 73 74 2c 20 70 45  Parse, eDest, pE
19ca0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
19cb0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
19cc0 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  end;.  }.#endif.
19cd0 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69  .  /* ORDER BY i
19ce0 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f  s ignored for so
19cf0 6d 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e  me destinations.
19d00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 67 6e 6f  .  */.  if( Igno
19d10 72 61 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65  rableOrderby(eDe
19d20 73 74 29 20 29 7b 0a 20 20 20 20 70 4f 72 64 65  st) ){.    pOrde
19d30 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rBy = 0;.  }..  
19d40 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
19d50 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing code..  */. 
19d60 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
19d70 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
19d80 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73  f( v==0 ) goto s
19d90 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
19da0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
19db0 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69  or all sub-queri
19dc0 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
19dd0 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21  lause.  */.#if !
19de0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
19df0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
19e00 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
19e10 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f  _OMIT_VIEW).  fo
19e20 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
19e30 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
19e40 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
19e50 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
19e60 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65   = 0;.    int ne
19e70 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
19e80 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
19e90 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
19ea0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
19eb0 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 74  i];..    if( pIt
19ec0 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 7c  em->pSelect==0 |
19ed0 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c  | pItem->isPopul
19ee0 61 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ated ) continue;
19ef0 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
19f00 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  zName!=0 ){.    
19f10 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74    zSavedAuthCont
19f20 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
19f30 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
19f40 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
19f50 6f 6e 74 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e  ontext = pItem->
19f60 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65  zName;.      nee
19f70 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20  dRestoreContext 
19f80 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
19f90 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72        needRestor
19fa0 65 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20  eContext = 0;.  
19fb0 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
19fc0 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20  SQLITE_TEST) || 
19fd0 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
19fe0 44 45 50 54 48 3e 30 0a 20 20 20 20 2f 2a 20 49  DEPTH>0.    /* I
19ff0 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e  ncrement Parse.n
1a000 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65  Height by the he
1a010 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67  ight of the larg
1a020 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  est expression. 
1a030 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72     ** tree refer
1a040 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74  ed to by this, t
1a050 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74  he parent select
1a060 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65  . The child sele
1a070 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f  ct.    ** may co
1a080 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  ntain expression
1a090 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73   trees of at mos
1a0a0 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45  t.    ** (SQLITE
1a0b0 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d  _MAX_EXPR_DEPTH-
1a0c0 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68  Parse.nHeight) h
1a0d0 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61  eight. This is a
1a0e0 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65   bit.    ** more
1a0f0 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68   conservative th
1a100 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75  an necessary, bu
1a110 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68  t much easier th
1a120 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20  an enforcing.   
1a130 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d   ** an exact lim
1a140 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  it..    */.    p
1a150 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b  Parse->nHeight +
1a160 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
1a170 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 23 65  xprHeight(p);.#e
1a180 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
1a190 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
1a1a0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 53  Item->pSelect, S
1a1b0 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 0a 20 20  RT_EphemTab, .  
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1a1d0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70  Item->iCursor, p
1a1e0 2c 20 69 2c 20 26 69 73 41 67 67 2c 20 30 29 3b  , i, &isAgg, 0);
1a1f0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
1a200 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1a210 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
1a220 6e 64 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64 65  nd;.    }.#if de
1a230 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1a240 54 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  T) || SQLITE_MAX
1a250 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20  _EXPR_DEPTH>0.  
1a260 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
1a270 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t -= sqlite3Sele
1a280 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
1a290 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1a2a0 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
1a2b0 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  xt ){.      pPar
1a2c0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
1a2d0 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
1a2e0 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  text;.    }.    
1a2f0 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
1a300 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  rc;.    pWhere =
1a310 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
1a320 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72  if( !IgnorableOr
1a330 64 65 72 62 79 28 65 44 65 73 74 29 20 29 7b 0a  derby(eDest) ){.
1a340 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
1a350 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
1a360 20 20 7d 0a 20 20 20 20 70 47 72 6f 75 70 42 79    }.    pGroupBy
1a370 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
1a380 20 20 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d      pHaving = p-
1a390 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 69 73  >pHaving;.    is
1a3a0 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
1a3b0 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 23 65  Distinct;.  }.#e
1a3c0 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ndif..  /* Check
1a3d0 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c   for the special
1a3e0 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e 28 29   case of a min()
1a3f0 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
1a400 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20 20 2a  on by itself.  *
1a410 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
1a420 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
1a430 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72  simpleMinMaxQuer
1a440 79 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65  y(pParse, p, eDe
1a450 73 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a 20 20  st, iParm) ){.  
1a460 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f    rc = 0;.    go
1a470 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
1a480 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
1a490 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 69 73  o see if this is
1a4a0 20 61 20 73 75 62 71 75 65 72 79 20 74 68 61 74   a subquery that
1a4b0 20 63 61 6e 20 62 65 20 22 66 6c 61 74 74 65 6e   can be "flatten
1a4c0 65 64 22 20 69 6e 74 6f 20 69 74 73 20 70 61 72  ed" into its par
1a4d0 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61  ent..  ** If fla
1a4e0 74 74 65 6e 69 6e 67 20 69 73 20 61 20 70 6f 73  ttening is a pos
1a4f0 73 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61  siblity, do so a
1a500 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  nd return immedi
1a510 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 23 69  ately.  .  */.#i
1a520 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a530 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 50 61  T_VIEW.  if( pPa
1a540 72 65 6e 74 20 26 26 20 70 50 61 72 65 6e 74 41  rent && pParentA
1a550 67 67 20 26 26 0a 20 20 20 20 20 20 66 6c 61 74  gg &&.      flat
1a560 74 65 6e 53 75 62 71 75 65 72 79 28 64 62 2c 20  tenSubquery(db, 
1a570 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54  pParent, parentT
1a580 61 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67 2c  ab, *pParentAgg,
1a590 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 69   isAgg) ){.    i
1a5a0 66 28 20 69 73 41 67 67 20 29 20 2a 70 50 61 72  f( isAgg ) *pPar
1a5b0 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  entAgg = 1;.    
1a5c0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1a5d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1a5e0 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72  * If possible, r
1a5f0 65 77 72 69 74 65 20 74 68 65 20 71 75 65 72 79  ewrite the query
1a600 20 74 6f 20 75 73 65 20 47 52 4f 55 50 20 42 59   to use GROUP BY
1a610 20 69 6e 73 74 65 61 64 20 6f 66 20 44 49 53 54   instead of DIST
1a620 49 4e 43 54 2e 0a 20 20 2a 2a 20 47 52 4f 55 50  INCT..  ** GROUP
1a630 20 42 59 20 6d 61 79 20 75 73 65 20 61 6e 20 69   BY may use an i
1a640 6e 64 65 78 2c 20 44 49 53 54 49 4e 43 54 20 6e  ndex, DISTINCT n
1a650 65 76 65 72 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a  ever does..  */.
1a660 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73 74 69    if( p->isDisti
1a670 6e 63 74 20 26 26 20 21 70 2d 3e 69 73 41 67 67  nct && !p->isAgg
1a680 20 26 26 20 21 70 2d 3e 70 47 72 6f 75 70 42 79   && !p->pGroupBy
1a690 20 29 7b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75   ){.    p->pGrou
1a6a0 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
1a6b0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
1a6c0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 47 72  pEList);.    pGr
1a6d0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
1a6e0 70 42 79 3b 0a 20 20 20 20 70 2d 3e 69 73 44 69  pBy;.    p->isDi
1a6f0 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
1a700 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  isDistinct = 0;.
1a710 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1a720 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
1a730 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
1a740 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a  his sorting.  **
1a750 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64   index might end
1a760 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64   up being unused
1a770 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
1a780 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63   be .  ** extrac
1a790 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65  ted in pre-sorte
1a7a0 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61  d order.  If tha
1a7b0 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
1a7c0 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f  hen the.  ** OP_
1a7d0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
1a7e0 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
1a7f0 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  e changed to an 
1a800 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a  OP_Noop once.  *
1a810 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20  * we figure out 
1a820 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67  that the sorting
1a830 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65   index is not ne
1a840 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53  eded.  The addrS
1a850 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61  ortIndex.  ** va
1a860 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
1a870 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61  o facilitate tha
1a880 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20  t change..  */. 
1a890 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
1a8a0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
1a8b0 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20  eyInfo;.    if( 
1a8c0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
1a8d0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
1a8e0 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
1a8f0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
1a900 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
1a910 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
1a920 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d  );.    pOrderBy-
1a930 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  >iECursor = pPar
1a940 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
1a950 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
1a960 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64  2] = addrSortInd
1a970 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74  ex =.      sqlit
1a980 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
1a990 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
1a9a0 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
1a9b0 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  r, pOrderBy->nEx
1a9c0 70 72 2b 32 2c 20 20 20 20 20 20 20 20 20 20 20  pr+2,           
1a9d0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
1a9e0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )pKeyInfo, P3_KE
1a9f0 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
1aa00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
1aa10 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b  rSortIndex = -1;
1aa20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
1aa30 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74  e output is dest
1aa40 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f  ined for a tempo
1aa50 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e  rary table, open
1aa60 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a   that table..  *
1aa70 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
1aa80 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
1aa90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1aaa0 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  dOp(v, OP_OpenEp
1aab0 68 65 6d 65 72 61 6c 2c 20 69 50 61 72 6d 2c 20  hemeral, iParm, 
1aac0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
1aad0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
1aae0 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a  e limiter..  */.
1aaf0 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33    iEnd = sqlite3
1ab00 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1ab10 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
1ab20 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
1ab30 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f  , p, iEnd);..  /
1ab40 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c  * Open a virtual
1ab50 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
1ab60 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
1ab70 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  et..  */.  if( i
1ab80 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
1ab90 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1aba0 66 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  fo;.    assert( 
1abb0 69 73 41 67 67 20 7c 7c 20 70 47 72 6f 75 70 42  isAgg || pGroupB
1abc0 79 20 29 3b 0a 20 20 20 20 64 69 73 74 69 6e 63  y );.    distinc
1abd0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
1abe0 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  ++;.    pKeyInfo
1abf0 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
1ac00 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1ac10 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  ->pEList);.    s
1ac20 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
1ac30 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1ac40 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20  l, distinct, 0, 
1ac50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ac60 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
1ac70 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  pKeyInfo, P3_KEY
1ac80 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
1ac90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74   }else{.    dist
1aca0 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  inct = -1;.  }..
1acb0 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61    /* Aggregate a
1acc0 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  nd non-aggregate
1acd0 20 71 75 65 72 69 65 73 20 61 72 65 20 68 61 6e   queries are han
1ace0 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
1acf0 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67   */.  if( !isAgg
1ad00 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20   && pGroupBy==0 
1ad10 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
1ad20 61 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61  ase is for non-a
1ad30 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
1ad40 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68  .    ** Begin th
1ad50 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a  e database scan.
1ad60 20 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66      */.    pWInf
1ad70 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
1ad80 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
1ad90 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
1ada0 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  &pOrderBy);.    
1adb0 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
1adc0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1add0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74  ..    /* If sort
1ade0 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
1adf0 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
1ae00 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68  prior OP_OpenEph
1ae10 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69  emeral .    ** i
1ae20 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64  nstruction ended
1ae30 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65   up not being ne
1ae40 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67  eded, then chang
1ae50 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
1ae60 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  emeral.    ** in
1ae70 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20  to an OP_Noop.. 
1ae80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64     */.    if( ad
1ae90 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26  drSortIndex>=0 &
1aea0 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  & pOrderBy==0 ){
1aeb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1aec0 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
1aed0 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c  , addrSortIndex,
1aee0 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64   1);.      p->ad
1aef0 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
1af00 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  -1;.    }..    /
1af10 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
1af20 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20  rd inner loop.  
1af30 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1af40 21 69 73 44 69 73 74 69 6e 63 74 29 3b 0a 20 20  !isDistinct);.  
1af50 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65    if( selectInne
1af60 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
1af70 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70   pEList, 0, 0, p
1af80 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65  OrderBy, -1, eDe
1af90 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
1afa0 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70          iParm, p
1afb0 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
1afc0 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
1afd0 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20  , aff) ){.      
1afe0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1aff0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1b000 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
1b010 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
1b020 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  */.    sqlite3Wh
1b030 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
1b040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1b050 54 68 69 73 20 69 73 20 74 68 65 20 70 72 6f 63  This is the proc
1b060 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
1b070 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
1b080 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
1b090 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
1b0a0 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
1b0b0 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
1b0c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
1b0d0 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
1b0e0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1b0f0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
1b100 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
1b110 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
1b120 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
1b130 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
1b140 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
1b150 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
1b160 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
1b170 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
1b180 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
1b190 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
1b1a0 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
1b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1c0 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
1b1d0 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
1b1e0 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
1b1f0 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
1b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b210 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
1b220 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
1b230 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
1b240 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
1b250 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
1b260 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
1b270 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
1b280 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
1b290 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
1b2a0 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
1b2b0 72 64 65 72 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  rder */...    /*
1b2c0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
1b2d0 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 61 64  ariables hold ad
1b2e0 64 72 65 73 73 65 73 20 6f 72 20 6c 61 62 65 6c  dresses or label
1b2f0 73 20 66 6f 72 20 70 61 72 74 73 20 6f 66 20 74  s for parts of t
1b300 68 65 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  he.    ** virtua
1b310 6c 20 6d 61 63 68 69 6e 65 20 70 72 6f 67 72 61  l machine progra
1b320 6d 20 77 65 20 61 72 65 20 70 75 74 74 69 6e 67  m we are putting
1b330 20 74 6f 67 65 74 68 65 72 20 2a 2f 0a 20 20 20   together */.   
1b340 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52   int addrOutputR
1b350 6f 77 3b 20 20 20 20 20 20 2f 2a 20 53 74 61 72  ow;      /* Star
1b360 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20  t of subroutine 
1b370 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72  that outputs a r
1b380 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20  esult row */.   
1b390 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72   int addrSetAbor
1b3a0 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  t;       /* Set 
1b3b0 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
1b3c0 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
1b3d0 20 69 6e 74 20 61 64 64 72 49 6e 69 74 69 61 6c   int addrInitial
1b3e0 69 7a 65 4c 6f 6f 70 3b 20 2f 2a 20 53 74 61 72  izeLoop; /* Star
1b3f0 74 20 6f 66 20 63 6f 64 65 20 74 68 61 74 20 69  t of code that i
1b400 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 69  nitializes the i
1b410 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
1b420 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f   int addrTopOfLo
1b430 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70 20  op;      /* Top 
1b440 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  of the input loo
1b450 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  p */.    int add
1b460 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 3b 20  rGroupByChange; 
1b470 20 2f 2a 20 43 6f 64 65 20 74 68 61 74 20 72 75   /* Code that ru
1b480 6e 73 20 77 68 65 6e 20 61 6e 79 20 47 52 4f 55  ns when any GROU
1b490 50 20 42 59 20 74 65 72 6d 20 63 68 61 6e 67 65  P BY term change
1b4a0 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  s */.    int add
1b4b0 72 50 72 6f 63 65 73 73 52 6f 77 3b 20 20 20 20  rProcessRow;    
1b4c0 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70 72 6f 63   /* Code to proc
1b4d0 65 73 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 70  ess a single inp
1b4e0 75 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e  ut row */.    in
1b4f0 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
1b500 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
1b510 61 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  all processing *
1b520 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f  /.    int addrSo
1b530 72 74 69 6e 67 49 64 78 3b 20 20 20 20 20 2f 2a  rtingIdx;     /*
1b540 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
1b550 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f  meral for the so
1b560 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  rting index */. 
1b570 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74     int addrReset
1b580 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75  ;          /* Su
1b590 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
1b5a0 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
1b5b0 75 6c 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 61  ulator */..    a
1b5c0 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  ddrEnd = sqlite3
1b5d0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1b5e0 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ;..    /* Conver
1b5f0 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  t TK_COLUMN node
1b600 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  s into TK_AGG_CO
1b610 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e  LUMN and make en
1b620 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  tries in.    ** 
1b630 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c  sAggInfo for all
1b640 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
1b650 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73   nodes in expres
1b660 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20  sions of the.   
1b670 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
1b680 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ment..    */.   
1b690 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
1b6a0 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
1b6b0 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
1b6c0 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
1b6d0 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
1b6e0 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67  ist;.    sNC.pAg
1b6f0 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66  gInfo = &sAggInf
1b700 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  o;.    sAggInfo.
1b710 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d  nSortingColumn =
1b720 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f   pGroupBy ? pGro
1b730 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20  upBy->nExpr+1 : 
1b740 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  0;.    sAggInfo.
1b750 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
1b760 70 42 79 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pBy;.    if( sql
1b770 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1b780 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
1b790 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ist) ){.      go
1b7a0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
1b7b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
1b7c0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1b7d0 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72  ggList(&sNC, pOr
1b7e0 64 65 72 42 79 29 20 29 7b 0a 20 20 20 20 20 20  derBy) ){.      
1b7f0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1b800 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1b810 48 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65  Having && sqlite
1b820 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
1b830 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61  egates(&sNC, pHa
1b840 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
1b850 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
1b860 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
1b870 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  fo.nAccumulator 
1b880 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  = sAggInfo.nColu
1b890 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  mn;.    for(i=0;
1b8a0 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e   i<sAggInfo.nFun
1b8b0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; i++){.      i
1b8c0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  f( sqlite3ExprAn
1b8d0 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
1b8e0 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  C, sAggInfo.aFun
1b8f0 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73  c[i].pExpr->pLis
1b900 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  t) ){.        go
1b910 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
1b920 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b930 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1b940 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
1b950 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a  ect_end;..    /*
1b960 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   Processing for 
1b970 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20  aggregates with 
1b980 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79  GROUP BY is very
1b990 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20   different and. 
1b9a0 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20     ** much more 
1b9b0 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67  complex than agg
1b9c0 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20  regates without 
1b9d0 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20  a GROUP BY..    
1b9e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
1b9f0 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79  pBy ){.      Key
1ba00 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
1ba10 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72   /* Keying infor
1ba20 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67  mation for the g
1ba30 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
1ba40 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  /..      /* Crea
1ba50 74 65 20 6c 61 62 65 6c 73 20 74 68 61 74 20 77  te labels that w
1ba60 65 20 77 69 6c 6c 20 62 65 20 6e 65 65 64 69 6e  e will be needin
1ba70 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
1ba80 0a 20 20 20 20 20 20 61 64 64 72 49 6e 69 74 69  .      addrIniti
1ba90 61 6c 69 7a 65 4c 6f 6f 70 20 3d 20 73 71 6c 69  alizeLoop = sqli
1baa0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1bab0 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72 47  (v);.      addrG
1bac0 72 6f 75 70 42 79 43 68 61 6e 67 65 20 3d 20 73  roupByChange = s
1bad0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1bae0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 64  bel(v);.      ad
1baf0 64 72 50 72 6f 63 65 73 73 52 6f 77 20 3d 20 73  drProcessRow = s
1bb00 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1bb10 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f  bel(v);..      /
1bb20 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
1bb30 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
1bb40 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20  we might need a 
1bb50 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f  sorting index to
1bb60 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d  .      ** implem
1bb70 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74  ent it.  Allocat
1bb80 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69  e that sorting i
1bb90 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74  ndex now.  If it
1bba0 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20   turns out.     
1bbb0 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
1bbc0 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72  ot need it after
1bbd0 20 61 6c 6c 2c 20 74 68 65 20 4f 70 65 6e 45 70   all, the OpenEp
1bbe0 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
1bbf0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  ion.      ** wil
1bc00 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
1bc10 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20  nto a Noop.  .  
1bc20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67      */.      sAg
1bc30 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
1bc40 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1bc50 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  +;.      pKeyInf
1bc60 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
1bc70 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1bc80 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20  pGroupBy);.     
1bc90 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20   addrSortingIdx 
1bca0 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  =.          sqli
1bcb0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
1bcc0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
1bcd0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
1bce0 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Idx,.           
1bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 41                sA
1bd00 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
1bd10 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20  olumn,.         
1bd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd30 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
1bd40 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
1bd50 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  OFF);..      /* 
1bd60 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
1bd70 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64  y locations used
1bd80 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67   by GROUP BY agg
1bd90 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e  regate processin
1bda0 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
1bdb0 20 69 55 73 65 46 6c 61 67 20 3d 20 70 50 61 72   iUseFlag = pPar
1bdc0 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
1bdd0 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 70    iAbortFlag = p
1bde0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
1bdf0 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61       iAMem = pPa
1be00 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1be10 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
1be20 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
1be30 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20  ;.      iBMem = 
1be40 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1be50 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1be60 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
1be70 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
1be80 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1be90 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69 41 62  P_MemInt, 0, iAb
1bea0 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
1beb0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1bec0 22 23 20 63 6c 65 61 72 20 61 62 6f 72 74 20 66  "# clear abort f
1bed0 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
1bee0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1bef0 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20  , OP_MemInt, 0, 
1bf00 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
1bf10 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1bf20 20 22 23 20 69 6e 64 69 63 61 74 65 20 61 63 63   "# indicate acc
1bf30 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29  umulator empty")
1bf40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1bf50 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1bf60 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 49 6e 69  Goto, 0, addrIni
1bf70 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 0a 20  tializeLoop);.. 
1bf80 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
1bf90 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
1bfa0 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e  at outputs a sin
1bfb0 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
1bfc0 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
1bfd0 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75  et.  This subrou
1bfe0 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73  tine first looks
1bff0 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67   at the iUseFlag
1c000 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20  .  If iUseFlag. 
1c010 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20       ** is less 
1c020 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1c030 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f   zero, the subro
1c040 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1c050 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74  .  If.      ** t
1c060 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61  he processing ca
1c070 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72  lls for the quer
1c080 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73  y to abort, this
1c090 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
1c0a0 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20    ** increments 
1c0b0 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d  the iAbortFlag m
1c0c0 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62  emory location b
1c0d0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
1c0e0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
1c0f0 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20  r to signal the 
1c100 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e  caller to abort.
1c110 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1c120 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73  addrSetAbort = s
1c130 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1c140 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
1c150 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c160 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31  (v, OP_MemInt, 1
1c170 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
1c180 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1c190 28 28 76 2c 20 22 23 20 73 65 74 20 61 62 6f 72  ((v, "# set abor
1c1a0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
1c1b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c1c0 70 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  p(v, OP_Return, 
1c1d0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64  0, 0);.      add
1c1e0 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
1c1f0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1c200 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
1c210 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1c220 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69  , OP_IfMemPos, i
1c230 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74  UseFlag, addrOut
1c240 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20  putRow+2);.     
1c250 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1c260 20 22 23 20 47 72 6f 75 70 62 79 20 72 65 73 75   "# Groupby resu
1c270 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74  lt generator ent
1c280 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20  ry point"));.   
1c290 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c2a0 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  dOp(v, OP_Return
1c2b0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  , 0, 0);.      f
1c2c0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
1c2d0 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
1c2e0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  gInfo);.      if
1c2f0 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
1c300 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1c310 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1c320 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74  pHaving, addrOut
1c330 70 75 74 52 6f 77 2b 31 2c 20 31 29 3b 0a 20 20  putRow+1, 1);.  
1c340 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1c350 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
1c360 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
1c370 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
1c380 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
1c390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3a0 20 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73    distinct, eDes
1c3b0 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20  t, iParm, .     
1c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3d0 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
1c3e0 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62  Row+1, addrSetAb
1c3f0 6f 72 74 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  ort, aff);.     
1c400 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1c410 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
1c420 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
1c430 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c440 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  Op(v, OP_Return,
1c450 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 56 64   0, 0);.      Vd
1c460 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
1c470 20 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73   end groupby res
1c480 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29  ult generator"))
1c490 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
1c4a0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1c4b0 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65  e that will rese
1c4c0 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61  t the group-by a
1c4d0 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20  ccumulator.     
1c4e0 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 52 65   */.      addrRe
1c4f0 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  set = sqlite3Vdb
1c500 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1c510 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75  .      resetAccu
1c520 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
1c530 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
1c540 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c550 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  Op(v, OP_Return,
1c560 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f   0, 0);..      /
1c570 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74  * Begin a loop t
1c580 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
1c590 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73   all source rows
1c5a0 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
1c5b0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  er..      ** Thi
1c5c0 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20  s might involve 
1c5d0 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f  two separate loo
1c5e0 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f  ps with an OP_So
1c5f0 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f  rt in between, o
1c600 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69  r.      ** it mi
1c610 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ght be a single 
1c620 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61  loop that uses a
1c630 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61  n index to extra
1c640 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  ct information. 
1c650 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72       ** in the r
1c660 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65  ight order to be
1c670 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20  gin with..      
1c680 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1c690 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1c6a0 28 76 2c 20 61 64 64 72 49 6e 69 74 69 61 6c 69  (v, addrInitiali
1c6b0 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73  zeLoop);.      s
1c6c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1c6d0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
1c6e0 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
1c6f0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
1c700 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
1c710 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
1c720 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70 42 79  Where, &pGroupBy
1c730 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
1c740 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
1c750 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
1c760 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20  if( pGroupBy==0 
1c770 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1c780 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61  e optimizer is a
1c790 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72  ble to deliver r
1c7a0 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20  ows in group by 
1c7b0 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20  order so.       
1c7c0 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61   ** we do not ha
1c7d0 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65  ve to sort.  The
1c7e0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1c7f0 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a  l table will be.
1c800 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65          ** cance
1c810 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75  lled later becau
1c820 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  se we still need
1c830 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79   to use the pKey
1c840 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a  Info.        */.
1c850 20 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79          pGroupBy
1c860 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
1c870 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
1c880 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ort = 0;.      }
1c890 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
1c8a0 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67   Rows are coming
1c8b0 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d   out in undeterm
1c8c0 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20  ined order.  We 
1c8d0 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20  have to push.   
1c8e0 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77       ** each row
1c8f0 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20   into a sorting 
1c900 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65  index, terminate
1c910 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c   the first loop,
1c920 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
1c930 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73   loop over the s
1c940 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20  orting index in 
1c950 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
1c960 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20   output.        
1c970 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ** in sorted ord
1c980 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  er.        */.  
1c990 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
1c9a0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  t = 1;.        s
1c9b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
1c9c0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1c9d0 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
1c9e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c9f0 4f 70 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  Op(v, OP_Sequenc
1ca00 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  e, sAggInfo.sort
1ca10 69 6e 67 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  ingIdx, 0);.    
1ca20 20 20 20 20 6a 20 3d 20 70 47 72 6f 75 70 42 79      j = pGroupBy
1ca30 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 20  ->nExpr+1;.     
1ca40 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
1ca50 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
1ca60 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1ca70 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
1ca80 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67  ol *pCol = &sAgg
1ca90 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20  Info.aCol[i];.  
1caa0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
1cab0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
1cac0 6a 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  j ) continue;.  
1cad0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1cae0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1caf0 28 76 2c 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20  (v, pCol->pTab, 
1cb00 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
1cb10 43 6f 6c 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  Col->iTable);.  
1cb20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
1cb30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1cb40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1cb50 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
1cb60 2c 20 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , j, 0);.       
1cb70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cb80 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  p(v, OP_IdxInser
1cb90 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
1cba0 69 6e 67 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  ingIdx, 0);.    
1cbb0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1cbc0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
1cbd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1cbe0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
1cbf0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
1cc00 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b  ngIdx, addrEnd);
1cc10 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1cc20 6d 65 6e 74 28 28 76 2c 20 22 23 20 47 52 4f 55  ment((v, "# GROU
1cc30 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20 20  P BY sort"));.  
1cc40 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75        sAggInfo.u
1cc50 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31  seSortingIdx = 1
1cc60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1cc70 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
1cc80 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
1cc90 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72  Y terms and stor
1cca0 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e  e in b0, b1, b2.
1ccb0 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20  ...      ** (b0 
1ccc0 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  is memory locati
1ccd0 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69  on iBMem+0, b1 i
1cce0 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73  s iBMem+1, and s
1ccf0 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a  o forth).      *
1cd00 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74  * Then compare t
1cd10 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
1cd20 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73   BY terms agains
1cd30 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
1cd40 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  erms.      ** fr
1cd50 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  om the previous 
1cd60 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74  row currently st
1cd70 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20  ored in a0, a1, 
1cd80 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  a2....      */. 
1cd90 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f       addrTopOfLo
1cda0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
1cdb0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1cdc0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1cdd0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
1cde0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1cdf0 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
1ce00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
1ce10 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1ce20 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67 67   OP_Column, sAgg
1ce30 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
1ce40 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   j);.        }el
1ce50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41  se{.          sA
1ce60 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64  ggInfo.directMod
1ce70 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
1ce80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ce90 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
1cea0 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a  y->a[j].pExpr);.
1ceb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cec0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ced0 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
1cee0 65 2c 20 69 42 4d 65 6d 2b 6a 2c 20 6a 3c 70 47  e, iBMem+j, j<pG
1cef0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29  roupBy->nExpr-1)
1cf00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cf10 66 6f 72 28 6a 3d 70 47 72 6f 75 70 42 79 2d 3e  for(j=pGroupBy->
1cf20 6e 45 78 70 72 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  nExpr-1; j>=0; j
1cf30 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  --){.        if(
1cf40 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
1cf50 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  pr-1 ){.        
1cf60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cf70 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
1cf80 2c 20 69 42 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20  , iBMem+j, 0);. 
1cf90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1cfa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cfb0 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
1cfc0 20 69 41 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20   iAMem+j, 0);.  
1cfd0 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29        if( j==0 )
1cfe0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1cff0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1d000 4f 50 5f 45 71 2c 20 30 78 32 30 30 2c 20 61 64  OP_Eq, 0x200, ad
1d010 64 72 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20  drProcessRow);. 
1d020 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d030 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1d040 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
1d050 65 2c 20 30 78 32 30 30 2c 20 61 64 64 72 47 72  e, 0x200, addrGr
1d060 6f 75 70 42 79 43 68 61 6e 67 65 29 3b 0a 20 20  oupByChange);.  
1d070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d080 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1d090 65 50 33 28 76 2c 20 2d 31 2c 20 28 76 6f 69 64  eP3(v, -1, (void
1d0a0 2a 29 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  *)pKeyInfo->aCol
1d0b0 6c 5b 6a 5d 2c 20 50 33 5f 43 4f 4c 4c 53 45 51  l[j], P3_COLLSEQ
1d0c0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1d0d0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1d0e0 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65  de that runs whe
1d0f0 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20  never the GROUP 
1d100 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20  BY changes..    
1d110 20 20 2a 2a 20 43 68 61 6e 67 65 20 69 6e 20 74    ** Change in t
1d120 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20  he GROUP BY are 
1d130 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20  detected by the 
1d140 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20  previous code.  
1d150 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49      ** block.  I
1d160 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20  f there were no 
1d170 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c  changes, this bl
1d180 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a  ock is skipped..
1d190 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1d1a0 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69  * This code copi
1d1b0 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70  es current group
1d1c0 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c   by terms in b0,
1d1d0 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20  b1,b2,....      
1d1e0 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31  ** over to a0,a1
1d1f0 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61  ,a2.  It then ca
1d200 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73  lls the output s
1d210 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  ubroutine.      
1d220 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68  ** and resets th
1d230 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
1d240 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
1d250 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  s in preparation
1d260 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
1d270 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20  e next GROUP BY 
1d280 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a  batch..      */.
1d290 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d2a0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1d2b0 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e   addrGroupByChan
1d2c0 67 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ge);.      for(j
1d2d0 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; j<pGroupBy->
1d2e0 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
1d2f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d300 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4d  AddOp(v, OP_MemM
1d310 6f 76 65 2c 20 69 41 4d 65 6d 2b 6a 2c 20 69 42  ove, iAMem+j, iB
1d320 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a  Mem+j);.      }.
1d330 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d340 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73  eAddOp(v, OP_Gos
1d350 75 62 2c 20 30 2c 20 61 64 64 72 4f 75 74 70 75  ub, 0, addrOutpu
1d360 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
1d370 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
1d380 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29  output one row")
1d390 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d3a0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1d3b0 49 66 4d 65 6d 50 6f 73 2c 20 69 41 62 6f 72 74  IfMemPos, iAbort
1d3c0 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a  Flag, addrEnd);.
1d3d0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1d3e0 74 28 28 76 2c 20 22 23 20 63 68 65 63 6b 20 61  t((v, "# check a
1d3f0 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
1d400 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d410 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62  ddOp(v, OP_Gosub
1d420 2c 20 30 2c 20 61 64 64 72 52 65 73 65 74 29 3b  , 0, addrReset);
1d430 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1d440 6e 74 28 28 76 2c 20 22 23 20 72 65 73 65 74 20  nt((v, "# reset 
1d450 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
1d460 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
1d470 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
1d480 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65  ccumulators base
1d490 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d on the content
1d4a0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
1d4b0 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20   current row.   
1d4c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
1d4d0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1d4e0 62 65 6c 28 76 2c 20 61 64 64 72 50 72 6f 63 65  bel(v, addrProce
1d4f0 73 73 52 6f 77 29 3b 0a 20 20 20 20 20 20 75 70  ssRow);.      up
1d500 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
1d510 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
1d520 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
1d530 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1d540 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 69 55 73 65  _MemInt, 1, iUse
1d550 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
1d560 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
1d570 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e  indicate data in
1d580 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
1d590 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f  ..      /* End o
1d5a0 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20  f the loop.     
1d5b0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72   */.      if( gr
1d5c0 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
1d5d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d5e0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
1d5f0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
1d600 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66  ngIdx, addrTopOf
1d610 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Loop);.      }el
1d620 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1d630 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
1d640 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  fo);.        sql
1d650 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
1d660 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
1d670 69 6e 67 49 64 78 2c 20 31 29 3b 0a 20 20 20 20  ingIdx, 1);.    
1d680 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75    }..      /* Ou
1d690 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72  tput the final r
1d6a0 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20  ow of result.   
1d6b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
1d6c0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1d6d0 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64  OP_Gosub, 0, add
1d6e0 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
1d6f0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1d700 76 2c 20 22 23 20 6f 75 74 70 75 74 20 66 69 6e  v, "# output fin
1d710 61 6c 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20  al row"));.     
1d720 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66   .    } /* endif
1d730 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20 20 20   pGroupBy */.   
1d740 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a   else {.      /*
1d750 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20   This case runs 
1d760 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  if the aggregate
1d770 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   has no GROUP BY
1d780 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20   clause.  The.  
1d790 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
1d7a0 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65  g is much simple
1d7b0 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  r since there is
1d7c0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72   only a single r
1d7d0 6f 77 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f  ow.      ** of o
1d7e0 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  utput..      */.
1d7f0 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
1d800 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
1d810 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
1d820 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
1d830 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
1d840 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
1d850 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  here, 0);.      
1d860 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
1d870 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1d880 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63  .      updateAcc
1d890 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
1d8a0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
1d8b0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
1d8c0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
1d8d0 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
1d8e0 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
1d8f0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
1d900 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
1d910 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67       if( pHaving
1d920 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1d930 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1d940 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
1d950 61 64 64 72 45 6e 64 2c 20 31 29 3b 0a 20 20 20  addrEnd, 1);.   
1d960 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63     }.      selec
1d970 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
1d980 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
1d990 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20   0, 0, 0, -1, . 
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9b0 20 20 20 20 20 65 44 65 73 74 2c 20 69 50 61 72       eDest, iPar
1d9c0 6d 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72  m, addrEnd, addr
1d9d0 45 6e 64 2c 20 61 66 66 29 3b 0a 20 20 20 20 7d  End, aff);.    }
1d9e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d9f0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1da00 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20  addrEnd);.    . 
1da10 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72   } /* endif aggr
1da20 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a  egate query */..
1da30 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1da40 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1da50 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
1da60 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
1da70 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
1da80 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
1da90 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
1daa0 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
1dab0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1dac0 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
1dad0 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70  (pParse, p, v, p
1dae0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44  EList->nExpr, eD
1daf0 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d  est, iParm);.  }
1db00 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1db10 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1db20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
1db30 61 20 73 75 62 71 75 65 72 79 2c 20 77 65 20 68  a subquery, we h
1db40 61 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65  ave now converte
1db50 64 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  d the subquery i
1db60 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f  nto a.  ** tempo
1db70 72 61 72 79 20 74 61 62 6c 65 2e 20 20 53 6f 20  rary table.  So 
1db80 73 65 74 20 74 68 65 20 53 72 63 4c 69 73 74 5f  set the SrcList_
1db90 69 74 65 6d 2e 69 73 50 6f 70 75 6c 61 74 65 64  item.isPopulated
1dba0 20 66 6c 61 67 20 74 6f 20 70 72 65 76 65 6e 74   flag to prevent
1dbb0 0a 20 20 2a 2a 20 74 68 69 73 20 73 75 62 71 75  .  ** this subqu
1dbc0 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67 20 65  ery from being e
1dbd0 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 20 61  valuated again a
1dbe0 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20  nd to force the 
1dbf0 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  use of.  ** the 
1dc00 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
1dc10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
1dc20 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
1dc30 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63  t( pParent->pSrc
1dc40 2d 3e 6e 53 72 63 3e 70 61 72 65 6e 74 54 61 62  ->nSrc>parentTab
1dc50 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1dc60 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61  pParent->pSrc->a
1dc70 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c  [parentTab].pSel
1dc80 65 63 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 50  ect==p );.    pP
1dc90 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70  arent->pSrc->a[p
1dca0 61 72 65 6e 74 54 61 62 5d 2e 69 73 50 6f 70 75  arentTab].isPopu
1dcb0 6c 61 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 23  lated = 1;.  }.#
1dcc0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4a 75 6d 70  endif..  /* Jump
1dcd0 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
1dce0 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  is query.  */.  
1dcf0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1dd00 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29  veLabel(v, iEnd)
1dd10 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  ;..  /* The SELE
1dd20 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75  CT was successfu
1dd30 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74  lly coded.   Set
1dd40 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
1dd50 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e   to 0.  ** to in
1dd60 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73  dicate no errors
1dd70 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b  ..  */.  rc = 0;
1dd80 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
1dd90 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
1dda0 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
1ddb0 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
1ddc0 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
1ddd0 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
1dde0 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
1ddf0 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 0a 20  /.select_end:.. 
1de00 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
1de10 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20  umn names if we 
1de20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68  will be using th
1de30 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b  em in a callback
1de40 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65  .  This.  ** ste
1de50 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  p is skipped if 
1de60 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
1de70 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65  ing to some othe
1de80 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20  r destination.. 
1de90 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
1dea0 4c 49 54 45 5f 4f 4b 20 26 26 20 65 44 65 73 74  LITE_OK && eDest
1deb0 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
1dec0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  {.    generateCo
1ded0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
1dee0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
1def0 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  st);.  }..  sqli
1df00 74 65 33 5f 66 72 65 65 28 73 41 67 67 49 6e 66  te3_free(sAggInf
1df10 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  o.aCol);.  sqlit
1df20 65 33 5f 66 72 65 65 28 73 41 67 67 49 6e 66 6f  e3_free(sAggInfo
1df30 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72  .aFunc);.  retur
1df40 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  n rc;.}..#if def
1df50 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1df60 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  G)./*.**********
1df70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1df80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1df90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dfa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dfb0 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  *****.** The fol
1dfc0 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69 73 20 75  lowing code is u
1dfd0 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
1dfe0 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
1dff0 6c 79 2e 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a  ly.  The code.**
1e000 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f   that follows do
1e010 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e  es not appear in
1e020 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a   normal builds..
1e030 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
1e040 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
1e050 20 70 72 69 6e 74 20 6f 75 74 20 74 68 65 20 63   print out the c
1e060 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72  ontent of all or
1e070 20 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70   part of a .** p
1e080 61 72 73 65 20 73 74 72 75 63 74 75 72 65 73 20  arse structures 
1e090 73 75 63 68 20 61 73 20 53 65 6c 65 63 74 20 6f  such as Select o
1e0a0 72 20 45 78 70 72 2e 20 20 53 75 63 68 20 70 72  r Expr.  Such pr
1e0b0 69 6e 74 6f 75 74 73 20 61 72 65 20 75 73 65 66  intouts are usef
1e0c0 75 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e  ul.** for helpin
1e0d0 67 20 74 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  g to understand 
1e0e0 77 68 61 74 20 69 73 20 68 61 70 70 65 6e 69 6e  what is happenin
1e0f0 67 20 69 6e 73 69 64 65 20 74 68 65 20 63 6f 64  g inside the cod
1e100 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64  e generator.** d
1e110 75 72 69 6e 67 20 74 68 65 20 65 78 65 63 75 74  uring the execut
1e120 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53  ion of complex S
1e130 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
1e140 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
1e150 75 74 69 6e 65 20 61 72 65 20 6e 6f 74 20 63 61  utine are not ca
1e160 6c 6c 65 64 20 61 6e 79 77 68 65 72 65 20 66 72  lled anywhere fr
1e170 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f  om within the no
1e180 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73  rmal.** code bas
1e190 65 2e 20 20 54 68 65 6e 20 61 72 65 20 69 6e 74  e.  Then are int
1e1a0 65 6e 64 65 64 20 74 6f 20 62 65 20 63 61 6c 6c  ended to be call
1e1b0 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ed from within t
1e1c0 68 65 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f  he debugger.** o
1e1d0 72 20 66 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79  r from temporary
1e1e0 20 22 70 72 69 6e 74 66 22 20 73 74 61 74 65 6d   "printf" statem
1e1f0 65 6e 74 73 20 69 6e 73 65 72 74 65 64 20 66 6f  ents inserted fo
1e200 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a  r debugging..*/.
1e210 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e  void sqlite3Prin
1e220 74 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a  tExpr(Expr *p){.
1e230 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a    if( p->token.z
1e240 20 26 26 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30   && p->token.n>0
1e250 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1e260 65 62 75 67 50 72 69 6e 74 66 28 22 28 25 2e 2a  ebugPrintf("(%.*
1e270 73 22 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  s", p->token.n, 
1e280 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d  p->token.z);.  }
1e290 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1e2a0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 25  3DebugPrintf("(%
1e2b0 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a  d", p->op);.  }.
1e2c0 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29    if( p->pLeft )
1e2d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
1e2e0 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20  ugPrintf(" ");. 
1e2f0 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
1e300 78 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  xpr(p->pLeft);. 
1e310 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67   }.  if( p->pRig
1e320 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ht ){.    sqlite
1e330 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 22  3DebugPrintf(" "
1e340 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
1e350 69 6e 74 45 78 70 72 28 70 2d 3e 70 52 69 67 68  intExpr(p->pRigh
1e360 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
1e370 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 29 22  3DebugPrintf(")"
1e380 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
1e390 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 45  3PrintExprList(E
1e3a0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
1e3b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1e3c0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1e3d0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
1e3e0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
1e3f0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1e400 72 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 4c  r);.    if( i<pL
1e410 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a  ist->nExpr-1 ){.
1e420 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
1e430 75 67 50 72 69 6e 74 66 28 22 2c 20 22 29 3b 0a  ugPrintf(", ");.
1e440 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64      }.  }.}.void
1e450 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c   sqlite3PrintSel
1e460 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  ect(Select *p, i
1e470 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71  nt indent){.  sq
1e480 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1e490 28 22 25 2a 73 53 45 4c 45 43 54 28 25 70 29 20  ("%*sSELECT(%p) 
1e4a0 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70  ", indent, "", p
1e4b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 72 69 6e  );.  sqlite3Prin
1e4c0 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  tExprList(p->pEL
1e4d0 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ist);.  sqlite3D
1e4e0 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
1e4f0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20  ;.  if( p->pSrc 
1e500 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72  ){.    char *zPr
1e510 65 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b  efix;.    int i;
1e520 0a 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22  .    zPrefix = "
1e530 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69  FROM";.    for(i
1e540 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e  =0; i<p->pSrc->n
1e550 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
1e560 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1e570 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
1e580 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  ->pSrc->a[i];.  
1e590 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1e5a0 50 72 69 6e 74 66 28 22 25 2a 73 20 22 2c 20 69  Printf("%*s ", i
1e5b0 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78  ndent+6, zPrefix
1e5c0 29 3b 0a 20 20 20 20 20 20 7a 50 72 65 66 69 78  );.      zPrefix
1e5d0 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28   = "";.      if(
1e5e0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
1e5f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e600 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
1e610 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71  \n");.        sq
1e620 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74  lite3PrintSelect
1e630 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c  (pItem->pSelect,
1e640 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20   indent+10);.   
1e650 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
1e660 67 50 72 69 6e 74 66 28 22 25 2a 73 29 22 2c 20  gPrintf("%*s)", 
1e670 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20  indent+8, "");. 
1e680 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1e690 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Item->zName ){. 
1e6a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
1e6b0 62 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20  bugPrintf("%s", 
1e6c0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
1e6d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1e6e0 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a   pItem->pTab ){.
1e6f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
1e700 65 62 75 67 50 72 69 6e 74 66 28 22 28 74 61 62  ebugPrintf("(tab
1e710 6c 65 3a 20 25 73 29 22 2c 20 70 49 74 65 6d 2d  le: %s)", pItem-
1e720 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pTab->zName);. 
1e730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1e740 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
1e750 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e760 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 41  3DebugPrintf(" A
1e770 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41  S %s", pItem->zA
1e780 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lias);.      }. 
1e790 20 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 70 53       if( i<p->pS
1e7a0 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20  rc->nSrc-1 ){.  
1e7b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
1e7c0 75 67 50 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20  ugPrintf(",");. 
1e7d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1e7e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1e7f0 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  "\n");.    }.  }
1e800 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
1e810 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1e820 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
1e830 57 48 45 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c  WHERE ", indent,
1e840 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
1e850 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 57  3PrintExpr(p->pW
1e860 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  here);.    sqlit
1e870 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
1e880 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n");.  }.  if( p
1e890 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
1e8a0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1e8b0 69 6e 74 66 28 22 25 2a 73 20 47 52 4f 55 50 20  intf("%*s GROUP 
1e8c0 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  BY ", indent, ""
1e8d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
1e8e0 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  intExprList(p->p
1e8f0 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71  GroupBy);.    sq
1e900 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1e910 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  ("\n");.  }.  if
1e920 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a  ( p->pHaving ){.
1e930 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1e940 50 72 69 6e 74 66 28 22 25 2a 73 20 48 41 56 49  Printf("%*s HAVI
1e950 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  NG ", indent, ""
1e960 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
1e970 69 6e 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69  intExpr(p->pHavi
1e980 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ng);.    sqlite3
1e990 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
1e9a0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
1e9b0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1e9c0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1e9d0 74 66 28 22 25 2a 73 20 4f 52 44 45 52 20 42 59  tf("%*s ORDER BY
1e9e0 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b   ", indent, "");
1e9f0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
1ea00 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  tExprList(p->pOr
1ea10 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
1ea20 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1ea30 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45  \n");.  }.}./* E
1ea40 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  nd of the struct
1ea50 75 72 65 20 64 65 62 75 67 20 70 72 69 6e 74 69  ure debug printi
1ea60 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a  ng code.********
1ea70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ea80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ea90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1eaa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1eab0 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  *****/.#endif /*
1eac0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1ead0 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
1eae0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 2a  (SQLITE_DEBUG) *
1eaf0 2f 0a                                            /.