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

Artifact b7408624b55f58e5aa8521edb177b26ad72f968b:


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 36 35  select.c,v 1.365
0200: 20 32 30 30 37 2f 31 32 2f 31 30 20 31 38 3a 35   2007/12/10 18:5
0210: 31 3a 34 38 20 64 61 6e 69 65 6c 6b 31 39 37 37  1:48 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 27 73 20 6f 77  ust make it's ow
7ac0: 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f  n copy of the co
7ad0: 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74  lumn-type and ot
7ae0: 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75  her .    ** colu
7af0: 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72 69  mn specific stri
7b00: 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65  ngs, in case the
7b10: 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65 74   schema is reset
7b20: 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20   before this.   
7b30: 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68   ** virtual mach
7b40: 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  ine is deleted..
7b50: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
7b60: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
7b70: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
7b80: 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20  ECLTYPE, zType, 
7b90: 50 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  P3_TRANSIENT);. 
7ba0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
7bb0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
7bc0: 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c  OLNAME_DATABASE,
7bd0: 20 7a 4f 72 69 67 44 62 2c 20 50 33 5f 54 52 41   zOrigDb, P3_TRA
7be0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
7bf0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
7c00: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
7c10: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
7c20: 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b  , P3_TRANSIENT);
7c30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7c40: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
7c50: 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c   COLNAME_COLUMN,
7c60: 20 7a 4f 72 69 67 43 6f 6c 2c 20 50 33 5f 54 52   zOrigCol, P3_TR
7c70: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a  ANSIENT);.  }.}.
7c80: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
7c90: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
7ca0: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
7cb0: 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   names of column
7cc0: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
7cd0: 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e  lt set.  This in
7ce0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
7cf0: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
7d00: 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75  .** azCol[] valu
7d10: 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61  es in the callba
7d20: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
7d30: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
7d40: 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  nNames(.  Parse 
7d50: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
7d60: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
7d70: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
7d80: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
7d90: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
7da0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
7db0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
7dc0: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
7dd0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
7de0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
7df0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
7e00: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
7e10: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
7e20: 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61  db;.  int fullNa
7e30: 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b  mes, shortNames;
7e40: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
7e50: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
7e60: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
7e70: 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74   EXPLAIN, skip t
7e80: 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66  his step */.  if
7e90: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
7ea0: 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  n ){.    return;
7eb0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
7ec0: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
7ed0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
7ee0: 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30  NamesSet || v==0
7ef0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
7f00: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
7f10: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
7f20: 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c  sSet = 1;.  full
7f30: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
7f40: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
7f50: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
7f60: 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62  shortNames = (db
7f70: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
7f80: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
7f90: 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  =0;.  sqlite3Vdb
7fa0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70  eSetNumCols(v, p
7fb0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
7fc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
7fd0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
7fe0: 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  .    Expr *p;.  
7ff0: 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b    p = pEList->a[
8000: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
8010: 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ( p==0 ) continu
8020: 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  e;.    if( pELis
8030: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b  t->a[i].zName ){
8040: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
8050: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
8060: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73  ].zName;.      s
8070: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8080: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8090: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
80a0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a  strlen(zName));.
80b0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
80c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
80d0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
80e0: 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20  & pTabList ){.  
80f0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
8100: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
8110: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  l;.      int iCo
8120: 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  l = p->iColumn;.
8130: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
8140: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
8150: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
8160: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54  ].iCursor!=p->iT
8170: 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20  able; j++){}.   
8180: 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61     assert( j<pTa
8190: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
81a0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
81b0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
81c0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
81d0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
81e0: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
81f0: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
8200: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
8210: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
8220: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
8230: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  <0 ){.        zC
8240: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
8250: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8260: 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
8270: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
8280: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8290: 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20  if( !shortNames 
82a0: 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 26 26  && !fullNames &&
82b0: 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d   p->span.z && p-
82c0: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  >span.z[0] ){.  
82d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
82e0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
82f0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
8300: 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a  (char*)p->span.z
8310: 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20  , p->span.n);.  
8320: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75      }else if( fu
8330: 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73 68 6f  llNames || (!sho
8340: 72 74 4e 61 6d 65 73 20 26 26 20 70 54 61 62 4c  rtNames && pTabL
8350: 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a  ist->nSrc>1) ){.
8360: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
8370: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
8380: 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20   char *zTab;. . 
8390: 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70 54         zTab = pT
83a0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c  abList->a[j].zAl
83b0: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ias;.        if(
83c0: 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54   fullNames || zT
83d0: 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20 70  ab==0 ) zTab = p
83e0: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
83f0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
8400: 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61  ring(&zName, zTa
8410: 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63  b, ".", zCol, (c
8420: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20  har*)0);.       
8430: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8440: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8450: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
8460: 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P3_DYNAMIC);. 
8470: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8480: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8490: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
84a0: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43  COLNAME_NAME, zC
84b0: 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29  ol, strlen(zCol)
84c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
84d0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61 6e  else if( p->span
84e0: 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b  .z && p->span.z[
84f0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0] ){.      sqli
8500: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8510: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8520: 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e  NAME, (char*)p->
8530: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
8540: 6e 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c  n);.      /* sql
8550: 69 74 65 33 56 64 62 65 43 6f 6d 70 72 65 73 73  ite3VdbeCompress
8560: 53 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b 20  Space(v, addr); 
8570: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
8580: 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33      char zName[3
8590: 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0];.      assert
85a0: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  ( p->op!=TK_COLU
85b0: 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d  MN || pTabList==
85c0: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
85d0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
85e0: 6f 66 28 7a 4e 61 6d 65 29 2c 20 7a 4e 61 6d 65  of(zName), zName
85f0: 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b  , "column%d", i+
8600: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
8610: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8620: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8630: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ME, zName, 0);. 
8640: 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72     }.  }.  gener
8650: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
8660: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
8670: 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69 66   pEList);.}..#if
8680: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8690: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
86a0: 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74  ./*.** Name of t
86b0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
86c0: 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72  erator, used for
86d0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e   error messages.
86e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
86f0: 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e   char *selectOpN
8700: 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63  ame(int id){.  c
8710: 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68  har *z;.  switch
8720: 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65  ( id ){.    case
8730: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a   TK_ALL:       z
8740: 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20   = "UNION ALL"; 
8750: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8760: 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
8770: 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b  z = "INTERSECT";
8780: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8790: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20  se TK_EXCEPT:   
87a0: 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20   z = "EXCEPT";  
87b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
87c0: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
87d0: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20    z = "UNION";  
87e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
87f0: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65    return z;.}.#e
8800: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8810: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
8820: 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ECT */../*.** Fo
8830: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
8840: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
8850: 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50  prepSelectStmt(P
8860: 61 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b  arse*, Select*);
8870: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
8880: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
8890: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62  , generate a Tab
88a0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
88b0: 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74  t describes.** t
88c0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
88d0: 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f   that SELECT..*/
88e0: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52  .Table *sqlite3R
88f0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
8900: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8910: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20  char *zTabName, 
8920: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
8930: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
8940: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45  .  int i, j;.  E
8950: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
8960: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c  .  Column *aCol,
8970: 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65   *pCol;.  sqlite
8980: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8990: 64 62 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 53  db;..  while( pS
89a0: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20  elect->pPrior ) 
89b0: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
89c0: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28  t->pPrior;.  if(
89d0: 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28   prepSelectStmt(
89e0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
89f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
8a00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
8a10: 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65  te3SelectResolve
8a20: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
8a30: 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
8a40: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
8a50: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8a60: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
8a70: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
8a80: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
8a90: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
8aa0: 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b   pTab->nRef = 1;
8ab0: 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  .  pTab->zName =
8ac0: 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69   zTabName ? sqli
8ad0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
8ae0: 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20  zTabName) : 0;. 
8af0: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
8b00: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54 61  t->pEList;.  pTa
8b10: 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74  b->nCol = pEList
8b20: 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ->nExpr;.  asser
8b30: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20  t( pTab->nCol>0 
8b40: 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20  );.  pTab->aCol 
8b50: 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  = aCol = sqlite3
8b60: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
8b70: 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43   sizeof(pTab->aC
8b80: 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f  ol[0])*pTab->nCo
8b90: 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  l);.  for(i=0, p
8ba0: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62  Col=aCol; i<pTab
8bb0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
8bc0: 6c 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  l++){.    Expr *
8bd0: 70 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68 61 72  p, *pR;.    char
8be0: 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63 68 61   *zType;.    cha
8bf0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  r *zName;.    in
8c00: 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c  t nName;.    Col
8c10: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
8c20: 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61   int cnt;.    Na
8c30: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
8c40: 20 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 61     .    /* Get a
8c50: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
8c60: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
8c70: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d  n.    */.    p =
8c80: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
8c90: 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
8ca0: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c   p->pRight==0 ||
8cb0: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
8cc0: 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  n.z==0 || p->pRi
8cd0: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21  ght->token.z[0]!
8ce0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  =0 );.    if( (z
8cf0: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
8d00: 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
8d10: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
8d20: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
8d30: 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
8d40: 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
8d50: 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
8d60: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
8d70: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
8d80: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
8d90: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d  }else if( p->op=
8da0: 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20 20 20 20  =TK_DOT .       
8db0: 20 20 20 20 20 20 20 26 26 20 28 70 52 3d 70 2d         && (pR=p-
8dc0: 3e 70 52 69 67 68 74 29 21 3d 30 20 26 26 20 70  >pRight)!=0 && p
8dd0: 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 52  R->token.z && pR
8de0: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a  ->token.z[0] ){.
8df0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c        /* For col
8e00: 75 6d 6e 73 20 6f 66 20 74 68 65 20 66 72 6f 6d  umns of the from
8e10: 20 41 2e 42 20 75 73 65 20 42 20 61 73 20 74 68   A.B use B as th
8e20: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
8e30: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
8e40: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 54 22 2c  Printf(db, "%T",
8e50: 20 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20   &pR->token);.  
8e60: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73    }else if( p->s
8e70: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
8e80: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f  .z[0] ){.      /
8e90: 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e  * Use the origin
8ea0: 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  al text of the c
8eb0: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
8ec0: 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a   as its name */.
8ed0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
8ee0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
8ef0: 20 22 25 54 22 2c 20 26 70 2d 3e 73 70 61 6e 29   "%T", &p->span)
8f00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8f10: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65 6c 73     /* If all els
8f20: 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20 75 70  e fails, make up
8f30: 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20   a name */.     
8f40: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
8f50: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c  MPrintf(db, "col
8f60: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20  umn%d", i+1);.  
8f70: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 4e 61    }.    if( !zNa
8f80: 6d 65 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  me || db->malloc
8f90: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
8fa0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8fb0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
8fc0: 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b  te3_free(zName);
8fd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
8fe0: 6c 65 74 65 54 61 62 6c 65 28 70 54 61 62 29 3b  leteTable(pTab);
8ff0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
9000: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9010: 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
9020: 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  ;..    /* Make s
9030: 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ure the column n
9040: 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20  ame is unique.  
9050: 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e  If the name is n
9060: 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a  ot unique,.    *
9070: 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67  * append a integ
9080: 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73  er to the name s
9090: 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65  o that it become
90a0: 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f  s unique..    */
90b0: 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72  .    nName = str
90c0: 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  len(zName);.    
90d0: 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69  for(j=cnt=0; j<i
90e0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
90f0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
9100: 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  (aCol[j].zName, 
9110: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
9120: 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65       zName[nName
9130: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  ] = 0;.        z
9140: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
9150: 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 3a 25 64  rintf(db, "%z:%d
9160: 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29  ", zName, ++cnt)
9170: 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31  ;.        j = -1
9180: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  ;.        if( zN
9190: 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ame==0 ) break;.
91a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
91b0: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
91c0: 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47  zName;..    /* G
91d0: 65 74 20 74 68 65 20 74 79 70 65 6e 61 6d 65 2c  et the typename,
91e0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 2c 20   type affinity, 
91f0: 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
9200: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 0a 20  quence for the. 
9210: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20     ** column..  
9220: 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
9230: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
9240: 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
9250: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
9260: 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 7a 54 79  t->pSrc;.    zTy
9270: 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  pe = sqlite3DbSt
9280: 72 44 75 70 28 64 62 2c 20 63 6f 6c 75 6d 6e 54  rDup(db, columnT
9290: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20  ype(&sNC, p, 0, 
92a0: 30 2c 20 30 29 29 3b 0a 20 20 20 20 70 43 6f 6c  0, 0));.    pCol
92b0: 2d 3e 7a 54 79 70 65 20 3d 20 7a 54 79 70 65 3b  ->zType = zType;
92c0: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
92d0: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
92e0: 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
92f0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
9300: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
9310: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  rse, p);.    if(
9320: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
9330: 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71  pCol->zColl = sq
9340: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
9350: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
9360: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61  .    }.  }.  pTa
9370: 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
9380: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
9390: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
93a0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
93b0: 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
93c0: 20 62 79 20 64 6f 69 6e 67 20 74 68 65 20 66 6f   by doing the fo
93d0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 69 6e 67  llowing.** thing
93e0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s:.**.**    (1) 
93f0: 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20   Make sure VDBE 
9400: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
9410: 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
9420: 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20  d to every.**   
9430: 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66        element of
9440: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9450: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
9460: 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
9470: 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
9480: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
9490: 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
94a0: 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52        defines FR
94b0: 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e  OM clause.  When
94c0: 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e   views appear in
94d0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
94e0: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
94f0: 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
9500: 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
9510: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
9520: 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
9530: 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
9540: 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
9550: 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
9560: 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
9570: 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
9580: 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
9590: 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
95a0: 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
95b0: 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
95c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
95d0: 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
95e0: 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
95f0: 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70  e presistent rep
9600: 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
9610: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
9620: 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ew..**.**    (3)
9630: 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
9640: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
9650: 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68  to accomodate th
9660: 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
9670: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
9680: 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
9690: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
96a0: 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
96b0: 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74  *    (4)  Scan t
96c0: 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
96d0: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
96e0: 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
96f0: 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
9700: 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
9710: 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
9720: 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
9730: 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
9740: 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
9750: 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
9760: 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
9770: 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
9780: 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
9790: 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
97a0: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
97b0: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  TABLE..**.** Ret
97c0: 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73  urn 0 on success
97d0: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
97e0: 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20  problems, leave 
97f0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
9800: 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e  .** in pParse an
9810: 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  d return non-zer
9820: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
9830: 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28   prepSelectStmt(
9840: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
9850: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
9860: 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20   i, j, k, rc;.  
9870: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
9880: 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  t;.  ExprList *p
9890: 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
98a0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
98b0: 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rom;.  sqlite3 *
98c0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
98d0: 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ..  if( p==0 || 
98e0: 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20 64 62  p->pSrc==0 || db
98f0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9900: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
9910: 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d    }.  pTabList =
9920: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
9930: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
9940: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
9950: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
9960: 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
9970: 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
9980: 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
9990: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
99a0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
99b0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
99c0: 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
99d0: 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e  sors(pParse, p->
99e0: 70 53 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  pSrc);..  /* Loo
99f0: 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
9a00: 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
9a10: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
9a20: 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a   select.  If.  *
9a30: 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  * an entry of th
9a40: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
9a50: 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74   a subquery inst
9a60: 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ead of a table o
9a70: 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65  r view,.  ** the
9a80: 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73  n create a trans
9a90: 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
9aa0: 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65  ture to describe
9ab0: 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
9ac0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
9ad0: 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
9ae0: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
9af0: 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
9b00: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
9b10: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  ab;.    if( pFro
9b20: 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20  m->pTab!=0 ){.  
9b30: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74      /* This stat
9b40: 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64  ement has alread
9b50: 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e  y been prepared.
9b60: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
9b70: 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67  ed.      ** to g
9b80: 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20  o further. */.  
9b90: 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30      assert( i==0
9ba0: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
9bb0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
9bc0: 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
9bd0: 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
9be0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
9bf0: 59 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  Y.      /* A sub
9c00: 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
9c10: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
9c20: 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61  ELECT */.      a
9c30: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53  ssert( pFrom->pS
9c40: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20  elect!=0 );.    
9c50: 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c    if( pFrom->zAl
9c60: 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ias==0 ){.      
9c70: 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20    pFrom->zAlias 
9c80: 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  =.          sqli
9c90: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
9ca0: 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f  sqlite_subquery_
9cb0: 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 46 72  %p_", (void*)pFr
9cc0: 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  om->pSelect);.  
9cd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
9ce0: 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
9cf0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  =0 );.      pFro
9d00: 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
9d10: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
9d20: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
9d30: 63 74 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  ct(pParse, pFrom
9d40: 2d 3e 7a 41 6c 69 61 73 2c 20 70 46 72 6f 6d 2d  ->zAlias, pFrom-
9d50: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
9d60: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
9d70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
9d80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9d90: 2f 2a 20 54 68 65 20 69 73 45 70 68 65 6d 20 66  /* The isEphem f
9da0: 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68  lag indicates th
9db0: 61 74 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  at the Table str
9dc0: 75 63 74 75 72 65 20 68 61 73 20 62 65 65 6e 0a  ucture has been.
9dd0: 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63        ** dynamic
9de0: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 61  ally allocated a
9df0: 6e 64 20 6d 61 79 20 62 65 20 66 72 65 65 64 20  nd may be freed 
9e00: 61 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e  at any time.  In
9e10: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20 20   other words,.  
9e20: 20 20 20 20 2a 2a 20 70 54 61 62 20 69 73 20 6e      ** pTab is n
9e30: 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ot pointing to a
9e40: 20 70 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c   persistent tabl
9e50: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
9e60: 20 64 65 66 69 6e 65 73 0a 20 20 20 20 20 20 2a   defines.      *
9e70: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 63  * part of the sc
9e80: 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70  hema. */.      p
9e90: 54 61 62 2d 3e 69 73 45 70 68 65 6d 20 3d 20 31  Tab->isEphem = 1
9ea0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
9eb0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
9ec0: 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
9ed0: 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74  r view name in t
9ee0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
9ef0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
9f00: 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
9f10: 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
9f20: 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20  Tab = pTab = .  
9f30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
9f40: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
9f50: 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72  pFrom->zName,pFr
9f60: 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  om->zDatabase);.
9f70: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
9f80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
9f90: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
9fa0: 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
9fb0: 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  +;.#if !defined(
9fc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
9fd0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53  ) || !defined (S
9fe0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
9ff0: 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69  ALTABLE).      i
a000: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
a010: 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54   || IsVirtual(pT
a020: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ab) ){.        /
a030: 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20  * We reach here 
a040: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  if the named tab
a050: 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61  le is a really a
a060: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20   view */.       
a070: 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77   if( sqlite3View
a080: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
a090: 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
a0a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
a0b0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
a0c0: 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 6f        /* If pFro
a0d0: 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 69 74  m->pSelect!=0 it
a0e0: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
a0f0: 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20  aling with a.   
a100: 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74       ** view wit
a110: 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65  hin a view.  The
a120: 20 53 45 4c 45 43 54 20 73 74 72 75 63 74 75 72   SELECT structur
a130: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
a140: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  en.        ** co
a150: 70 69 65 64 20 62 79 20 74 68 65 20 6f 75 74 65  pied by the oute
a160: 72 20 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e  r view so we can
a170: 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73   skip the copy s
a180: 74 65 70 20 68 65 72 65 0a 20 20 20 20 20 20 20  tep here.       
a190: 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72   ** in the inner
a1a0: 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a   view..        *
a1b0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  /.        if( pF
a1c0: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  rom->pSelect==0 
a1d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  ){.          pFr
a1e0: 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
a1f0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
a200: 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  b, pTab->pSelect
a210: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
a220: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
a230: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
a240: 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  ess NATURAL keyw
a250: 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64  ords, and ON and
a260: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
a270: 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  f joins..  */.  
a280: 69 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65 73  if( sqliteProces
a290: 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29  sJoin(pParse, p)
a2a0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20   ) return 1;..  
a2b0: 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22  /* For every "*"
a2c0: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
a2d0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c  the column list,
a2e0: 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
a2f0: 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f  s of.  ** all co
a300: 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
a310: 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76  les.  And for ev
a320: 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65  ery TABLE.* inse
a330: 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a  rt the names.  *
a340: 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  * of all columns
a350: 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20   in TABLE.  The 
a360: 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20  parser inserted 
a370: 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73  a special expres
a380: 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74  sion.  ** with t
a390: 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74  he TK_ALL operat
a3a0: 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20  or for each "*" 
a3b0: 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e  that it found in
a3c0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
a3d0: 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  ** The follo
a3e0: 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
a3f0: 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
a400: 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69   TK_ALL expressi
a410: 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20  ons and expand. 
a420: 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20   ** each one to 
a430: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
a440: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
a450: 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
a460: 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20   The first loop 
a470: 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73  just checks to s
a480: 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
a490: 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  any "*" operator
a4a0: 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64  s.  ** that need
a4b0: 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f   expanding..  */
a4c0: 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45  .  for(k=0; k<pE
a4d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
a4e0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  ){.    Expr *pE 
a4f0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70  = pEList->a[k].p
a500: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
a510: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
a520: 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45  reak;.    if( pE
a530: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
a540: 70 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45  pE->pRight && pE
a550: 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
a560: 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26  _ALL.         &&
a570: 20 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45   pE->pLeft && pE
a580: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
a590: 49 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ID ) break;.  }.
a5a0: 20 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20    rc = 0;.  if( 
a5b0: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
a5c0: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
a5d0: 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
a5e0: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
a5f0: 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
a600: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
a610: 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
a620: 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
a630: 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
a640: 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
a650: 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
a660: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
a670: 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
a680: 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
a690: 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
a6a0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
a6b0: 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
a6c0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
a6d0: 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
a6e0: 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64  lags = pParse->d
a6f0: 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e  b->flags;.    in
a700: 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66  t longNames = (f
a710: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
a720: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 20 26  llColNames)!=0 &
a730: 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
a740: 20 20 20 20 20 20 20 20 28 66 6c 61 67 73 20 26          (flags &
a750: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
a760: 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20  Names)==0;..    
a770: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
a780: 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
a790: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
a7a0: 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[k].pExpr;.   
a7b0: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
a7c0: 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20 20 20  K_ALL &&.       
a7d0: 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f      (pE->op!=TK_
a7e0: 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  DOT || pE->pRigh
a7f0: 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67  t==0 || pE->pRig
a800: 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  ht->op!=TK_ALL) 
a810: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
a820: 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78  is particular ex
a830: 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
a840: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
a850: 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  anded..        *
a860: 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
a870: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a880: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
a890: 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c  New, a[k].pExpr,
a8a0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
a8b0: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
a8c0: 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
a8d0: 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20  >nExpr-1].zName 
a8e0: 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  = a[k].zName;.  
a8f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a900: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
a910: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a920: 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
a930: 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e  .        a[k].zN
a940: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ame = 0;.      }
a950: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
a960: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
a970: 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
a980: 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
a990: 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
a9a0: 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
a9b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
a9c0: 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
a9d0: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
a9e0: 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
a9f0: 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
aa00: 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  *zTName;        
aa10: 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e      /* text of n
aa20: 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a  ame of TABLE */.
aa30: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
aa40: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
aa50: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
aa60: 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71       zTName = sq
aa70: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
aa80: 65 6e 28 64 62 2c 20 26 70 45 2d 3e 70 4c 65 66  en(db, &pE->pLef
aa90: 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  t->token);.     
aaa0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aab0: 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a      zTName = 0;.
aac0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
aad0: 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
aae0: 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
aaf0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
ab00: 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
ab10: 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
ab20: 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
ab30: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ab;.          ch
ab40: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
ab50: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  From->zAlias;.  
ab60: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
ab70: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e  Name==0 || zTabN
ab80: 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20  ame[0]==0 ){ .  
ab90: 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
aba0: 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
abb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
abc0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
abd0: 6d 65 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d  me && (zTabName=
abe0: 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30  =0 || zTabName[0
abf0: 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20  ]==0 || .       
ac00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ac10: 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c  3StrICmp(zTName,
ac20: 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 29 20 29   zTabName)!=0) )
ac30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
ac40: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
ac50: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61    }.          ta
ac60: 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20  bleSeen = 1;.   
ac70: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
ac80: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
ac90: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
aca0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 52  Expr *pExpr, *pR
acb0: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
acc0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
acd0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
ace0: 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  ame;..          
acf0: 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e    /* If a column
ad00: 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68   is marked as 'h
ad10: 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c  idden' (currentl
ad20: 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a  y only possible.
ad30: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66              ** f
ad40: 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
ad50: 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75  s), do not inclu
ad60: 64 65 20 69 74 20 69 6e 20 74 68 65 20 65 78 70  de it in the exp
ad70: 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20  anded.          
ad80: 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20    ** result-set 
ad90: 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20  list..          
ada0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
adb0: 20 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c   if( IsHiddenCol
adc0: 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  umn(&pTab->aCol[
add0: 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j]) ){.         
ade0: 20 20 20 20 20 61 73 73 65 72 74 28 49 73 56 69       assert(IsVi
adf0: 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20  rtual(pTab));.  
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
ae10: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
ae20: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
ae30: 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
ae40: 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
ae50: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
ae60: 4c 65 66 74 20 3d 20 26 70 54 61 62 4c 69 73 74  Left = &pTabList
ae70: 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20  ->a[i-1];.      
ae80: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 65          if( (pLe
ae90: 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  ft[1].jointype &
aea0: 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20   JT_NATURAL)!=0 
aeb0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
aec0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d             colum
aed0: 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 54  nIndex(pLeft->pT
aee0: 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ab, zName)>=0 ){
aef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
af00: 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c   /* In a NATURAL
af10: 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20   join, omit the 
af20: 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  join columns fro
af30: 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  m the .         
af40: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
af50: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af70: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
af80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
af90: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
afa0: 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
afb0: 4c 65 66 74 5b 31 5d 2e 70 55 73 69 6e 67 2c 20  Left[1].pUsing, 
afc0: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
afe0: 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61  In a join with a
aff0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f   USING clause, o
b000: 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  mit columns in t
b010: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
b020: 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75     ** using clau
b030: 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  se from the tabl
b040: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  e on the right. 
b050: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
b060: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
b070: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
b080: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b090: 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
b0a0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
b0b0: 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30  rse, TK_ID, 0, 0
b0c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
b0d0: 20 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20    if( pRight==0 
b0e0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
b0f0: 20 20 20 20 20 73 65 74 51 75 6f 74 65 64 54 6f       setQuotedTo
b100: 6b 65 6e 28 70 50 61 72 73 65 2c 20 26 70 52 69  ken(pParse, &pRi
b110: 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d  ght->token, zNam
b120: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
b130: 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20  if( zTabName && 
b140: 28 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54  (longNames || pT
b150: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20  abList->nSrc>1) 
b160: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
b170: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73   Expr *pLeft = s
b180: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
b190: 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  se, TK_ID, 0, 0,
b1a0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
b1b0: 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
b1c0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
b1d0: 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
b1e0: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
b1f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
b200: 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  pr==0 ) break;. 
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
b220: 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50 61 72  QuotedToken(pPar
b230: 73 65 2c 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65  se, &pLeft->toke
b240: 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20  n, zTabName);.  
b250: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54              setT
b260: 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73 70 61  oken(&pExpr->spa
b270: 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  n, .            
b280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
b290: 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
b2a0: 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d  , zTabName, zNam
b2b0: 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
b2c0: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64     pExpr->span.d
b2d0: 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  yn = 1;.        
b2e0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
b2f0: 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20  en.z = 0;.      
b300: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
b310: 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  oken.n = 0;.    
b320: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
b330: 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a  >token.dyn = 0;.
b340: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
b350: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
b360: 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b   pExpr = pRight;
b370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
b380: 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78  Expr->span = pEx
b390: 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  pr->token;.     
b3a0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
b3b0: 73 70 61 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20  span.dyn = 0;.  
b3c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b3d0: 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
b3e0: 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
b3f0: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
b400: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
b410: 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
b420: 2c 20 70 45 78 70 72 2c 20 26 70 45 78 70 72 2d  , pExpr, &pExpr-
b430: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  >span);.        
b440: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b450: 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
b460: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
b470: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
b480: 65 77 2c 20 70 45 78 70 72 2c 20 26 70 52 69 67  ew, pExpr, &pRig
b490: 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ht->token);.    
b4a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b4b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
b4c0: 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
b4d0: 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
b4e0: 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29      if( zTName )
b4f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
b500: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
b510: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
b520: 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d  able: %s", zTNam
b530: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
b540: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
b550: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
b560: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62  (pParse, "no tab
b570: 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b  les specified");
b580: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b590: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
b5a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b5b0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
b5c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
b5d0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
b5e0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
b5f0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
b600: 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
b610: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  }.  if( p->pELis
b620: 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  t && p->pEList->
b630: 6e 45 78 70 72 3e 53 51 4c 49 54 45 5f 4d 41 58  nExpr>SQLITE_MAX
b640: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 73  _COLUMN ){.    s
b650: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
b660: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
b670: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
b680: 6c 74 20 73 65 74 22 29 3b 0a 20 20 20 20 72 63  lt set");.    rc
b690: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
b6a0: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d  .  }.  if( db->m
b6b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
b6c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
b6d0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OMEM;.  }.  retu
b6e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
b6f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
b700: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
b710: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b720: 20 61 73 73 6f 63 69 61 74 65 73 20 65 6e 74 72   associates entr
b730: 69 65 73 20 69 6e 20 61 6e 20 4f 52 44 45 52 20  ies in an ORDER 
b740: 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  BY expression li
b750: 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d  st with.** colum
b760: 6e 73 20 69 6e 20 61 20 72 65 73 75 6c 74 2e 20  ns in a result. 
b770: 20 46 6f 72 20 65 61 63 68 20 4f 52 44 45 52 20   For each ORDER 
b780: 42 59 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  BY expression, t
b790: 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20  he opcode of.** 
b7a0: 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f  the top-level no
b7b0: 64 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  de is changed to
b7c0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74   TK_COLUMN and t
b7d0: 68 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65  he iColumn value
b7e0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c   of.** the top-l
b7f0: 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c  evel node is fil
b800: 6c 65 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75  led in with colu
b810: 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  mn number and th
b820: 65 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75  e iTable.** valu
b830: 65 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76  e of the top-lev
b840: 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65  el node is fille
b850: 64 20 77 69 74 68 20 69 54 61 62 6c 65 20 70 61  d with iTable pa
b860: 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 41  rameter..**.** A
b870: 6e 79 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f  ny entry that do
b880: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20  es not match is 
b890: 66 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65 72  flagged as an er
b8a0: 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ror.  The number
b8b0: 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73  .** of errors is
b8c0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
b8d0: 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72  atic int matchOr
b8e0: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20  derbyToColumn(. 
b8f0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b900: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c           /* A pl
b910: 61 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72  ace to leave err
b920: 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20  or messages */. 
b930: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
b940: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63  ,        /* Matc
b950: 68 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75  h to result colu
b960: 6d 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45  mns of this SELE
b970: 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  CT */.  ExprList
b980: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
b990: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
b9a0: 76 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20  values to match 
b9b0: 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20  against columns 
b9c0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 20  */.  int iTable 
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b9e0: 49 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c 75  Insert this valu
b9f0: 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 29  e in iTable */.)
ba00: 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  {.  int nErr = 0
ba10: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
ba20: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
ba30: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
ba40: 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 53  nExpr;..  if( pS
ba50: 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64  elect==0 || pOrd
ba60: 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  erBy==0 ) return
ba70: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
ba80: 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70  3SelectResolve(p
ba90: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
baa0: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
bab0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 6e 45 78 70 72   1;.  }..  nExpr
bac0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
bad0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72  st->nExpr;.  for
bae0: 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26  (i=0; nErr==0 &&
baf0: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
bb00: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
bb10: 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42  pr *pE = pOrderB
bb20: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
bb30: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31     int iCol = -1
bb40: 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ;..    if( sqlit
bb50: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
bb60: 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20  pE, &iCol) ){.  
bb70: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20      if( iCol<=0 
bb80: 7c 7c 20 69 43 6f 6c 3e 6e 45 78 70 72 20 29 7b  || iCol>nExpr ){
bb90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bba0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
bbb0: 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45  .          "ORDE
bbc0: 52 20 42 59 20 70 6f 73 69 74 69 6f 6e 20 25 64  R BY position %d
bbd0: 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65   should be betwe
bbe0: 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a 20 20  en 1 and %d",.  
bbf0: 20 20 20 20 20 20 20 20 69 43 6f 6c 2c 20 6e 45          iCol, nE
bc00: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 45  xpr);.        nE
bc10: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72  rr++;.        br
bc20: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
bc30: 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d     iCol--;.    }
bc40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 53 65 6c 65  else{.      Sele
bc50: 63 74 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72  ct *p;.      for
bc60: 28 70 3d 70 53 65 6c 65 63 74 3b 20 70 3b 20 70  (p=pSelect; p; p
bc70: 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  =p->pPrior){.   
bc80: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
bc90: 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
bca0: 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  t;.        Expr 
bcb0: 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45  *pDup = sqlite3E
bcc0: 78 70 72 44 75 70 28 64 62 2c 20 70 45 29 3b 0a  xprDup(db, pE);.
bcd0: 0a 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  .        NameCon
bce0: 74 65 78 74 20 6e 63 3b 0a 0a 20 20 20 20 20 20  text nc;..      
bcf0: 20 20 6d 65 6d 73 65 74 28 26 6e 63 2c 20 30 2c    memset(&nc, 0,
bd00: 20 73 69 7a 65 6f 66 28 6e 63 29 29 3b 0a 20 20   sizeof(nc));.  
bd10: 20 20 20 20 20 20 6e 63 2e 70 50 61 72 73 65 20        nc.pParse 
bd20: 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  = pParse;.      
bd30: 20 20 6e 63 2e 70 53 72 63 4c 69 73 74 20 3d 20    nc.pSrcList = 
bd40: 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20  p->pSrc;.       
bd50: 20 6e 63 2e 70 45 4c 69 73 74 20 3d 20 70 45 4c   nc.pEList = pEL
bd60: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 6e 63 2e  ist;.        nc.
bd70: 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20  allowAgg = 1;.  
bd80: 20 20 20 20 20 20 6e 63 2e 6e 45 72 72 20 3d 20        nc.nErr = 
bd90: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  0;.        if( s
bda0: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
bdb0: 65 4e 61 6d 65 73 28 26 6e 63 2c 20 70 44 75 70  eNames(&nc, pDup
bdc0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
bdd0: 71 6c 69 74 65 33 45 72 72 6f 72 43 6c 65 61 72  qlite3ErrorClear
bde0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
bdf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
be00: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
be10: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
be20: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
be30: 30 2c 20 70 49 74 65 6d 3d 70 45 4c 69 73 74 2d  0, pItem=pEList-
be40: 3e 61 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45  >a; j<pEList->nE
be50: 78 70 72 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; j++, pItem+
be60: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
be70: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
be80: 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
be90: 78 70 72 2c 20 70 44 75 70 29 20 29 7b 0a 20 20  xpr, pDup) ){.  
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
beb0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 21  iCol>=0 && iCol!
bec0: 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
bed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
bee0: 6f 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20  orMsg(.         
bef0: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
bf00: 65 2c 20 22 4f 52 44 45 52 20 42 59 20 74 65 72  e, "ORDER BY ter
bf10: 6d 20 6e 75 6d 62 65 72 20 25 64 20 69 73 20 61  m number %d is a
bf20: 6d 62 69 67 75 6f 75 73 22 2c 20 69 2b 31 0a 20  mbiguous", i+1. 
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
bf40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
bf50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
bf60: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b         iCol = j;
bf70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
bf80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
bf90: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
bfa0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
bfb0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
bfc0: 44 75 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Dup);.      }.  
bfd0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 43 6f    }..    if( iCo
bfe0: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  l<0 ){.      sql
bff0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c000: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 4f 52  rse,.        "OR
c010: 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62  DER BY term numb
c020: 65 72 20 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d  er %d does not m
c030: 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20  atch any result 
c040: 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20  column", i+1);. 
c050: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c060: 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pE->op = TK_COLU
c070: 4d 4e 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 54  MN;.      pE->iT
c080: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
c090: 20 20 20 20 20 70 45 2d 3e 69 41 67 67 20 3d 20       pE->iAgg = 
c0a0: 2d 31 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 43  -1;.      pE->iC
c0b0: 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20  olumn = iCol;.  
c0c0: 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
c0d0: 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  i].done = 1;.   
c0e0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 50 61 72   }..    if( pPar
c0f0: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
c100: 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
c110: 3e 6e 45 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  >nErr;.    }.  }
c120: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
c130: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
c140: 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
c150: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
c160: 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
c170: 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
c180: 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
c190: 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
c1a0: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
c1b0: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
c1c0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
c1d0: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
c1e0: 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
c1f0: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64  in pParse..*/.Vd
c200: 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64  be *sqlite3GetVd
c210: 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  be(Parse *pParse
c220: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
c230: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
c240: 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
c250: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
c260: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  e = sqlite3VdbeC
c270: 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62  reate(pParse->db
c280: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
c290: 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  v;.}.../*.** Com
c2a0: 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20  pute the iLimit 
c2b0: 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c  and iOffset fiel
c2c0: 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ds of the SELECT
c2d0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
c2e0: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
c2f0: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  set expressions.
c300: 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66    pLimit and pOf
c310: 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78  fset hold the ex
c320: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
c330: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
c340: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
c350: 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65  tement after the
c360: 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
c370: 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20  T.** keywords.  
c380: 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65  Or NULL if those
c390: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d   keywords are om
c3a0: 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e  itted. iLimit an
c3b0: 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72  d iOffset .** ar
c3c0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65  e the integer me
c3d0: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75  mory register nu
c3e0: 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65  mbers for counte
c3f0: 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  rs used to compu
c400: 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74  te .** the limit
c410: 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
c420: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d   there is no lim
c430: 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74  it and/or offset
c440: 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69  , then .** iLimi
c450: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
c460: 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  e negative..**.*
c470: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
c480: 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
c490: 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20  s of iLimit and 
c4a0: 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a  iOffset only if.
c4b0: 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66  ** a limit or of
c4c0: 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20  fset is defined 
c4d0: 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  by pLimit and pO
c4e0: 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61  ffset.  iLimit a
c4f0: 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68  nd.** iOffset sh
c500: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
c510: 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72  reset to appropr
c520: 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c  iate default val
c530: 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20  ues.** (usually 
c540: 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d  but not always -
c550: 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  1) prior to call
c560: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
c570: 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69  ..** Only if pLi
c580: 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65  mit!=0 or pOffse
c590: 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69  t!=0 do the limi
c5a0: 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a  t registers get.
c5b0: 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54  ** redefined.  T
c5c0: 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
c5d0: 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20  rator uses this 
c5e0: 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63  property to forc
c5f0: 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f  e.** the reuse o
c600: 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74  f the same limit
c610: 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69   and offset regi
c620: 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c  sters across mul
c630: 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20  tiple.** SELECT 
c640: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
c650: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
c660: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
c670: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c680: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
c690: 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a  Break){.  Vdbe *
c6a0: 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69  v = 0;.  int iLi
c6b0: 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  mit = 0;.  int i
c6c0: 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64  Offset;.  int ad
c6d0: 64 72 31 2c 20 61 64 64 72 32 3b 0a 0a 20 20 2f  dr1, addr2;..  /
c6e0: 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d  * .  ** "LIMIT -
c6f0: 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20  1" always shows 
c700: 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65  all rows.  There
c710: 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f   is some.  ** co
c720: 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20  ntraversy about 
c730: 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  what the correct
c740: 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64   behavior should
c750: 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75   be..  ** The cu
c760: 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
c770: 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
c780: 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61  "LIMIT 0" to mea
c790: 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a  n.  ** no rows..
c7a0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c    */.  if( p->pL
c7b0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69  imit ){.    p->i
c7c0: 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d  Limit = iLimit =
c7d0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
c7e0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
c7f0: 2b 3d 20 32 3b 0a 20 20 20 20 76 20 3d 20 73 71  += 2;.    v = sq
c800: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
c810: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
c820: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
c830: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c840: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d  (pParse, p->pLim
c850: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
c860: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c870: 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29  MustBeInt, 0, 0)
c880: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c890: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
c8a0: 53 74 6f 72 65 2c 20 69 4c 69 6d 69 74 2c 20 31  Store, iLimit, 1
c8b0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
c8c0: 6e 74 28 28 76 2c 20 22 23 20 4c 49 4d 49 54 20  nt((v, "# LIMIT 
c8d0: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
c8e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c8f0: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f  (v, OP_IfMemZero
c900: 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  , iLimit, iBreak
c910: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c920: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
c930: 6d 4c 6f 61 64 2c 20 69 4c 69 6d 69 74 2c 20 30  mLoad, iLimit, 0
c940: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
c950: 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70  pOffset ){.    p
c960: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  ->iOffset = iOff
c970: 73 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  set = pParse->nM
c980: 65 6d 2b 2b 3b 0a 20 20 20 20 76 20 3d 20 73 71  em++;.    v = sq
c990: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
c9a0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
c9b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
c9c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c9d0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66  (pParse, p->pOff
c9e0: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
c9f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ca00: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30  _MustBeInt, 0, 0
ca10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
ca20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
ca30: 6d 53 74 6f 72 65 2c 20 69 4f 66 66 73 65 74 2c  mStore, iOffset,
ca40: 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 29 3b 0a   p->pLimit==0);.
ca50: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
ca60: 28 76 2c 20 22 23 20 4f 46 46 53 45 54 20 63 6f  (v, "# OFFSET co
ca70: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 61 64  unter"));.    ad
ca80: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
ca90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d  eAddOp(v, OP_IfM
caa0: 65 6d 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20  emPos, iOffset, 
cab0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
cac0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
cad0: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  op, 1, 0);.    s
cae0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
caf0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
cb00: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
cb10: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
cb20: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 69 66 28   addr1);.    if(
cb30: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
cb40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cb50: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 2c 20  ddOp(v, OP_Add, 
cb60: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
cb70: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
cb80: 20 29 7b 0a 20 20 20 20 61 64 64 72 31 20 3d 20   ){.    addr1 = 
cb90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cba0: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c  (v, OP_IfMemPos,
cbb0: 20 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20   iLimit, 0);.   
cbc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cbd0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
cbe0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
cbf0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
cc00: 65 6d 49 6e 74 2c 20 2d 31 2c 20 69 4c 69 6d 69  emInt, -1, iLimi
cc10: 74 2b 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20  t+1);.    addr2 
cc20: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
cc30: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
cc40: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
cc50: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
cc60: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c   addr1);.    sql
cc70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cc80: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4c   OP_MemStore, iL
cc90: 69 6d 69 74 2b 31 2c 20 31 29 3b 0a 20 20 20 20  imit+1, 1);.    
cca0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
ccb0: 22 23 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  "# LIMIT+OFFSET"
ccc0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
ccd0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
cce0: 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ddr2);.  }.}../*
ccf0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 76  .** Allocate a v
cd00: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20  irtual index to 
cd10: 75 73 65 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e  use for sorting.
cd20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cd30: 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64  createSortingInd
cd40: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
cd50: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 45 78 70  , Select *p, Exp
cd60: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 29  rList *pOrderBy)
cd70: 7b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  {.  if( pOrderBy
cd80: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
cd90: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
cda0: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
cdb0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 64 65  ==0 );.    pOrde
cdc0: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  rBy->iECursor = 
cdd0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
cde0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
cdf0: 65 33 56 64 62 65 41 64 64 4f 70 28 70 50 61 72  e3VdbeAddOp(pPar
ce00: 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4f 70  se->pVdbe, OP_Op
ce10: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
ce20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce30: 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42           pOrderB
ce40: 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72  y->iECursor, pOr
ce50: 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 29 3b  derBy->nExpr+1);
ce60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
ce70: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
ce80: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 70 2d 3e  == -1 );.    p->
ce90: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
cea0: 3d 20 61 64 64 72 3b 0a 20 20 7d 0a 7d 0a 0a 23  = addr;.  }.}..#
ceb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cec0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
ced0: 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  CT./*.** Return 
cee0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
cef0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
cf00: 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d  ce for the iCol-
cf10: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  th column of.** 
cf20: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66  the result set f
cf30: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d  or the compound-
cf40: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
cf50: 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55   "p".  Return NU
cf60: 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  LL if.** the col
cf70: 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75  umn has no defau
cf80: 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  lt collating seq
cf90: 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uence..**.** The
cfa0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
cfb0: 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  nce for the comp
cfc0: 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74  ound select is t
cfd0: 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  aken from the.**
cfe0: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20   left-most term 
cff0: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68  of the select th
d000: 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  at has a collati
d010: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
d020: 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a  static CollSeq *
d030: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
d040: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
d050: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
d060: 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65   iCol){.  CollSe
d070: 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70  q *pRet;.  if( p
d080: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
d090: 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65  pRet = multiSele
d0a0: 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
d0b0: 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f  , p->pPrior, iCo
d0c0: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
d0d0: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20   pRet = 0;.  }. 
d0e0: 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a   if( pRet==0 ){.
d0f0: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
d100: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
d110: 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  arse, p->pEList-
d120: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b  >a[iCol].pExpr);
d130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
d140: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  et;.}.#endif /* 
d150: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
d160: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
d170: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d180: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
d190: 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ECT./*.** This r
d1a0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
d1b0: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75   to process a qu
d1c0: 65 72 79 20 74 68 61 74 20 69 73 20 72 65 61 6c  ery that is real
d1d0: 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20  ly the union.** 
d1e0: 6f 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  or intersection 
d1f0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  of two or more s
d200: 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 2e  eparate queries.
d210: 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
d220: 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
d230: 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
d240: 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
d250: 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
d260: 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
d270: 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
d280: 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
d290: 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
d2a0: 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
d2b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
d2c0: 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
d2d0: 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
d2e0: 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
d2f0: 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
d300: 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
d310: 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
d320: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
d330: 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
d340: 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
d350: 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
d360: 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
d370: 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
d380: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
d390: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
d3a0: 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
d3b0: 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
d3c0: 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
d3d0: 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
d3e0: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
d3f0: 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
d400: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
d410: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
d420: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
d430: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
d440: 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
d450: 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
d460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
d470: 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
d480: 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
d490: 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
d4a0: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
d4b0: 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
d4c0: 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
d4d0: 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
d4e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
d4f0: 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
d500: 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
d510: 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
d520: 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
d530: 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
d540: 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
d550: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
d560: 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
d570: 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
d580: 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
d590: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
d5a0: 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
d5b0: 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
d5c0: 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
d5d0: 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
d5e0: 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
d5f0: 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
d600: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d610: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
d620: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
d630: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
d640: 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
d650: 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
d660: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
d670: 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20  eDest,          
d680: 20 20 2f 2a 20 5c 5f 5f 5f 20 20 53 74 6f 72 65    /* \___  Store
d690: 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 61   query results a
d6a0: 73 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 20  s specified */. 
d6b0: 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20   int iParm,     
d6c0: 20 20 20 20 20 20 20 2f 2a 20 2f 20 20 20 20 20         /* /     
d6d0: 62 79 20 74 68 65 73 65 20 74 77 6f 20 70 61 72  by these two par
d6e0: 61 6d 65 74 65 72 73 2e 20 20 20 20 20 20 20 20  ameters.        
d6f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20   */.  char *aff 
d700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
d710: 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55  f eDest is SRT_U
d720: 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69  nion, the affini
d730: 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
d740: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d750: 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65  E_OK;   /* Succe
d760: 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73  ss code from a s
d770: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53  ubroutine */.  S
d780: 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
d790: 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
d7a0: 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
d7b0: 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
d7c0: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
d7d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
d7e0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
d7f0: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
d800: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
d810: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d820: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
d830: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45  esult set */.  E
d840: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
d850: 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y;   /* The ORDE
d860: 52 20 42 59 20 63 6c 61 75 73 65 20 6f 6e 20 70  R BY clause on p
d870: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 65 74 50 32   */.  int aSetP2
d880: 5b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  [2];        /* S
d890: 65 74 20 50 32 20 76 61 6c 75 65 20 6f 66 20 74  et P2 value of t
d8a0: 68 65 73 65 20 6f 70 20 74 6f 20 6e 75 6d 62 65  hese op to numbe
d8b0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  r of columns */.
d8c0: 20 20 69 6e 74 20 6e 53 65 74 50 32 20 3d 20 30    int nSetP2 = 0
d8d0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
d8e0: 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61 53  r of slots in aS
d8f0: 65 74 50 32 5b 5d 20 75 73 65 64 20 2a 2f 0a 0a  etP2[] used */..
d900: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
d910: 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
d920: 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61   BY or LIMIT cla
d930: 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c  use on prior SEL
d940: 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a  ECTs.  Only.  **
d950: 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74   the last (right
d960: 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e  -most) SELECT in
d970: 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
d980: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
d990: 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a   or LIMIT..  */.
d9a0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d    if( p==0 || p-
d9b0: 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
d9c0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
d9d0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
d9e0: 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f  end;.  }.  pPrio
d9f0: 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
da00: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
da10: 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72  >pRightmost!=pPr
da20: 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ior );.  assert(
da30: 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
da40: 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f  ost==p->pRightmo
da50: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 50 72 69  st );.  if( pPri
da60: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
da70: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
da80: 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45  Msg(pParse,"ORDE
da90: 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75  R BY clause shou
daa0: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
dab0: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
dac0: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
dad0: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
dae0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
daf0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
db00: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f  .  }.  if( pPrio
db10: 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  r->pLimit ){.   
db20: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
db30: 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63  (pParse,"LIMIT c
db40: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
db50: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
db60: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
db70: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
db80: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
db90: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
dba0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
dbb0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
dbc0: 65 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 71  e have a valid q
dbd0: 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66  uery engine.  If
dbe0: 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e   not, create a n
dbf0: 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76  ew one..  */.  v
dc00: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
dc10: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
dc20: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20   v==0 ){.    rc 
dc30: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
dc40: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
dc50: 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65    }..  /* Create
dc60: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
dc70: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
dc80: 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
dc90: 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
dca0: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
dcb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
dcc0: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 61 73 73  EList );.    ass
dcd0: 65 72 74 28 20 6e 53 65 74 50 32 3c 73 69 7a 65  ert( nSetP2<size
dce0: 6f 66 28 61 53 65 74 50 32 29 2f 73 69 7a 65 6f  of(aSetP2)/sizeo
dcf0: 66 28 61 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a  f(aSetP2[0]) );.
dd00: 20 20 20 20 61 53 65 74 50 32 5b 6e 53 65 74 50      aSetP2[nSetP
dd10: 32 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64  2++] = sqlite3Vd
dd20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
dd30: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 50 61  enEphemeral, iPa
dd40: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44 65 73  rm, 0);.    eDes
dd50: 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
dd60: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
dd70: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
dd80: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
dd90: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
dda0: 0a 20 20 2a 2f 0a 20 20 70 4f 72 64 65 72 42 79  .  */.  pOrderBy
ddb0: 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
ddc0: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
ddd0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
dde0: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  LL: {.      if( 
ddf0: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
de00: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
de10: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 73 73  = 0;.        ass
de20: 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c  ert( !pPrior->pL
de30: 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20  imit );.        
de40: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
de50: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
de60: 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66      pPrior->pOff
de70: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
de80: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
de90: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
dea0: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65  rse, pPrior, eDe
deb0: 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c  st, iParm, 0, 0,
dec0: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
ded0: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
dee0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  .        p->pOff
def0: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  set = 0;.       
df00: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
df10: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
df20: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
df30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
df40: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
df50: 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
df60: 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
df70: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  .        p->iOff
df80: 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f  set = pPrior->iO
df90: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69  ffset;.        i
dfa0: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20  f( p->iLimit>=0 
dfb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
dfc0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
dfd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  ddOp(v, OP_IfMem
dfe0: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
dff0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56   0);.          V
e000: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
e010: 23 20 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20  # Jump ahead if 
e020: 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29  LIMIT reached"))
e030: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e040: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e050: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
e060: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
e070: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
e080: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
e090: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
e0a0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
e0b0: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
e0c0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
e0d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e0e0: 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20  if( addr ){.    
e0f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e100: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
e110: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
e120: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e130: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f     }.      /* Fo
e140: 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20  r UNION ALL ... 
e150: 4f 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68  ORDER BY fall th
e160: 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
e170: 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  t case */.    }.
e180: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
e190: 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  PT:.    case TK_
e1a0: 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  UNION: {.      i
e1b0: 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20  nt unionTab;    
e1c0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
e1d0: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
e1e0: 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  y table holding 
e1f0: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
e200: 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20 20 20  int op = 0;     
e210: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53   /* One of the S
e220: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  RT_ operations t
e230: 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20  o apply to self 
e240: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69  */.      int pri
e250: 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  orOp;     /* The
e260: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20   SRT_ operation 
e270: 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f  to apply to prio
e280: 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20  r selects */.   
e290: 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
e2a0: 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61   *pOffset; /* Sa
e2b0: 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d  ved values of p-
e2c0: 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e  >nLimit and p->n
e2d0: 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  Offset */.      
e2e0: 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20  int addr;..     
e2f0: 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70   priorOp = p->op
e300: 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54  ==TK_ALL ? SRT_T
e310: 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e  able : SRT_Union
e320: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
e330: 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70 4f  t==priorOp && pO
e340: 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21 70 2d  rderBy==0 && !p-
e350: 3e 70 4c 69 6d 69 74 20 26 26 20 21 70 2d 3e 70  >pLimit && !p->p
e360: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
e370: 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73    /* We can reus
e380: 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  e a temporary ta
e390: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ble generated by
e3a0: 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72   a SELECT to our
e3b0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68  .        ** righ
e3c0: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
e3d0: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
e3e0: 20 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65   iParm;.      }e
e3f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
e400: 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
e410: 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
e420: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
e430: 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
e440: 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61     ** intermedia
e450: 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20  te results..    
e460: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
e470: 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65  nionTab = pParse
e480: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
e490: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
e4a0: 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  & matchOrderbyTo
e4b0: 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
e4c0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f  , pOrderBy, unio
e4d0: 6e 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  nTab) ){.       
e4e0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
e4f0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
e500: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
e510: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
e520: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
e530: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
e540: 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e  Ephemeral, union
e550: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
e560: 20 69 66 28 20 70 72 69 6f 72 4f 70 3d 3d 53 52   if( priorOp==SR
e570: 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  T_Table ){.     
e580: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 65       assert( nSe
e590: 74 50 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50  tP2<sizeof(aSetP
e5a0: 32 29 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32  2)/sizeof(aSetP2
e5b0: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20  [0]) );.        
e5c0: 20 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b    aSetP2[nSetP2+
e5d0: 2b 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  +] = addr;.     
e5e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e5f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
e600: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
e610: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  = -1 );.        
e620: 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
e630: 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
e640: 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74         p->pRight
e650: 6d 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d  most->usesEphm =
e660: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
e670: 20 20 20 20 20 20 63 72 65 61 74 65 53 6f 72 74        createSort
e680: 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ingIndex(pParse,
e690: 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20   p, pOrderBy);. 
e6a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e6b0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
e6c0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
e6d0: 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
e6e0: 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
e6f0: 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  left.      */.  
e700: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
e710: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b  ior->pOrderBy );
e720: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e730: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
e740: 2c 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f  , pPrior, priorO
e750: 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20  p, unionTab, 0, 
e760: 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20  0, 0, aff);.    
e770: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
e780: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
e790: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
e7a0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
e7b0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
e7c0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
e7d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77       */.      sw
e7e0: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
e7f0: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
e800: 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52  EXCEPT:  op = SR
e810: 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65 61  T_Except;   brea
e820: 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  k;.         case
e830: 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20   TK_UNION:   op 
e840: 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20  = SRT_Union;    
e850: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
e860: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
e870: 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b   op = SRT_Table;
e880: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e890: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
e8a0: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  or = 0;.      p-
e8b0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
e8c0: 20 20 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f 77       p->disallow
e8d0: 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
e8e0: 42 79 21 3d 30 3b 0a 20 20 20 20 20 20 70 4c 69  By!=0;.      pLi
e8f0: 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
e900: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
e910: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
e920: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
e930: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
e940: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  et = 0;.      rc
e950: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
e960: 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20  (pParse, p, op, 
e970: 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20  unionTab, 0, 0, 
e980: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 2f  0, aff);.      /
e990: 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69  * Query flatteni
e9a0: 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ng in sqlite3Sel
e9b0: 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69  ect() might refi
e9c0: 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a  ll p->pOrderBy..
e9d0: 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
e9e0: 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
e9f0: 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
ea00: 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
ea10: 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
ea20: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
ea30: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72  istDelete(p->pOr
ea40: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 2d  derBy);.      p-
ea50: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
ea60: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
ea70: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
ea80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ea90: 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69  rDelete(p->pLimi
eaa0: 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
eab0: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
eac0: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
ead0: 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   pOffset;.      
eae0: 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a  p->iLimit = -1;.
eaf0: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
eb00: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28   = -1;.      if(
eb10: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
eb20: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
eb30: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a  _end;.      }...
eb40: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
eb50: 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   the data in the
eb60: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
eb70: 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
eb80: 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  orm.      ** it 
eb90: 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
eba0: 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
ebb0: 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20   */      .      
ebc0: 69 66 28 20 65 44 65 73 74 21 3d 70 72 69 6f 72  if( eDest!=prior
ebd0: 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d  Op || unionTab!=
ebe0: 69 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  iParm ){.       
ebf0: 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
ec00: 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
ec10: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
ec20: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  EList );.       
ec30: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
ec40: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
ec50: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
ec60: 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
ec70: 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
ec80: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
ec90: 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
eca0: 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67  ior;.          g
ecb0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
ecc0: 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
ecd0: 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
ece0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ecf0: 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
ed00: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
ed10: 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74  );.        iCont
ed20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
ed30: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
ed40: 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
ed50: 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
ed60: 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , p, iBreak);.  
ed70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ed80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
ed90: 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
eda0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
edb0: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
edc0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
edd0: 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  v);.        rc =
ede0: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
edf0: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
ee00: 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  EList, unionTab,
ee10: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
ee20: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee40: 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44  pOrderBy, -1, eD
ee50: 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20  est, iParm, .   
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee70: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c            iCont,
ee80: 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20   iBreak, 0);.   
ee90: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
eea0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
eeb0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
eec0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
eed0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
eee0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
eef0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
ef00: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
ef10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ef20: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
ef30: 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20  nTab, iStart);. 
ef40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ef50: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
ef60: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
ef70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ef80: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
ef90: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
efa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
efb0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
efc0: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
efd0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62   {.      int tab
efe0: 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69  1, tab2;.      i
eff0: 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
f000: 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
f010: 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
f020: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e  Offset;.      in
f030: 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 2f  t addr;..      /
f040: 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64  * INTERSECT is d
f050: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
f060: 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69  e others since i
f070: 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
f080: 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72   ** two temporar
f090: 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65  y tables.  Hence
f0a0: 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20   it has its own 
f0b0: 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20  case.  Begin.   
f0c0: 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
f0d0: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
f0e0: 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
f0f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31     */.      tab1
f100: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
f110: 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20  +;.      tab2 = 
f120: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
f130: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
f140: 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72  By && matchOrder
f150: 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  byToColumn(pPars
f160: 65 2c 70 2c 70 4f 72 64 65 72 42 79 2c 74 61 62  e,p,pOrderBy,tab
f170: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
f180: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
f190: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f1a0: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
f1b0: 20 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67     createSorting
f1c0: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c  Index(pParse, p,
f1d0: 20 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20 20   pOrderBy);..   
f1e0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
f1f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f200: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
f210: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
f220: 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
f230: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
f240: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
f250: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61  rOpenEphm[0] = a
f260: 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52  ddr;.      p->pR
f270: 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70  ightmost->usesEp
f280: 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73  hm = 1;.      as
f290: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
f2a0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
f2b0: 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
f2c0: 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
f2d0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
f2e0: 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  tab1"..      */.
f2f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f300: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
f310: 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69   pPrior, SRT_Uni
f320: 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c 20  on, tab1, 0, 0, 
f330: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69  0, aff);.      i
f340: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
f350: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
f360: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
f370: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
f380: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
f390: 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  T into temporary
f3a0: 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20   table "tab2".  
f3b0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
f3c0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
f3d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  ddOp(v, OP_OpenE
f3e0: 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
f3f0: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
f400: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
f410: 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[1] == -1 );.  
f420: 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
f430: 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
f440: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
f450: 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
f460: 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
f470: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
f480: 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
f490: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
f4a0: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
f4b0: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
f4c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
f4d0: 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69  arse, p, SRT_Uni
f4e0: 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c 20  on, tab2, 0, 0, 
f4f0: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70  0, aff);.      p
f500: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
f510: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
f520: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
f530: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
f540: 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
f550: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
f560: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
f570: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
f580: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
f590: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
f5a0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
f5b0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
f5c0: 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
f5d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
f5e0: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
f5f0: 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
f600: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
f610: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
f620: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
f630: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
f640: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
f650: 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
f660: 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
f670: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
f680: 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
f690: 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e  ior;.        gen
f6a0: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
f6b0: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
f6c0: 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
f6d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61     }.      iBrea
f6e0: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
f6f0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
f700: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
f710: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
f720: 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74  v);.      comput
f730: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
f740: 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
f750: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
f760: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f770: 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
f780: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 69 53  Break);.      iS
f790: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
f7a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
f7b0: 77 4b 65 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a  wKey, tab1, 0);.
f7c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f7d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
f7e0: 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f  Found, tab2, iCo
f7f0: 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  nt);.      rc = 
f800: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
f810: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
f820: 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70  List, tab1, p->p
f830: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
f860: 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  rBy, -1, eDest, 
f870: 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20  iParm, .        
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65       iCont, iBre
f8a0: 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ak, 0);.      if
f8b0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
f8c0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
f8d0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
f8e0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
f8f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f900: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
f910: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  iCont);.      sq
f920: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f930: 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c  , OP_Next, tab1,
f940: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
f950: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
f960: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
f970: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
f980: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f990: 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
f9a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f9b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
f9c0: 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
f9d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f9e0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
f9f0: 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43  e sure all SELEC
fa00: 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  Ts in the statem
fa10: 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ent have the sam
fa20: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
fa30: 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ents.  ** in the
fa40: 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ir result sets..
fa50: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
fa60: 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69  ->pEList && pPri
fa70: 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20  or->pEList );.  
fa80: 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
fa90: 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45  Expr!=pPrior->pE
faa0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
fab0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
fac0: 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
fad0: 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
fae0: 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
faf0: 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20  .      " do not 
fb00: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
fb10: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
fb20: 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f  olumns", selectO
fb30: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
fb40: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
fb50: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
fb60: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
fb70: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
fb80: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 65 6d  f columns in tem
fb90: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 0a 20 20  porary tables.  
fba0: 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70  */.  nCol = p->p
fbb0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
fbc0: 77 68 69 6c 65 28 20 6e 53 65 74 50 32 20 29 7b  while( nSetP2 ){
fbd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fbe0: 43 68 61 6e 67 65 50 32 28 76 2c 20 61 53 65 74  ChangeP2(v, aSet
fbf0: 50 32 5b 2d 2d 6e 53 65 74 50 32 5d 2c 20 6e 43  P2[--nSetP2], nC
fc00: 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ol);.  }..  /* C
fc10: 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67  ompute collating
fc20: 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20   sequences used 
fc30: 62 79 20 65 69 74 68 65 72 20 74 68 65 20 4f 52  by either the OR
fc40: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
fc50: 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20 74 65 6d  .  ** by any tem
fc60: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
fc70: 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
fc80: 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
fc90: 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
fca0: 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
fcb0: 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
fcc0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
fcd0: 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 0a 20 20  .  Invoke the.  
fce0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 70 72 6f 63  ** ORDER BY proc
fcf0: 65 73 73 69 6e 67 20 69 66 20 74 68 65 72 65 20  essing if there 
fd00: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
fd10: 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
fd20: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
fd30: 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68   run by the righ
fd40: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
fd50: 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20  atement only..  
fd60: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
fd70: 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ents to the left
fd80: 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69   always skip thi
fd90: 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67  s part.  The rig
fda0: 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c  ht-most.  ** SEL
fdb0: 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73  ECT might also s
fdc0: 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66  kip this part if
fdd0: 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52   it has no ORDER
fde0: 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20   BY clause and. 
fdf0: 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c   ** no temp tabl
fe00: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  es are required.
fe10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
fe20: 65 72 42 79 20 7c 7c 20 70 2d 3e 75 73 65 73 45  erBy || p->usesE
fe30: 70 68 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  phm ){.    int i
fe40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fe50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
fe60: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
fe70: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
fe80: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
fe90: 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
fea0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75  nce for the resu
feb0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65  lt set */.    Se
fec0: 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  lect *pLoop;    
fed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
fee0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
fef0: 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  gh SELECT statem
ff00: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ents */.    int 
ff10: 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20  nKeyCol;        
ff20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ff30: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
ff40: 6e 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  n pKeyInfo->aCol
ff50: 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65  [] */.    CollSe
ff60: 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20  q **apColl;     
ff70: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
ff80: 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70  ooping through p
ff90: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d  KeyInfo->aColl[]
ffa0: 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
ffb0: 2a 2a 61 43 6f 70 79 3b 20 20 20 20 20 20 20 20  **aCopy;        
ffc0: 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20        /* A copy 
ffd0: 6f 66 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  of pKeyInfo->aCo
ffe0: 6c 6c 5b 5d 20 2a 2f 0a 0a 20 20 20 20 61 73 73  ll[] */..    ass
fff0: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f  ert( p->pRightmo
10000 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 4b 65  st==p );.    nKe
10010 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2b 20 28 70  yCol = nCol + (p
10020 4f 72 64 65 72 42 79 20 3f 20 70 4f 72 64 65 72  OrderBy ? pOrder
10030 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  By->nExpr : 0);.
10040 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
10050 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
10060 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  ro(pParse->db,. 
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10080 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b        sizeof(*pK
10090 65 79 49 6e 66 6f 29 2b 6e 4b 65 79 43 6f 6c 2a  eyInfo)+nKeyCol*
100a0 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
100b0 29 20 2b 20 31 29 29 3b 0a 20 20 20 20 69 66 28  ) + 1));.    if(
100c0 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
100d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
100e0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
100f0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
10100 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  nd;.    }..    p
10110 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45  KeyInfo->enc = E
10120 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  NC(pParse->db);.
10130 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46      pKeyInfo->nF
10140 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20  ield = nCol;..  
10150 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c    for(i=0, apCol
10160 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  l=pKeyInfo->aCol
10170 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
10180 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20  apColl++){.     
10190 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69   *apColl = multi
101a0 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
101b0 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
101c0 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c     if( 0==*apCol
101d0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70  l ){.        *ap
101e0 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
101f0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
10200 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
10210 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
10220 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
10230 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
10240 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
10250 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
10260 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61   addr = pLoop->a
10270 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a  ddrOpenEphm[i];.
10280 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72          if( addr
10290 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
102a0 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75  /* If [0] is unu
102b0 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20  sed then [1] is 
102c0 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f  also unused.  So
102d0 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20   we can.        
102e0 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65    ** always safe
102f0 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e  ly abort as soon
10300 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e   as the first un
10310 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75  used slot is fou
10320 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
10330 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
10340 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30  ddrOpenEphm[1]<0
10350 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   );.          br
10360 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
10370 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10380 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
10390 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  dr, nCol);.     
103a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
103b0 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
103c0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
103d0 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P3_KEYINFO);.  
103e0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64        pLoop->add
103f0 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d  rOpenEphm[i] = -
10400 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
10410 0a 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  ..    if( pOrder
10420 42 79 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  By ){.      stru
10430 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
10440 20 2a 70 4f 54 65 72 6d 20 3d 20 70 4f 72 64 65   *pOTerm = pOrde
10450 72 42 79 2d 3e 61 3b 0a 20 20 20 20 20 20 69 6e  rBy->a;.      in
10460 74 20 6e 4f 72 64 65 72 42 79 45 78 70 72 20 3d  t nOrderByExpr =
10470 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
10480 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
10490 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 53 6f 72  ;.      u8 *pSor
104a0 74 4f 72 64 65 72 3b 0a 0a 20 20 20 20 20 20 2f  tOrder;..      /
104b0 2a 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65  * Reuse the same
104c0 20 70 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68   pKeyInfo for th
104d0 65 20 4f 52 44 45 52 20 42 59 20 61 73 20 77 61  e ORDER BY as wa
104e0 73 20 75 73 65 64 20 61 62 6f 76 65 20 66 6f 72  s used above for
104f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
10500 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 73 74  mpound select st
10510 61 74 65 6d 65 6e 74 73 2e 20 20 45 78 63 65 70  atements.  Excep
10520 74 20 77 65 20 68 61 76 65 20 74 6f 20 63 68 61  t we have to cha
10530 6e 67 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20  nge out the.    
10540 20 20 2a 2a 20 70 4b 65 79 49 6e 66 6f 2d 3e 61    ** pKeyInfo->a
10550 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65 73 2e 20 20  Coll[] values.  
10560 53 6f 6d 65 20 6f 66 20 74 68 65 20 61 43 6f 6c  Some of the aCol
10570 6c 5b 5d 20 76 61 6c 75 65 73 20 77 69 6c 6c 20  l[] values will 
10580 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 75 73  be.      ** reus
10590 65 64 20 77 68 65 6e 20 63 6f 6e 73 74 72 75 63  ed when construc
105a0 74 69 6e 67 20 74 68 65 20 70 4b 65 79 49 6e 66  ting the pKeyInf
105b0 6f 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20  o for the ORDER 
105c0 42 59 2c 20 73 6f 20 6d 61 6b 65 0a 20 20 20 20  BY, so make.    
105d0 20 20 2a 2a 20 61 20 63 6f 70 79 2e 20 20 53 75    ** a copy.  Su
105e0 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
105f0 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 20  o hold both the 
10600 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 66 6f 72  nCol entries for
10610 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
10620 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 61 6e  mpound select an
10630 64 20 74 68 65 20 6e 4f 72 64 65 72 62 79 45 78  d the nOrderbyEx
10640 70 72 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  pr entries for t
10650 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20  he ORDER BY.    
10660 20 20 2a 2a 20 77 61 73 20 61 6c 6c 6f 63 61 74    ** was allocat
10670 65 64 20 61 62 6f 76 65 2e 20 20 42 75 74 20 77  ed above.  But w
10680 65 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 74  e need to move t
10690 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
106a0 63 74 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74 72  ct.      ** entr
106b0 69 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 77  ies out of the w
106c0 61 79 20 62 65 66 6f 72 65 20 63 6f 6e 73 74 72  ay before constr
106d0 75 63 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52  ucting the ORDER
106e0 20 42 59 20 65 6e 74 72 69 65 73 2e 0a 20 20 20   BY entries..   
106f0 20 20 20 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63     ** Move the c
10700 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 65  ompound select e
10710 6e 74 72 69 65 73 20 69 6e 74 6f 20 61 43 6f 70  ntries into aCop
10720 79 5b 5d 20 77 68 65 72 65 20 74 68 65 79 20 63  y[] where they c
10730 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 61  an be.      ** a
10740 63 63 65 73 73 65 64 20 61 6e 64 20 72 65 75 73  ccessed and reus
10750 65 64 20 77 68 65 6e 20 63 6f 6e 73 74 72 75 63  ed when construc
10760 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
10770 59 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  Y entries..     
10780 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 43 6f 6c   ** Because nCol
10790 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65   might be greate
107a0 72 20 74 68 61 6e 20 6f 72 20 6c 65 73 73 20 74  r than or less t
107b0 68 61 6e 20 6e 4f 72 64 65 72 42 79 45 78 70 72  han nOrderByExpr
107c0 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 68 61 76  .      ** we hav
107d0 65 20 74 6f 20 75 73 65 20 6d 65 6d 6d 6f 76 65  e to use memmove
107e0 28 29 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  () when doing th
107f0 65 20 63 6f 70 79 2e 0a 20 20 20 20 20 20 2a 2f  e copy..      */
10800 0a 20 20 20 20 20 20 61 43 6f 70 79 20 3d 20 26  .      aCopy = &
10810 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
10820 6e 4f 72 64 65 72 42 79 45 78 70 72 5d 3b 0a 20  nOrderByExpr];. 
10830 20 20 20 20 20 70 53 6f 72 74 4f 72 64 65 72 20       pSortOrder 
10840 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  = pKeyInfo->aSor
10850 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 61  tOrder = (u8*)&a
10860 43 6f 70 79 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20  Copy[nCol];.    
10870 20 20 6d 65 6d 6d 6f 76 65 28 61 43 6f 70 79 2c    memmove(aCopy,
10880 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
10890 2c 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f  , nCol*sizeof(Co
108a0 6c 6c 53 65 71 2a 29 29 3b 0a 0a 20 20 20 20 20  llSeq*));..     
108b0 20 61 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   apColl = pKeyIn
108c0 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a 20 20 20 20 20  fo->aColl;.     
108d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
108e0 65 72 42 79 45 78 70 72 3b 20 69 2b 2b 2c 20 70  erByExpr; i++, p
108f0 4f 54 65 72 6d 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  OTerm++, apColl+
10900 2b 2c 20 70 53 6f 72 74 4f 72 64 65 72 2b 2b 29  +, pSortOrder++)
10910 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
10920 70 45 78 70 72 20 3d 20 70 4f 54 65 72 6d 2d 3e  pExpr = pOTerm->
10930 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
10940 66 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  f( (pExpr->flags
10950 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
10960 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
10970 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 43  ssert( pExpr->pC
10980 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  oll!=0 );.      
10990 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 45      *apColl = pE
109a0 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  xpr->pColl;.    
109b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
109c0 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 61       *apColl = a
109d0 43 6f 70 79 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  Copy[pExpr->iCol
109e0 75 6d 6e 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  umn];.        }.
109f0 20 20 20 20 20 20 20 20 2a 70 53 6f 72 74 4f 72          *pSortOr
10a00 64 65 72 20 3d 20 70 4f 54 65 72 6d 2d 3e 73 6f  der = pOTerm->so
10a10 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d  rtOrder;.      }
10a20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10a30 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20  ->pRightmost==p 
10a40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10a50 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
10a60 5b 32 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  [2]>=0 );.      
10a70 61 64 64 72 20 3d 20 70 2d 3e 61 64 64 72 4f 70  addr = p->addrOp
10a80 65 6e 45 70 68 6d 5b 32 5d 3b 0a 20 20 20 20 20  enEphm[2];.     
10a90 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
10aa0 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 70 2d  geP2(v, addr, p-
10ab0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
10ac0 2b 32 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  +2);.      pKeyI
10ad0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4f  nfo->nField = nO
10ae0 72 64 65 72 42 79 45 78 70 72 3b 0a 20 20 20 20  rderByExpr;.    
10af0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
10b00 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28  ngeP3(v, addr, (
10b10 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
10b20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
10b30 46 46 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  FF);.      pKeyI
10b40 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 67  nfo = 0;.      g
10b50 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
10b60 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d  pParse, p, v, p-
10b70 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
10b80 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20  eDest, iParm);. 
10b90 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
10ba0 33 5f 66 72 65 65 28 70 4b 65 79 49 6e 66 6f 29  3_free(pKeyInfo)
10bb0 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c  ;.  }..multi_sel
10bc0 65 63 74 5f 65 6e 64 3a 0a 20 20 72 65 74 75 72  ect_end:.  retur
10bd0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
10be0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
10bf0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
10c00 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10c10 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 20 46 6f  _OMIT_VIEW./* Fo
10c20 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f  rward Declaratio
10c30 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ns */.static voi
10c40 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
10c50 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69  sqlite3*, ExprLi
10c60 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  st*, int, ExprLi
10c70 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
10c80 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71  d substSelect(sq
10c90 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a  lite3*, Select *
10ca0 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20  , int, ExprList 
10cb0 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  *);../*.** Scan 
10cc0 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
10cd0 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
10ce0 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
10cf0 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
10d00 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
10d10 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
10d20 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
10d30 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
10d40 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
10d50 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
10d60 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
10d70 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
10d80 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
10d90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10da0 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
10db0 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
10dc0 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
10dd0 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
10de0 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
10df0 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
10e00 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
10e10 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
10e20 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
10e30 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
10e40 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
10e50 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
10e60 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
10e70 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
10e80 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65  ne make the nece
10e90 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
10ea0 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
10eb0 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
10ec0 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
10ed0 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
10ee0 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
10ef0 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
10f00 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
10f10 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
10f20 69 64 20 73 75 62 73 74 45 78 70 72 28 0a 20 20  id substExpr(.  
10f30 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
10f40 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
10f50 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74  lloc errors to t
10f60 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  his connection *
10f70 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
10f80 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20          /* Expr 
10f90 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74  in which substit
10fa0 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a  ution occurs */.
10fb0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
10fc0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
10fd0 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
10fe0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
10ff0 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62  pEList    /* Sub
11000 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73 69  stitute expressi
11010 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ons */.){.  if( 
11020 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
11030 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
11040 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
11050 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
11060 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66  iTable ){.    if
11070 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
11080 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  <0 ){.      pExp
11090 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b  r->op = TK_NULL;
110a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
110b0 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
110c0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
110d0 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  st!=0 && pExpr->
110e0 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e  iColumn<pEList->
110f0 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
11100 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
11110 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
11120 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45  >pRight==0 && pE
11130 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b  xpr->pList==0 );
11140 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 45  .      pNew = pE
11150 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69  List->a[pExpr->i
11160 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20  Column].pExpr;. 
11170 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
11180 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  w!=0 );.      pE
11190 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e  xpr->op = pNew->
111a0 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  op;.      assert
111b0 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
111c0 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
111d0 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
111e0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65  3ExprDup(db, pNe
111f0 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  w->pLeft);.     
11200 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
11210 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
11220 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
11230 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
11240 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 52 69 67  p(db, pNew->pRig
11250 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ht);.      asser
11260 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d  t( pExpr->pList=
11270 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
11280 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  r->pList = sqlit
11290 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
112a0 2c 20 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a  , pNew->pList);.
112b0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
112c0 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62  ble = pNew->iTab
112d0 6c 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  le;.      pExpr-
112e0 3e 70 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54  >pTab = pNew->pT
112f0 61 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  ab;.      pExpr-
11300 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d  >iColumn = pNew-
11310 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
11320 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e  pExpr->iAgg = pN
11330 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20  ew->iAgg;.      
11340 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
11350 28 64 62 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b  (db, &pExpr->tok
11360 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e  en, &pNew->token
11370 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11380 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70  TokenCopy(db, &p
11390 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65  Expr->span, &pNe
113a0 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20  w->span);.      
113b0 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d  pExpr->pSelect =
113c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
113d0 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 53 65 6c  p(db, pNew->pSel
113e0 65 63 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70  ect);.      pExp
113f0 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d  r->flags = pNew-
11400 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
11410 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74  }else{.    subst
11420 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
11430 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
11440 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
11450 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
11460 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c  >pRight, iTable,
11470 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75   pEList);.    su
11480 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45  bstSelect(db, pE
11490 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54  xpr->pSelect, iT
114a0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
114b0 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
114c0 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  (db, pExpr->pLis
114d0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
114e0 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
114f0 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
11500 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist(.  sqlite3 *
11510 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
11520 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
11530 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78  ors here */.  Ex
11540 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
11550 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
11560 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
11570 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
11580 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  tes */.  int iTa
11590 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
115a0 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
115b0 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
115c0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
115d0 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
115e0 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
115f0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
11600 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
11610 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
11620 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
11630 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64  .    substExpr(d
11640 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  b, pList->a[i].p
11650 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  Expr, iTable, pE
11660 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
11670 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
11680 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20  lect(.  sqlite3 
11690 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
116a0 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
116b0 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53  rors here */.  S
116c0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
116d0 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
116e0 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68  atement in which
116f0 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
11700 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  utions */.  int 
11710 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
11720 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
11730 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78  replaced */.  Ex
11740 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
11750 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
11760 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
11770 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
11780 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
11790 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
117a0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
117b0 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
117c0 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
117d0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
117e0 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
117f0 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  st(db, p->pOrder
11800 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
11810 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
11820 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
11830 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
11840 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 64 62  ;.  substExpr(db
11850 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61  , p->pWhere, iTa
11860 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
11870 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
11880 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c  p->pPrior, iTabl
11890 65 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65  e, pEList);.}.#e
118a0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
118b0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
118c0 57 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  W) */..#ifndef S
118d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
118e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
118f0 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
11900 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
11910 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70  s in order to sp
11920 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  eed.** execution
11930 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20  .  It returns 1 
11940 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
11950 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
11960 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63  flattening.** oc
11970 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75  curs..**.** To u
11980 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f  nderstand the co
11990 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e  ncept of flatten
119a0 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  ing, consider th
119b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71  e following.** q
119c0 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
119d0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53  SELECT a FROM (S
119e0 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
119f0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
11a00 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a  00) WHERE a>5.**
11a10 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
11a20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
11a30 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69  ing this query i
11a40 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
11a50 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72  .** subquery fir
11a60 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  st and store the
11a70 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65   results in a te
11a80 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
11a90 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f  hen.** run the o
11aa0 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68  uter query on th
11ab0 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  at temporary tab
11ac0 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72  le.  This requir
11ad0 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73  es two.** passes
11ae0 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20   over the data. 
11af0 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65   Furthermore, be
11b00 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72  cause the tempor
11b10 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73  ary table.** has
11b20 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65   no indices, the
11b30 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e   WHERE clause on
11b40 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11b50 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70   cannot be.** op
11b60 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  timized..**.** T
11b70 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
11b80 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20  mpts to rewrite 
11b90 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
11ba0 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a  the above into.*
11bb0 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  * a single flat 
11bc0 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69  select, like thi
11bd0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
11be0 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
11bf0 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
11c00 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54   AND a>5.**.** T
11c10 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
11c20 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69  d for this simpi
11c30 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74  fication gives t
11c40 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a  he same result.*
11c50 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74  * but only has t
11c60 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20  o scan the data 
11c70 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75  once.  And becau
11c80 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74  se indices might
11c90 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68   .** exist on th
11ca0 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f  e table t1, a co
11cb0 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74  mplete scan of t
11cc0 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65  he data might be
11cd0 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a  .** avoided..**.
11ce0 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73  ** Flattening is
11cf0 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
11d00 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
11d10 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
11d20 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54  :.**.**   (1)  T
11d30 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
11d40 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
11d50 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
11d60 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
11d70 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62  *   (2)  The sub
11d80 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
11d90 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65  aggregate or the
11da0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
11db0 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
11dc0 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62  *   (3)  The sub
11dd0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65  query is not the
11de0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
11df0 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a  f a left outer j
11e00 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20  oin, or.**      
11e10 20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69    the subquery i
11e20 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a  s not itself a j
11e30 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33  oin.  (Ticket #3
11e40 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  06).**.**   (4) 
11e50 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
11e60 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72   not DISTINCT or
11e70 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11e80 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
11e90 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65  **.**   (5)  The
11ea0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
11eb0 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65   DISTINCT or the
11ec0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
11ed0 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
11ee0 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
11ef0 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65  **.**   (6)  The
11f00 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
11f10 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
11f20 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
11f30 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
11f40 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a        DISTINCT..
11f50 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65  **.**   (7)  The
11f60 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20   subquery has a 
11f70 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
11f80 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75  **   (8)  The su
11f90 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
11fa0 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
11fb0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
11fc0 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
11fd0 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62  *   (9)  The sub
11fe0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
11ff0 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
12000 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
12010 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
12020 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
12030 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20  *.**  (10)  The 
12040 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
12050 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
12060 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
12070 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
12080 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54         use LIMIT
12090 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ..**.**  (11)  T
120a0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
120b0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
120c0 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65  do not both have
120d0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
120e0 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20  s..**.**  (12)  
120f0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
12100 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 74 65  not the right te
12110 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  rm of a LEFT OUT
12120 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a  ER JOIN or the.*
12130 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72  *        subquer
12140 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
12150 6c 61 75 73 65 2e 20 20 28 61 64 64 65 64 20 62  lause.  (added b
12160 79 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a  y ticket #350).*
12170 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20  *.**  (13)  The 
12180 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74  subquery and out
12190 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
121a0 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 0a 2a  both use LIMIT.*
121b0 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20  *.**  (14)  The 
121c0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
121d0 74 20 75 73 65 20 4f 46 46 53 45 54 0a 2a 2a 0a  t use OFFSET.**.
121e0 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75  **  (15)  The ou
121f0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
12200 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
12210 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68  und select or th
12220 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71  e.**        subq
12230 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61  uery does not ha
12240 76 65 20 62 6f 74 68 20 61 6e 20 4f 52 44 45 52  ve both an ORDER
12250 20 42 59 20 61 6e 64 20 61 20 4c 49 4d 49 54 20   BY and a LIMIT 
12260 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20  clause..**      
12270 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32    (See ticket #2
12280 33 33 39 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  339).**.** In th
12290 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  is routine, the 
122a0 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
122b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
122c0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a  e outer query..*
122d0 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
122e0 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72  s p->pSrc->a[iFr
122f0 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74  om].  isAgg is t
12300 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  rue if the outer
12310 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61   query.** uses a
12320 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75  ggregates and su
12330 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74  bqueryIsAgg is t
12340 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
12350 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
12360 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c  tes..**.** If fl
12370 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20  attening is not 
12380 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20  attempted, this 
12390 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
123a0 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30  op and returns 0
123b0 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  ..** If flatteni
123c0 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  ng is attempted 
123d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
123e0 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c  urns 1..**.** Al
123f0 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  l of the express
12400 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73  ion analysis mus
12410 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20  t occur on both 
12420 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
12430 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75  and.** the subqu
12440 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20  ery before this 
12450 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f  routine runs..*/
12460 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74  .static int flat
12470 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 73  tenSubquery(.  s
12480 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
12490 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
124a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
124b0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
124c0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
124d0 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45  nt or outer SELE
124e0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
124f0 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20    int iFrom,    
12500 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
12510 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20  in p->pSrc->a[] 
12520 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62  of the inner sub
12530 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
12540 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20  sAgg,           
12550 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72  /* True if outer
12560 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67   SELECT uses agg
12570 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
12580 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65   */.  int subque
12590 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72  ryIsAgg    /* Tr
125a0 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
125b0 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
125c0 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
125d0 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  {.  Select *pSub
125e0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
125f0 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73  nner query or "s
12600 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 72  ubquery" */.  Sr
12610 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
12620 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
12630 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
12640 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  r query */.  Src
12650 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20  List *pSubSrc;  
12660 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
12670 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
12680 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ery */.  ExprLis
12690 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  t *pList;    /* 
126a0 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  The result set o
126b0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
126c0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  y */.  int iPare
126d0 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44  nt;        /* VD
126e0 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
126f0 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73   of the pSub res
12700 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62  ult set temp tab
12710 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
12720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
12730 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
12740 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12760 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
12770 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
12780 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
12790 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54  pSubitem;   /* T
127a0 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 0a  he subquery */..
127b0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
127c0 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  e if flattening 
127d0 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52  is permitted.  R
127e0 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a  eturn 0 if not..
127f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20    */.  if( p==0 
12800 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
12810 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
12820 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20  assert( pSrc && 
12830 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f  iFrom>=0 && iFro
12840 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a  m<pSrc->nSrc );.
12850 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53    pSubitem = &pS
12860 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20  rc->a[iFrom];.  
12870 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d  pSub = pSubitem-
12880 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65  >pSelect;.  asse
12890 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20  rt( pSub!=0 );. 
128a0 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75   if( isAgg && su
128b0 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65  bqueryIsAgg ) re
128c0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
128d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
128e0 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20  iction (1)  */. 
128f0 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
12900 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63  gg && pSrc->nSrc
12910 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  >1 ) return 0;  
12920 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
12930 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20  iction (2)  */. 
12940 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d   pSubSrc = pSub-
12950 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
12960 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a   pSubSrc );.  /*
12970 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f   Prior to versio
12980 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49  n 3.1.2, when LI
12990 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68  MIT and OFFSET h
129a0 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20  ad to be simple 
129b0 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20  constants,.  ** 
129c0 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78  not arbitrary ex
129d0 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20 61  presssions, we a
129e0 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62  llowed some comb
129f0 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61  ining of LIMIT a
12a00 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
12a10 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c  ecause they coul
12a20 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74  d be computed at
12a30 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20   compile-time.  
12a40 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  But when LIMIT a
12a50 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
12a60 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20  ecame arbitrary 
12a70 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20  expressions, we 
12a80 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61  were forced to a
12a90 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  dd restrictions 
12aa0 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31  (13).  ** and (1
12ab0 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  4). */.  if( pSu
12ac0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
12ad0 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
12ae0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12af0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
12b00 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  13) */.  if( pSu
12b10 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74  b->pOffset ) ret
12b20 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
12b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b40 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
12b50 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  14) */.  if( p->
12b60 70 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70 53  pRightmost && pS
12b70 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 53  ub->pLimit && pS
12b80 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
12b90 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
12bd0 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a  riction (15) */.
12be0 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72    }.  if( pSubSr
12bf0 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74  c->nSrc==0 ) ret
12c00 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
12c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12c20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20  Restriction (7) 
12c30 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 2d   */.  if( (pSub-
12c40 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70  >isDistinct || p
12c50 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20 0a 20 20  Sub->pLimit) .  
12c60 20 20 20 20 20 20 20 26 26 20 28 70 53 72 63 2d         && (pSrc-
12c70 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67  >nSrc>1 || isAgg
12c80 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a  ) ){          /*
12c90 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34   Restrictions (4
12ca0 29 28 35 29 28 38 29 28 39 29 20 2a 2f 0a 20 20  )(5)(8)(9) */.  
12cb0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
12cc0 20 20 20 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d     .  }.  if( p-
12cd0 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 73  >isDistinct && s
12ce0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
12cf0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
12d00 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
12d10 28 36 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  (6)  */.  if( (p
12d20 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42  ->disallowOrderB
12d30 79 20 7c 7c 20 70 2d 3e 70 4f 72 64 65 72 42 79  y || p->pOrderBy
12d40 29 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  ) && pSub->pOrde
12d50 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75  rBy ){.     retu
12d60 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d90 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
12da0 31 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  11) */.  }..  /*
12db0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20   Restriction 3: 
12dc0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
12dd0 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65   is a join, make
12de0 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
12df0 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20  ry is .  ** not 
12e00 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68  used as the righ
12e10 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20  t operand of an 
12e20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61  outer join.  Exa
12e30 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
12e40 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c  s.  ** is not al
12e50 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
12e60 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
12e70 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20   OUTER JOIN (t2 
12e80 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20  JOIN t3).  **.  
12e90 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
12ea0 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
12eb0 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
12ec0 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
12ed0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
12ee0 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a  2) JOIN t3.  **.
12ef0 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f    ** which is no
12f00 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d  t at all the sam
12f10 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  e thing..  */.  
12f20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
12f30 63 3e 31 20 26 26 20 28 70 53 75 62 69 74 65 6d  c>1 && (pSubitem
12f40 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
12f50 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20  OUTER)!=0 ){.   
12f60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
12f70 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
12f80 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62   12:  If the sub
12f90 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
12fa0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
12fb0 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20  left outer.  ** 
12fc0 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
12fd0 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
12fe0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
12ff0 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c  ..  ** An exampl
13000 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69  es of why this i
13010 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
13020 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
13030 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
13040 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52  OIN (SELECT * FR
13050 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78  OM t2 WHERE t2.x
13060 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  >0).  **.  ** If
13070 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
13080 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
13090 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
130a0 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
130b0 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48  UTER JOIN t2) WH
130c0 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a  ERE t2.x>0.  **.
130d0 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e    ** But the t2.
130e0 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c  x>0 test will al
130f0 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e  ways fail on a N
13100 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77  ULL row of t2, w
13110 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74  hich.  ** effect
13120 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74  ively converts t
13130 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e  he OUTER JOIN in
13140 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e  to an INNER JOIN
13150 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  ..  */.  if( (pS
13160 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
13170 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
13180 26 26 20 70 53 75 62 2d 3e 70 57 68 65 72 65 21  && pSub->pWhere!
13190 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
131a0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
131b0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
131c0 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 66  oint, it means f
131d0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
131e0 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a 20  mitted for the. 
131f0 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74   ** iFrom-th ent
13200 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
13210 6c 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74  lause in the out
13220 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a  er query..  */..
13230 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66    /* Move all of
13240 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e   the FROM elemen
13250 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ts of the subque
13260 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ry into the.  **
13270 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
13280 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
13290 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69  ery.  Before doi
132a0 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65  ng this, remembe
132b0 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  r.  ** the curso
132c0 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
132d0 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20   original outer 
132e0 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65  query FROM eleme
132f0 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65  nt in.  ** iPare
13300 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
13310 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
13320 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
13330 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a  sequent code.  *
13340 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72  * will scan expr
13350 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20  essions looking 
13360 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65  for iParent refe
13370 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61  rences and repla
13380 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65  ce.  ** those re
13390 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78  ferences with ex
133a0 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
133b0 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75  esolve to the su
133c0 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a  bquery FROM.  **
133d0 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65   elements we are
133e0 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e   now copying in.
133f0 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20  .  */.  iParent 
13400 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
13410 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74  sor;.  {.    int
13420 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53   nSubSrc = pSubS
13430 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e  rc->nSrc;.    in
13440 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75  t jointype = pSu
13450 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b  bitem->jointype;
13460 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ..    sqlite3Del
13470 65 74 65 54 61 62 6c 65 28 70 53 75 62 69 74 65  eteTable(pSubite
13480 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71  m->pTab);.    sq
13490 6c 69 74 65 33 5f 66 72 65 65 28 70 53 75 62 69  lite3_free(pSubi
134a0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
134b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
134c0 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  e(pSubitem->zNam
134d0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
134e0 66 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a  free(pSubitem->z
134f0 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 53 75 62  Alias);.    pSub
13500 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
13510 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44      pSubitem->zD
13520 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 20  atabase = 0;.   
13530 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
13540 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 69 74   = 0;.    pSubit
13550 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a  em->zAlias = 0;.
13560 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
13570 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  1 ){.      int e
13580 78 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d  xtra = nSubSrc -
13590 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   1;.      for(i=
135a0 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b  1; i<nSubSrc; i+
135b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63  +){.        pSrc
135c0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
135d0 74 41 70 70 65 6e 64 28 64 62 2c 20 70 53 72 63  tAppend(db, pSrc
135e0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
135f0 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a   if( pSrc==0 ){.
13600 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 53 72            p->pSr
13610 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  c = 0;.         
13620 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
13630 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13640 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
13650 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  c;.      for(i=p
13660 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65  Src->nSrc-1; i-e
13670 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d  xtra>=iFrom; i--
13680 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d  ){.        pSrc-
13690 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b  >a[i] = pSrc->a[
136a0 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20  i-extra];.      
136b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
136c0 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
136d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63  i++){.      pSrc
136e0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
136f0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
13700 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
13710 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
13720 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
13730 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
13740 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
13750 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
13760 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  pe;.  }..  /* No
13770 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
13780 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
13790 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
137a0 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72  ions for .  ** r
137b0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
137c0 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
137d0 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
137e0 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  * .  ** Example:
137f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c  .  **.  **   SEL
13800 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52  ECT a+5, b*10 FR
13810 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41  OM (SELECT x*3 A
13820 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46  S a, y+10 AS b F
13830 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e  ROM t1) WHERE a>
13840 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20 20  b;.  **   \     
13850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13860 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73  \_____________ s
13870 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  ubquery ________
13880 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20  __/          /. 
13890 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f   **    \________
138a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
138b0 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
138c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
138d0 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20  ________/.  **. 
138e0 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
138f0 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
13900 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
13910 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
13920 63 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20 22  ce we see.  ** "
13930 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
13940 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
13950 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
13960 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
13970 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 70  "y+10"..  */.  p
13980 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
13990 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
139a0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
139b0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
139c0 70 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  pr;.    if( pLis
139d0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
139e0 20 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69   && (pExpr = pLi
139f0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d  st->a[i].pExpr)-
13a00 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20  >span.z!=0 ){.  
13a10 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
13a20 7a 4e 61 6d 65 20 3d 20 0a 20 20 20 20 20 20 20  zName = .       
13a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
13a40 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
13a50 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c  *)pExpr->span.z,
13a60 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b   pExpr->span.n);
13a70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 75 62  .    }.  }.  sub
13a80 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
13a90 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
13aa0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
13ab0 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  ;.  if( isAgg ){
13ac0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
13ad0 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  st(db, p->pGroup
13ae0 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
13af0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
13b00 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
13b10 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
13b20 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
13b30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  ;.  }.  if( pSub
13b40 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
13b50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
13b60 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
13b70 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53  p->pOrderBy = pS
13b80 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
13b90 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
13ba0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
13bb0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
13bc0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
13bd0 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  st(db, p->pOrder
13be0 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
13bf0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  b->pEList);.  }.
13c00 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
13c10 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65  re ){.    pWhere
13c20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
13c30 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65  p(db, pSub->pWhe
13c40 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  re);.  }else{.  
13c50 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
13c60 7d 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  }.  if( subquery
13c70 49 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73  IsAgg ){.    ass
13c80 65 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d  ert( p->pHaving=
13c90 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  =0 );.    p->pHa
13ca0 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65  ving = p->pWhere
13cb0 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
13cc0 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75  = pWhere;.    su
13cd0 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
13ce0 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
13cf0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
13d00 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
13d10 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
13d20 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  db, p->pHaving, 
13d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d50 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
13d60 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e  db, pSub->pHavin
13d70 67 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  g));.    assert(
13d80 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
13d90 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70  );.    p->pGroup
13da0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
13db0 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62  ListDup(db, pSub
13dc0 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d  ->pGroupBy);.  }
13dd0 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45  else{.    substE
13de0 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  xpr(db, p->pWher
13df0 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  e, iParent, pSub
13e00 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  ->pEList);.    p
13e10 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
13e20 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 2d  e3ExprAnd(db, p-
13e30 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29  >pWhere, pWhere)
13e40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
13e50 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
13e60 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65  is distinct if e
13e70 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
13e80 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65  or the.  ** oute
13e90 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
13ea0 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e  nct. .  */.  p->
13eb0 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
13ec0 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53  isDistinct || pS
13ed0 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a  ub->isDistinct;.
13ee0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45 43  .  /*.  ** SELEC
13ef0 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45  T ... FROM (SELE
13f00 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f  CT ... LIMIT a O
13f10 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78  FFSET b) LIMIT x
13f20 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 2a 2a 0a   OFFSET y;.  **.
13f30 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70    ** One is temp
13f40 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64  ted to try to ad
13f50 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d  d a and b to com
13f60 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e  bine the limits.
13f70 20 20 42 75 74 20 74 68 69 73 0a 20 20 2a 2a 20    But this.  ** 
13f80 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66  does not work if
13f90 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73   either limit is
13fa0 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 2a 2f 0a   negative..  */.
13fb0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
13fc0 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 69  it ){.    p->pLi
13fd0 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d  mit = pSub->pLim
13fe0 69 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4c  it;.    pSub->pL
13ff0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  imit = 0;.  }.. 
14000 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
14010 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
14020 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
14030 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
14040 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
14050 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
14060 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20 72  elete(pSub);.  r
14070 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
14080 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
14090 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VIEW */../*.** 
140a0 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45  Analyze the SELE
140b0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  CT statement pas
140c0 73 65 64 20 69 6e 20 61 73 20 61 6e 20 61 72 67  sed in as an arg
140d0 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20  ument to see if 
140e0 69 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c  it.** is a simpl
140f0 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
14100 20 71 75 65 72 79 2e 20 20 49 66 20 69 74 20 69   query.  If it i
14110 73 20 61 6e 64 20 74 68 69 73 20 71 75 65 72 79  s and this query
14120 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73   can be.** satis
14130 66 69 65 64 20 75 73 69 6e 67 20 61 20 73 69 6e  fied using a sin
14140 67 6c 65 20 73 65 65 6b 20 74 6f 20 74 68 65 20  gle seek to the 
14150 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64  beginning or end
14160 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a   of an index,.**
14170 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20 74   then generate t
14180 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73  he code for this
14190 20 53 45 4c 45 43 54 20 61 6e 64 20 72 65 74 75   SELECT and retu
141a0 72 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20 69  rn 1.  If this i
141b0 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70  s not a .** simp
141c0 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  le min() or max(
141d0 29 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72 65  ) query, then re
141e0 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20  turn 0;.**.** A 
141f0 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20  simply min() or 
14200 6d 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b  max() query look
14210 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
14220 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e  **    SELECT min
14230 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a  (a) FROM table;.
14240 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78  **    SELECT max
14250 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a  (a) FROM table;.
14260 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20  **.** The query 
14270 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61 20  may have only a 
14280 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
14290 69 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e  its FROM argumen
142a0 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e  t.  There.** can
142b0 20 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59 20   be no GROUP BY 
142c0 6f 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48 45  or HAVING or WHE
142d0 52 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65  RE clauses.  The
142e0 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73 74   result set must
142f0 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28 29  .** be the min()
14300 20 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20 73   or max() of a s
14310 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
14320 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  the table.  The 
14330 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65  column.** in the
14340 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
14350 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
14360 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20   indexed..**.** 
14370 54 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74  The parameters t
14380 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  o this routine a
14390 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 66  re the same as f
143a0 6f 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  or sqlite3Select
143b0 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68  ()..** See the h
143c0 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
143d0 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f   that routine fo
143e0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
143f0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
14400 74 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69  tic int simpleMi
14410 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20  nMaxQuery(Parse 
14420 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
14430 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  *p, int eDest, i
14440 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 45 78 70  nt iParm){.  Exp
14450 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74 20  r *pExpr;.  int 
14460 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iCol;.  Table *p
14470 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
14480 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a  dx;.  int base;.
14490 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
144a0 20 73 65 65 6b 4f 70 3b 0a 20 20 45 78 70 72 4c   seekOp;.  ExprL
144b0 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 2a 70 4c  ist *pEList, *pL
144c0 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20 20 73 74  ist, eList;.  st
144d0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
144e0 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20  em eListItem;.  
144f0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
14500 20 69 6e 74 20 62 72 6b 3b 0a 20 20 69 6e 74 20   int brk;.  int 
14510 69 44 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  iDb;..  /* Check
14520 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
14530 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c  query is a simpl
14540 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
14550 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a   query.  Return.
14560 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20    ** zero if it 
14570 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  is  not..  */.  
14580 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
14590 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c  || p->pHaving ||
145a0 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
145b0 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
145c0 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70  p->pSrc;.  if( p
145d0 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
145e0 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73  eturn 0;.  pELis
145f0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
14600 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
14610 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
14620 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69  ;.  pExpr = pELi
14630 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
14640 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
14650 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
14660 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
14670 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
14680 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  ist;.  if( pList
14690 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45  ==0 || pList->nE
146a0 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
146b0 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
146c0 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74  token.n!=3 ) ret
146d0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  urn 0;.  if( sql
146e0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
146f0 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
14700 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29  .z,"min",3)==0 )
14710 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f  {.    seekOp = O
14720 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73  P_Rewind;.  }els
14730 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
14740 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78  NICmp((char*)pEx
14750 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78  pr->token.z,"max
14760 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ",3)==0 ){.    s
14770 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b  eekOp = OP_Last;
14780 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
14790 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45  turn 0;.  }.  pE
147a0 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30  xpr = pList->a[0
147b0 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
147c0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
147d0 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
147e0 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e    iCol = pExpr->
147f0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20  iColumn;.  pTab 
14800 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  = pSrc->a[0].pTa
14810 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6f 70  b;..  /* This op
14820 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f  timization canno
14830 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 76  t be used with v
14840 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 2a  irtual tables. *
14850 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
14860 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
14870 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   0;..  /* If we 
14880 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20  get to here, it 
14890 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79 20  means the query 
148a0 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63  is of the correc
148b0 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65  t form..  ** Che
148c0 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
148d0 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78  we have an index
148e0 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70   and make pIdx p
148f0 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  oint to the.  **
14900 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
14910 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28  ex.  If the min(
14920 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
14930 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
14940 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c  ARY.  ** key col
14950 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73  umn, no index is
14960 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73 65   necessary so se
14970 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20  t pIdx to NULL. 
14980 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62   If no.  ** usab
14990 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e  le index is foun
149a0 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  d, return 0..  *
149b0 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29  /.  if( iCol<0 )
149c0 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a  {.    pIdx = 0;.
149d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f 6c    }else{.    Col
149e0 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
149f0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
14a00 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
14a10 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d  .    if( pColl==
14a20 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
14a30 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
14a40 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
14a50 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
14a60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14a70 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31  pIdx->nColumn>=1
14a80 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
14a90 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
14aa0 3d 69 43 6f 6c 20 26 26 20 0a 20 20 20 20 20 20  =iCol && .      
14ab0 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74      0==sqlite3St
14ac0 72 49 43 6d 70 28 70 49 64 78 2d 3e 61 7a 43 6f  rICmp(pIdx->azCo
14ad0 6c 6c 5b 30 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  ll[0], pColl->zN
14ae0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
14af0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
14b00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64     }.    if( pId
14b10 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  x==0 ) return 0;
14b20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  .  }..  /* Ident
14b30 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73  ify column types
14b40 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75   if we will be u
14b50 73 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63  sing the callbac
14b60 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74  k.  This.  ** st
14b70 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ep is skipped if
14b80 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67   the output is g
14b90 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20  oing to a table 
14ba0 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  or a memory cell
14bb0 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ..  ** The colum
14bc0 6e 20 6e 61 6d 65 73 20 68 61 76 65 20 61 6c 72  n names have alr
14bd0 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61  eady been genera
14be0 74 65 64 20 69 6e 20 74 68 65 20 63 61 6c 6c 69  ted in the calli
14bf0 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  ng function..  *
14c00 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
14c10 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
14c20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
14c30 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  urn 0;..  /* If 
14c40 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65  the output is de
14c50 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d  stined for a tem
14c60 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70  porary table, op
14c70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20  en that table.. 
14c80 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
14c90 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
14ca0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14cb0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
14cc0 45 70 68 65 6d 65 72 61 6c 2c 20 69 50 61 72 6d  Ephemeral, iParm
14cd0 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 1);.  }..  /* 
14ce0 47 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20  Generating code 
14cf0 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 20  to find the min 
14d00 6f 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61 73  or the max.  Bas
14d10 69 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61  ically all we ha
14d20 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73  ve.  ** to do is
14d30 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20   find the first 
14d40 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  or the last entr
14d50 79 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e 20  y in the chosen 
14d60 69 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20  index.  If.  ** 
14d70 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
14d80 28 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e 54  () is on the INT
14d90 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
14da0 2c 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65 20  , then find the 
14db0 66 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61  first.  ** or la
14dc0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
14dd0 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  main table..  */
14de0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
14df0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
14e00 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
14e10 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65  pSchema);.  asse
14e20 72 74 28 20 69 44 62 3e 3d 30 20 7c 7c 20 70 54  rt( iDb>=0 || pT
14e30 61 62 2d 3e 69 73 45 70 68 65 6d 20 29 3b 0a 20  ab->isEphem );. 
14e40 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
14e50 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
14e60 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
14e70 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
14e80 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
14e90 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
14ea0 65 29 3b 0a 20 20 62 61 73 65 20 3d 20 70 53 72  e);.  base = pSr
14eb0 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b  c->a[0].iCursor;
14ec0 0a 20 20 62 72 6b 20 3d 20 73 71 6c 69 74 65 33  .  brk = sqlite3
14ed0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14ee0 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
14ef0 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
14f00 2c 20 70 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28  , p, brk);.  if(
14f10 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c   pSrc->a[0].pSel
14f20 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
14f30 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
14f40 50 61 72 73 65 2c 20 62 61 73 65 2c 20 69 44 62  Parse, base, iDb
14f50 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
14f60 65 61 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ead);.  }.  if( 
14f70 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pIdx==0 ){.    s
14f80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14f90 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c  v, seekOp, base,
14fa0 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
14fb0 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
14fc0 20 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64   the cursor used
14fd0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 69 6e 64   to open the ind
14fe0 65 78 20 68 65 72 65 20 69 73 20 63 6c 6f 73 65  ex here is close
14ff0 64 0a 20 20 20 20 2a 2a 20 61 73 20 73 6f 6f 6e  d.    ** as soon
15000 20 61 73 20 61 20 73 69 6e 67 6c 65 20 76 61 6c   as a single val
15010 75 65 20 68 61 73 20 62 65 65 6e 20 72 65 61 64  ue has been read
15020 20 66 72 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63 61   from it, alloca
15030 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 75 73 69  te it.    ** usi
15040 6e 67 20 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  ng (pParse->nTab
15050 2b 2b 29 20 74 6f 20 70 72 65 76 65 6e 74 20 74  ++) to prevent t
15060 68 65 20 63 75 72 73 6f 72 20 69 64 20 66 72 6f  he cursor id fro
15070 6d 20 62 65 69 6e 67 20 0a 20 20 20 20 2a 2a 20  m being .    ** 
15080 72 65 75 73 65 64 2e 20 54 68 69 73 20 69 73 20  reused. This is 
15090 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20 73 74  important for st
150a0 61 74 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  atements of the 
150b0 66 6f 72 6d 20 0a 20 20 20 20 2a 2a 20 22 49 4e  form .    ** "IN
150c0 53 45 52 54 20 49 4e 54 4f 20 78 20 53 45 4c 45  SERT INTO x SELE
150d0 43 54 20 6d 61 78 28 29 20 46 52 4f 4d 20 78 22  CT max() FROM x"
150e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
150f0 20 69 49 64 78 3b 0a 20 20 20 20 4b 65 79 49 6e   iIdx;.    KeyIn
15100 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  fo *pKey = sqlit
15110 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
15120 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
15130 20 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d    iIdx = pParse-
15140 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 61 73 73  >nTab++;.    ass
15150 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65  ert( pIdx->pSche
15160 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
15170 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
15180 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15190 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29  Integer, iDb, 0)
151a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
151b0 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  eOp3(v, OP_OpenR
151c0 65 61 64 2c 20 69 49 64 78 2c 20 70 49 64 78 2d  ead, iIdx, pIdx-
151d0 3e 74 6e 75 6d 2c 20 0a 20 20 20 20 20 20 20 20  >tnum, .        
151e0 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 33 5f  (char*)pKey, P3_
151f0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
15200 3b 0a 20 20 20 20 69 66 28 20 73 65 65 6b 4f 70  ;.    if( seekOp
15210 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 7b 0a 20  ==OP_Rewind ){. 
15220 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15230 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
15240 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
15250 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15260 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
15270 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
15280 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d 6f 76 65 47  eekOp = OP_MoveG
15290 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
152a0 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
152b0 72 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  r[0]==SQLITE_SO_
152c0 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a  DESC ){.      /*
152d0 20 54 69 63 6b 65 74 20 23 32 35 31 34 3a 20 69   Ticket #2514: i
152e0 6e 76 65 72 74 20 74 68 65 20 73 65 65 6b 20 6f  nvert the seek o
152f0 70 65 72 61 74 6f 72 20 69 66 20 77 65 20 61 72  perator if we ar
15300 65 20 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a  e using.      **
15310 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
15320 64 65 78 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  dex. */.      if
15330 28 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 4c 61 73  ( seekOp==OP_Las
15340 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65  t ){.        see
15350 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b  kOp = OP_Rewind;
15360 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15370 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
15380 65 6b 4f 70 3d 3d 4f 50 5f 4d 6f 76 65 47 74 20  ekOp==OP_MoveGt 
15390 29 3b 0a 20 20 20 20 20 20 20 20 73 65 65 6b 4f  );.        seekO
153a0 70 20 3d 20 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20  p = OP_MoveLt;. 
153b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
153c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
153d0 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64  p(v, seekOp, iId
153e0 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  x, 0);.    sqlit
153f0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
15400 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
15410 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
15420 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15430 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29  _Close, iIdx, 0)
15440 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15450 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
15460 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  eGe, base, 0);. 
15470 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72   }.  eList.nExpr
15480 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 1;.  memset(&
15490 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69  eListItem, 0, si
154a0 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29  zeof(eListItem))
154b0 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65  ;.  eList.a = &e
154c0 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73  ListItem;.  eLis
154d0 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70  t.a[0].pExpr = p
154e0 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e  Expr;.  selectIn
154f0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
15500 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c  p, &eList, 0, 0,
15510 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69   0, -1, eDest, i
15520 50 61 72 6d 2c 20 62 72 6b 2c 20 62 72 6b 2c 20  Parm, brk, brk, 
15530 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
15540 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15550 20 62 72 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33   brk);.  sqlite3
15560 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15570 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b  Close, base, 0);
15580 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  .  .  return 1;.
15590 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
155a0 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f 72   and ORDER BY or
155b0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
155c0 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61   in a SELECT sta
155d0 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a  tement.  Return.
155e0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
155f0 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a   errors seen..**
15600 0a 2a 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20  .** An ORDER BY 
15610 6f 72 20 47 52 4f 55 50 20 42 59 20 69 73 20 61  or GROUP BY is a
15620 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
15630 69 6f 6e 73 2e 20 20 49 66 20 61 6e 79 20 65 78  ions.  If any ex
15640 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61  pression.** is a
15650 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
15660 6e 74 2c 20 74 68 65 6e 20 74 68 61 74 20 65 78  nt, then that ex
15670 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 70 6c  pression is repl
15680 61 63 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63  aced by the.** c
15690 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e 74  orresponding ent
156a0 72 79 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ry in the result
156b0 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
156c0 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65 72  int processOrder
156d0 47 72 6f 75 70 42 79 28 0a 20 20 4e 61 6d 65 43  GroupBy(.  NameC
156e0 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20  ontext *pNC,    
156f0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
15700 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
15710 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 45  tatement. */.  E
15720 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
15730 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y,   /* The ORDE
15740 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
15750 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72   clause to be pr
15760 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ocessed */.  con
15770 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20  st char *zType  
15780 20 20 20 2f 2a 20 45 69 74 68 65 72 20 22 4f 52     /* Either "OR
15790 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 2c  DER" or "GROUP",
157a0 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   as appropriate 
157b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
157c0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
157d0 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b  t = pNC->pEList;
157e0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75       /* The resu
157f0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
15800 4c 45 43 54 20 2a 2f 0a 20 20 50 61 72 73 65 20  LECT */.  Parse 
15810 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
15820 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 54 68  Parse;     /* Th
15830 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
15840 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  the SELECT */.  
15850 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 20 29  assert( pEList )
15860 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  ;..  if( pOrderB
15870 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y==0 ) return 0;
15880 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d  .  if( pOrderBy-
15890 3e 6e 45 78 70 72 3e 53 51 4c 49 54 45 5f 4d 41  >nExpr>SQLITE_MA
158a0 58 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  X_COLUMN ){.    
158b0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
158c0 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
158d0 79 20 74 65 72 6d 73 20 69 6e 20 25 73 20 42 59  y terms in %s BY
158e0 20 63 6c 61 75 73 65 22 2c 20 7a 54 79 70 65 29   clause", zType)
158f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
15900 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
15910 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
15920 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
15930 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a  iCol;.    Expr *
15940 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
15950 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
15960 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
15970 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
15980 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l) ){.      if( 
15990 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d  iCol>0 && iCol<=
159a0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
159b0 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
159c0 20 2a 70 43 6f 6c 6c 20 3d 20 70 45 2d 3e 70 43   *pColl = pE->pC
159d0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  oll;.        int
159e0 20 66 6c 61 67 73 20 3d 20 70 45 2d 3e 66 6c 61   flags = pE->fla
159f0 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
15a00 74 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  te;.        sqli
15a10 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45  te3ExprDelete(pE
15a20 29 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20  );.        pE = 
15a30 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
15a40 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 4c 69 73  Parse->db, pELis
15a50 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78  t->a[iCol-1].pEx
15a60 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  pr);.        pOr
15a70 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
15a80 72 20 3d 20 70 45 3b 0a 20 20 20 20 20 20 20 20  r = pE;.        
15a90 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 66 6c 61  if( pColl && fla
15aa0 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
15ab0 70 45 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c  pE->pColl = pCol
15ac0 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 2d  l;.          pE-
15ad0 3e 66 6c 61 67 73 20 7c 3d 20 66 6c 61 67 73 3b  >flags |= flags;
15ae0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15af0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15b00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15b10 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
15b20 20 20 20 20 22 25 73 20 42 59 20 63 6f 6c 75 6d      "%s BY colum
15b30 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20  n number %d out 
15b40 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c  of range - shoul
15b50 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20  d be ".         
15b60 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64    "between 1 and
15b70 20 25 64 22 2c 20 7a 54 79 70 65 2c 20 69 43 6f   %d", zType, iCo
15b80 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l, pEList->nExpr
15b90 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
15ba0 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
15bb0 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
15bc0 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
15bd0 65 73 28 70 4e 43 2c 20 70 45 29 20 29 7b 0a 20  es(pNC, pE) ){. 
15be0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
15bf0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
15c00 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
15c10 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c  is routine resol
15c20 76 65 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73  ves any names us
15c30 65 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ed in the result
15c40 20 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73   set of the.** s
15c50 75 70 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73  upplied SELECT s
15c60 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65  tatement. If the
15c70 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15c80 74 20 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64  t being resolved
15c90 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c  .** is a sub-sel
15ca0 65 63 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72  ect, then pOuter
15cb0 4e 43 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  NC is a pointer 
15cc0 74 6f 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65  to the NameConte
15cd0 78 74 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  xt .** of the pa
15ce0 72 65 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  rent SELECT..*/.
15cf0 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
15d00 74 52 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73  tResolve(.  Pars
15d10 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
15d20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
15d30 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
15d40 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
15d50 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
15d60 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
15d70 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
15d80 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
15d90 65 72 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74  erNC  /* The out
15da0 65 72 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e  er name context.
15db0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
15dc0 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
15dd0 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
15de0 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20   /* Result set. 
15df0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
15e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e10 2f 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69  /* For-loop vari
15e20 61 62 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c  able used in mul
15e30 74 69 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a  tiple places */.
15e40 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
15e50 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C;           /* 
15e60 4c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65  Local name-conte
15e70 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
15e80 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20   *pGroupBy;     
15e90 20 20 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20     /* The group 
15ea0 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20  by clause */..  
15eb0 2f 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  /* If this routi
15ec0 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72  ne has run befor
15ed0 65 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  e, return immedi
15ee0 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20  ately. */.  if( 
15ef0 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b  p->isResolved ){
15f00 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 4f  .    assert( !pO
15f10 75 74 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65  uterNC );.    re
15f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15f30 20 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c    }.  p->isResol
15f40 76 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49  ved = 1;..  /* I
15f50 66 20 74 68 65 72 65 20 68 61 76 65 20 61 6c 72  f there have alr
15f60 65 61 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73  eady been errors
15f70 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f  , do nothing. */
15f80 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
15f90 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  Err>0 ){.    ret
15fa0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
15fb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70  ;.  }..  /* Prep
15fc0 61 72 65 20 74 68 65 20 73 65 6c 65 63 74 20 73  are the select s
15fd0 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63  tatement. This c
15fe0 61 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74  all will allocat
15ff0 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20  e all cursors.  
16000 2a 2a 20 72 65 71 75 69 72 65 64 20 74 6f 20 68  ** required to h
16010 61 6e 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73  andle the tables
16020 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
16030 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
16040 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  se..  */.  if( p
16050 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50  repSelectStmt(pP
16060 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
16070 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
16080 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ROR;.  }..  /* R
16090 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65  esolve the expre
160a0 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49  ssions in the LI
160b0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
160c0 6c 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20  lauses. These.  
160d0 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  ** are not allow
160e0 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61  ed to refer to a
160f0 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73  ny names, so pas
16100 73 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43  s an empty NameC
16110 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 6d  ontext..  */.  m
16120 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
16130 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73  izeof(sNC));.  s
16140 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
16150 73 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se;.  if( sqlite
16160 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
16170 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69  s(&sNC, p->pLimi
16180 74 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69  t) ||.      sqli
16190 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
161a0 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66  mes(&sNC, p->pOf
161b0 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74  fset) ){.    ret
161c0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
161d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
161e0 75 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d  up the local nam
161f0 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73  e-context to pas
16200 73 20 74 6f 20 45 78 70 72 52 65 73 6f 6c 76 65  s to ExprResolve
16210 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a 20  Names() to.  ** 
16220 72 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72  resolve the expr
16230 65 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a  ession-list..  *
16240 2f 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67  /.  sNC.allowAgg
16250 20 3d 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72 63   = 1;.  sNC.pSrc
16260 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
16270 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f    sNC.pNext = pO
16280 75 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 52 65  uterNC;..  /* Re
16290 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74  solve names in t
162a0 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a  he result set. *
162b0 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
162c0 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 21 70  pEList;.  if( !p
162d0 45 4c 69 73 74 20 29 20 72 65 74 75 72 6e 20 53  EList ) return S
162e0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 66  QLITE_ERROR;.  f
162f0 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
16300 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
16310 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45     Expr *pX = pE
16320 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
16330 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
16340 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
16350 73 28 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20  s(&sNC, pX) ){. 
16360 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16370 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
16380 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
16390 72 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67  re are no aggreg
163a0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ate functions in
163b0 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c   the result-set,
163c0 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59   and no GROUP BY
163d0 20 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f   .  ** expressio
163e0 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  n, do not allow 
163f0 61 67 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e  aggregates in an
16400 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65  y of the other e
16410 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
16420 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69  .  assert( !p->i
16430 73 41 67 67 20 29 3b 0a 20 20 70 47 72 6f 75 70  sAgg );.  pGroup
16440 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
16450 3b 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79  ;.  if( pGroupBy
16460 20 7c 7c 20 73 4e 43 2e 68 61 73 41 67 67 20 29   || sNC.hasAgg )
16470 7b 0a 20 20 20 20 70 2d 3e 69 73 41 67 67 20 3d  {.    p->isAgg =
16480 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
16490 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20   sNC.allowAgg = 
164a0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
164b0 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  a HAVING clause 
164c0 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  is present, then
164d0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
164e0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
164f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
16500 70 48 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f  pHaving && !pGro
16510 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  upBy ){.    sqli
16520 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
16530 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20  se, "a GROUP BY 
16540 63 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72  clause is requir
16550 65 64 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47  ed before HAVING
16560 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ");.    return S
16570 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
16580 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65  ..  /* Add the e
16590 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
165a0 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65  o the name-conte
165b0 78 74 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e  xt before parsin
165c0 67 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  g the.  ** other
165d0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
165e0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
165f0 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f  ment. This is so
16600 20 74 68 61 74 0a 20 20 2a 2a 20 65 78 70 72 65   that.  ** expre
16610 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48  ssions in the WH
16620 45 52 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e  ERE clause (etc.
16630 29 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65  ) can refer to e
16640 78 70 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20  xpressions by.  
16650 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68  ** aliases in th
16660 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20  e result set..  
16670 2a 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f  **.  ** Minor po
16680 69 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73 20  int: If this is 
16690 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
166a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  he expression wi
166b0 6c 6c 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76  ll be.  ** re-ev
166c0 61 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63 68  aluated for each
166d0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
166e0 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c  ..  */.  sNC.pEL
166f0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
16700 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
16710 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
16720 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20  sNC, p->pWhere) 
16730 7c 7c 0a 20 20 20 20 20 73 71 6c 69 74 65 33 45  ||.     sqlite3E
16740 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
16750 26 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67  &sNC, p->pHaving
16760 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
16770 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
16780 7d 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  }.  if( p->pPrio
16790 72 3d 3d 30 20 26 26 20 70 72 6f 63 65 73 73 4f  r==0 && processO
167a0 72 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43  rderGroupBy(&sNC
167b0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  , p->pOrderBy, "
167c0 4f 52 44 45 52 22 29 20 29 7b 0a 20 20 20 20 72  ORDER") ){.    r
167d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
167e0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72  OR;.  }.  if( pr
167f0 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42  ocessOrderGroupB
16800 79 28 26 73 4e 43 2c 20 70 47 72 6f 75 70 42 79  y(&sNC, pGroupBy
16810 2c 20 22 47 52 4f 55 50 22 29 20 29 7b 0a 20 20  , "GROUP") ){.  
16820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16830 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
16840 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
16850 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
16860 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16870 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
16880 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 47   Make sure the G
16890 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 64  ROUP BY clause d
168a0 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
168b0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
168c0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
168d0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
168e0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
168f0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a  item *pItem;.  .
16900 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
16910 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20  em=pGroupBy->a; 
16920 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  i<pGroupBy->nExp
16930 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
16940 7b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  {.      if( Expr
16950 48 61 73 50 72 6f 70 65 72 74 79 28 70 49 74 65  HasProperty(pIte
16960 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 41 67 67  m->pExpr, EP_Agg
16970 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
16980 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16990 72 73 65 2c 20 22 61 67 67 72 65 67 61 74 65 20  rse, "aggregate 
169a0 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  functions are no
169b0 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20  t allowed in ". 
169c0 20 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20             "the 
169d0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 22  GROUP BY clause"
169e0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
169f0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
16a00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16a10 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
16a20 69 73 20 6f 6e 65 20 53 45 4c 45 43 54 20 6f 66  is one SELECT of
16a30 20 61 20 63 6f 6d 70 6f 75 6e 64 2c 20 62 65 20   a compound, be 
16a40 73 75 72 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  sure to resolve 
16a50 6e 61 6d 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68  names.  ** in th
16a60 65 20 6f 74 68 65 72 20 53 45 4c 45 43 54 73 2e  e other SELECTs.
16a70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
16a80 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  Prior ){.    ret
16a90 75 72 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63  urn sqlite3Selec
16aa0 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c  tResolve(pParse,
16ab0 20 70 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 75 74   p->pPrior, pOut
16ac0 65 72 4e 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  erNC);.  }else{.
16ad0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16ae0 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
16af0 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67  ** Reset the agg
16b00 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
16b10 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67  or..**.** The ag
16b20 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
16b30 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20  tor is a set of 
16b40 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61  memory cells tha
16b50 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d  t hold.** interm
16b60 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77  ediate results w
16b70 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67  hile calculating
16b80 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
16b90 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
16ba0 73 69 6d 70 6c 79 20 73 74 6f 72 65 73 20 4e 55  simply stores NU
16bb0 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  LLs in all of th
16bc0 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  ose memory cells
16bd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
16be0 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
16bf0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
16c00 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
16c10 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
16c20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
16c30 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
16c40 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
16c50 70 46 75 6e 63 3b 0a 20 20 69 66 28 20 70 41 67  pFunc;.  if( pAg
16c60 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67  gInfo->nFunc+pAg
16c70 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d  gInfo->nColumn==
16c80 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
16c90 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
16ca0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  i<pAggInfo->nCol
16cb0 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  umn; i++){.    s
16cc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
16cd0 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 70  v, OP_MemNull, p
16ce0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
16cf0 2e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 7d 0a 20  .iMem, 0);.  }. 
16d00 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49   for(pFunc=pAggI
16d10 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b  nfo->aFunc, i=0;
16d20 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
16d30 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b  nc; i++, pFunc++
16d40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
16d50 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
16d60 6d 4e 75 6c 6c 2c 20 70 46 75 6e 63 2d 3e 69 4d  mNull, pFunc->iM
16d70 65 6d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  em, 0);.    if( 
16d80 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
16d90 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  >=0 ){.      Exp
16da0 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70  r *pE = pFunc->p
16db0 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
16dc0 70 45 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  pE->pList==0 || 
16dd0 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pE->pList->nExpr
16de0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
16df0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16e00 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54  Parse, "DISTINCT
16e10 20 69 6e 20 61 67 67 72 65 67 61 74 65 20 6d 75   in aggregate mu
16e20 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 22  st be followed "
16e30 0a 20 20 20 20 20 20 20 20 20 20 20 22 62 79 20  .           "by 
16e40 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b  an expression");
16e50 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e  .        pFunc->
16e60 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
16e70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16e80 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
16e90 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
16ea0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
16eb0 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b  rse, pE->pList);
16ec0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16ed0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
16ee0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75  enEphemeral, pFu
16ef0 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30  nc->iDistinct, 0
16f00 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
16f10 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
16f20 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33  ar*)pKeyInfo, P3
16f30 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
16f40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
16f50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
16f60 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46  voke the OP_AggF
16f70 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66  inalize opcode f
16f80 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61  or every aggrega
16f90 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  te function.** i
16fa0 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  n the AggInfo st
16fb0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
16fc0 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65  ic void finalize
16fd0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72  AggFunctions(Par
16fe0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
16ff0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
17000 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
17010 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
17020 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
17030 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
17040 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
17050 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
17060 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
17070 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
17080 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
17090 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c   = pF->pExpr->pL
170a0 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ist;.    sqlite3
170b0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67  VdbeOp3(v, OP_Ag
170c0 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d  gFinal, pF->iMem
170d0 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  , pList ? pList-
170e0 3e 6e 45 78 70 72 20 3a 20 30 2c 0a 20 20 20 20  >nExpr : 0,.    
170f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17100 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75    (void*)pF->pFu
17110 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45 46 29 3b  nc, P3_FUNCDEF);
17120 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70  .  }.}../*.** Up
17130 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c  date the accumul
17140 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ator memory cell
17150 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  s for an aggrega
17160 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  te based on.** t
17170 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
17180 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73  r position..*/.s
17190 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74  tatic void updat
171a0 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  eAccumulator(Par
171b0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
171c0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
171d0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
171e0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
171f0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
17200 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
17210 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
17220 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67  col *pC;..  pAgg
17230 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
17240 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 1;.  for(i=0,
17250 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
17260 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
17270 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
17280 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  +){.    int nArg
17290 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65  ;.    int addrNe
172a0 78 74 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 72  xt = 0;.    Expr
172b0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
172c0 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  ->pExpr->pList;.
172d0 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
172e0 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c  .      nArg = pL
172f0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
17300 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
17310 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
17320 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65  , pList);.    }e
17330 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  lse{.      nArg 
17340 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
17350 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  f( pF->iDistinct
17360 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
17370 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
17380 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
17390 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
173a0 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Arg==1 );.      
173b0 63 6f 64 65 44 69 73 74 69 6e 63 74 28 76 2c 20  codeDistinct(v, 
173c0 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61  pF->iDistinct, a
173d0 64 64 72 4e 65 78 74 2c 20 31 29 3b 0a 20 20 20  ddrNext, 1);.   
173e0 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70   }.    if( pF->p
173f0 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65  Func->needCollSe
17400 71 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  q ){.      CollS
17410 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
17420 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
17430 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
17440 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
17450 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
17460 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69  st!=0 );  /* pLi
17470 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75  st!=0 if pF->pFu
17480 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  nc->needCollSeq 
17490 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 20 20 20  is true */.     
174a0 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
174b0 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c  pList->a; !pColl
174c0 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c   && j<nArg; j++,
174d0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
174e0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
174f0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
17500 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
17510 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
17520 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
17530 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
17540 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
17550 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
17560 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17570 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  eOp3(v, OP_CollS
17580 65 71 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20  eq, 0, 0, (char 
17590 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c  *)pColl, P3_COLL
175a0 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  SEQ);.    }.    
175b0 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
175c0 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 70 46  , OP_AggStep, pF
175d0 2d 3e 69 4d 65 6d 2c 20 6e 41 72 67 2c 20 28 76  ->iMem, nArg, (v
175e0 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
175f0 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P3_FUNCDEF);.   
17600 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b   if( addrNext ){
17610 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17620 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
17630 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
17640 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30   }.  }.  for(i=0
17650 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pC=pAggInfo->a
17660 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  Col; i<pAggInfo-
17670 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69  >nAccumulator; i
17680 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73  ++, pC++){.    s
17690 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
176a0 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72  Parse, pC->pExpr
176b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
176c0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
176d0 6d 53 74 6f 72 65 2c 20 70 43 2d 3e 69 4d 65 6d  mStore, pC->iMem
176e0 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67  , 1);.  }.  pAgg
176f0 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
17700 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 0;.}.../*.** 
17710 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
17720 72 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45  r the given SELE
17730 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
17740 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
17750 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20  are distributed 
17760 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73 20  in various ways 
17770 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
17780 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65 44 65  .** value of eDe
17790 73 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a  st and iParm..**
177a0 0a 2a 2a 20 20 20 20 20 65 44 65 73 74 20 56 61  .**     eDest Va
177b0 6c 75 65 20 20 20 20 20 20 20 52 65 73 75 6c 74  lue       Result
177c0 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  .**     --------
177d0 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ----    --------
177e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
177f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17800 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43  ---.**     SRT_C
17810 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b  allback    Invok
17820 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  e the callback f
17830 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74  or each row of t
17840 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
17850 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20       SRT_Mem    
17860 20 20 20 20 20 53 74 6f 72 65 20 66 69 72 73 74       Store first
17870 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72   result in memor
17880 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a  y cell iParm.**.
17890 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20  **     SRT_Set  
178a0 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
178b0 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66 20  ults as keys of 
178c0 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a  table iParm..**.
178d0 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e  **     SRT_Union
178e0 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
178f0 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e  ults as a key in
17900 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
17910 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  le iParm.**.**  
17920 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20     SRT_Except   
17930 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74     Remove result
17940 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f  s from the tempo
17950 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
17960 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
17970 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72  Table       Stor
17980 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d  e results in tem
17990 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
179a0 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  rm.**.** The tab
179b0 6c 65 20 61 62 6f 76 65 20 69 73 20 69 6e 63 6f  le above is inco
179c0 6d 70 6c 65 74 65 2e 20 20 41 64 64 69 74 69 6f  mplete.  Additio
179d0 6e 61 6c 20 65 44 69 73 74 20 76 61 6c 75 65 20  nal eDist value 
179e0 68 61 76 65 20 62 65 20 61 64 64 65 64 0a 2a 2a  have be added.**
179f0 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6d 6d   since this comm
17a00 65 6e 74 20 77 61 73 20 77 72 69 74 74 65 6e 2e  ent was written.
17a10 20 20 53 65 65 20 74 68 65 20 73 65 6c 65 63 74    See the select
17a20 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63  InnerLoop() func
17a30 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20 63 6f  tion for.** a co
17a40 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e 67 20 6f  mplete listing o
17a50 66 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 76 61  f the allowed va
17a60 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20 61 6e  lues of eDest an
17a70 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67 73  d their meanings
17a80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
17a90 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
17aa0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
17ab0 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72  s.  If any error
17ac0 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74  s are.** encount
17ad0 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70  ered, then an ap
17ae0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
17af0 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
17b00 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  in.** pParse->zE
17b10 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrMsg..**.** Thi
17b20 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e  s routine does N
17b30 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65  OT free the Sele
17b40 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  ct structure pas
17b50 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20  sed in.  The.** 
17b60 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
17b70 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61   needs to do tha
17b80 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61  t..**.** The pPa
17b90 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c  rent, parentTab,
17ba0 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67 67   and *pParentAgg
17bb0 20 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c 6c   fields are fill
17bc0 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a  ed in if this.**
17bd0 20 53 45 4c 45 43 54 20 69 73 20 61 20 73 75 62   SELECT is a sub
17be0 71 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f 75  query.  This rou
17bf0 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f 20  tine may try to 
17c00 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45 4c  combine this SEL
17c10 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73 20  ECT.** with its 
17c20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61  parent to form a
17c30 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75 65   single flat que
17c40 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67  ry.  In so doing
17c50 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68  , it might.** ch
17c60 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74 20  ange the parent 
17c70 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e  query from a non
17c80 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20 61 6e  -aggregate to an
17c90 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
17ca0 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72 65  ..** For that re
17cb0 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65 6e  ason, the pParen
17cc0 74 41 67 67 20 66 6c 61 67 20 69 73 20 70 61 73  tAgg flag is pas
17cd0 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72  sed as a pointer
17ce0 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62  , so it.** can b
17cf0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  e changed..**.**
17d00 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54 68   Example 1:   Th
17d10 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
17d20 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74   pParent paramet
17d30 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  er..**.**    SEL
17d40 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f  ECT * FROM t1 JO
17d50 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63 6f  IN (SELECT x, co
17d60 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20  unt(*) FROM t2) 
17d70 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c  JOIN t3;.**    \
17d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d90 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73        \_______ s
17da0 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f  ubquery _______/
17db0 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20          /.**    
17dc0 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17df0 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20          /.**    
17e00 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
17e10 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
17e20 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
17e30 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54  _______/.**.** T
17e40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
17e50 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f 75  alled for the ou
17e60 74 65 72 20 71 75 65 72 79 20 66 69 72 73 74 2e  ter query first.
17e70 20 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c 6c     For that call
17e80 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69 6c  ,.** pParent wil
17e90 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69  l be NULL.  Duri
17ea0 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  ng the processin
17eb0 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  g of the outer q
17ec0 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72  uery, this .** r
17ed0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
17ee0 20 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20   recursively to 
17ef0 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71 75  handle the subqu
17f00 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72 65  ery.  For the re
17f10 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c  cursive.** call,
17f20 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f   pParent will po
17f30 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65 72  int to the outer
17f40 20 71 75 65 72 79 2e 20 20 42 65 63 61 75 73 65   query.  Because
17f50 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
17f60 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 65  .** the second e
17f70 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72 65  lement in a thre
17f80 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20  e-way join, the 
17f90 70 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d 65  parentTab parame
17fa0 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31  ter will.** be 1
17fb0 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65 20   (the 2nd value 
17fc0 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20 61  of a 0-indexed a
17fd0 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71  rray.).*/.int sq
17fe0 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50  lite3Select(.  P
17ff0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
18000 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
18010 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
18020 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
18030 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
18040 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
18050 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
18060 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
18070 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
18080 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  to dispose of th
18090 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
180a0 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20  nt iParm,       
180b0 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72 61 6d        /* A param
180c0 65 74 65 72 20 75 73 65 64 20 62 79 20 74 68 65  eter used by the
180d0 20 65 44 65 73 74 20 64 69 73 70 6f 73 61 6c 20   eDest disposal 
180e0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65 6c 65  method */.  Sele
180f0 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20  ct *pParent,    
18100 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
18110 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68 20 74  LECT for which t
18120 68 69 73 20 69 73 20 61 20 73 75 62 2d 71 75 65  his is a sub-que
18130 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65  ry */.  int pare
18140 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f  ntTab,         /
18150 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72 65  * Index in pPare
18160 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69 73  nt->pSrc of this
18170 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
18180 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 20 20 20  *pParentAgg,    
18190 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
181a0 61 72 65 6e 74 20 75 73 65 73 20 61 67 67 72 65  arent uses aggre
181b0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
181c0 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20  /.  char *aff   
181d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
181e0 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e   eDest is SRT_Un
181f0 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74  ion, the affinit
18200 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
18210 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
18220 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
18230 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
18240 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
18250 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66       /* Return f
18260 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65  rom sqlite3Where
18270 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62  Begin() */.  Vdb
18280 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
18290 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
182a0 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72  al machine under
182b0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
182c0 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20  .  int isAgg;   
182d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
182e0 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73  e for select lis
182f0 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a  ts like "count(*
18300 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  )" */.  ExprList
18310 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f   *pEList;      /
18320 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
18330 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f  s to extract. */
18340 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
18350 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  List;     /* Lis
18360 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  t of tables to s
18370 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  elect from */.  
18380 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
18390 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
183a0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
183b0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
183c0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
183d0 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  ;    /* The ORDE
183e0 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  R BY clause.  Ma
183f0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
18400 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
18410 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
18420 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
18430 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
18440 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
18450 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
18460 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
18470 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
18480 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20  nt isDistinct;  
18490 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
184a0 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
184b0 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
184c0 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
184d0 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ct;          /* 
184e0 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72  Table to use for
184f0 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
18500 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
18510 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
18520 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
18530 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
18540 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ion */.  int add
18550 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20  rSortIndex;     
18560 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e  /* Address of an
18570 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
18580 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
18590 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49  .  AggInfo sAggI
185a0 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66  nfo;      /* Inf
185b0 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79  ormation used by
185c0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
185d0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  es */.  int iEnd
185e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
185f0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
18600 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72   end of the quer
18610 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
18620 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
18630 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
18640 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64  nnection */..  d
18650 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
18660 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62    if( p==0 || db
18670 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
18680 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
18690 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
186a0 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
186b0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
186c0 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
186d0 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74  , 0, 0, 0) ) ret
186e0 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  urn 1;.  memset(
186f0 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69  &sAggInfo, 0, si
18700 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b  zeof(sAggInfo));
18710 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
18720 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
18730 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68  ELECT.  /* If th
18740 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71  ere is are a seq
18750 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73  uence of queries
18760 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72  , do the earlier
18770 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a   ones first..  *
18780 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
18790 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r ){.    if( p->
187a0 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b  pRightmost==0 ){
187b0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
187c0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  Loop;.      int 
187d0 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  cnt = 0;.      f
187e0 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f  or(pLoop=p; pLoo
187f0 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
18800 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a  pPrior, cnt++){.
18810 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70          pLoop->p
18820 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20  Rightmost = p;. 
18830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18840 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
18850 4f 55 4e 44 5f 53 45 4c 45 43 54 3e 30 20 26 26  OUND_SELECT>0 &&
18860 20 63 6e 74 3e 53 51 4c 49 54 45 5f 4d 41 58 5f   cnt>SQLITE_MAX_
18870 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
18880 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18890 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
188a0 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72  e, "too many ter
188b0 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64 20 53  ms in compound S
188c0 45 4c 45 43 54 22 29 3b 0a 20 20 20 20 20 20 20  ELECT");.       
188d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
188e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
188f0 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  urn multiSelect(
18900 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
18910 2c 20 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a 20  , iParm, aff);. 
18920 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 4f 72   }.#endif..  pOr
18930 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
18940 72 42 79 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72  rBy;.  if( Ignor
18950 61 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65 73  ableOrderby(eDes
18960 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72  t) ){.    p->pOr
18970 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  derBy = 0;.  }. 
18980 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
18990 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
189a0 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20 20 67  , p, 0) ){.    g
189b0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
189c0 20 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42    }.  p->pOrderB
189d0 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20  y = pOrderBy;.. 
189e0 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63   /* Make local c
189f0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72  opies of the par
18a00 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73  ameters for this
18a10 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
18a20 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
18a30 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  c;.  pWhere = p-
18a40 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75  >pWhere;.  pGrou
18a50 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
18a60 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70  y;.  pHaving = p
18a70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 41  ->pHaving;.  isA
18a80 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20  gg = p->isAgg;. 
18a90 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d   isDistinct = p-
18aa0 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70  >isDistinct;.  p
18ab0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
18ac0 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d  t;.  if( pEList=
18ad0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
18ae0 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  _end;..  /* .  *
18af0 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74  * Do not even at
18b00 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74  tempt to generat
18b10 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65  e any code if we
18b20 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65   have already se
18b30 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62  en.  ** errors b
18b40 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
18b50 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a  ne starts..  */.
18b60 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
18b70 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  rr>0 ) goto sele
18b80 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66  ct_end;..  /* If
18b90 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f   writing to memo
18ba0 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  ry or generating
18bb0 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79   a set.  ** only
18bc0 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
18bd0 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a   may be output..
18be0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
18bf0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
18c00 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72  Y.  if( checkFor
18c10 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63  MultiColumnSelec
18c20 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 65  tError(pParse, e
18c30 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Dest, pEList->nE
18c40 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  xpr) ){.    goto
18c50 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
18c60 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 52  .#endif..  /* OR
18c70 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65  DER BY is ignore
18c80 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69  d for some desti
18c90 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nations..  */.  
18ca0 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64  if( IgnorableOrd
18cb0 65 72 62 79 28 65 44 65 73 74 29 20 29 7b 0a 20  erby(eDest) ){. 
18cc0 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
18cd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
18ce0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   generating code
18cf0 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
18d00 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
18d10 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
18d20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
18d30 64 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  d;..  /* Generat
18d40 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73  e code for all s
18d50 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68  ub-queries in th
18d60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
18d70 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
18d80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
18d90 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
18da0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
18db0 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  EW).  for(i=0; i
18dc0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
18dd0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
18de0 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74   char *zSavedAut
18df0 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20  hContext = 0;.  
18e00 20 20 69 6e 74 20 6e 65 65 64 52 65 73 74 6f 72    int needRestor
18e10 65 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 73 74  eContext;.    st
18e20 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
18e30 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
18e40 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 0a 20 20 20  List->a[i];..   
18e50 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
18e60 65 63 74 3d 3d 30 20 7c 7c 20 70 49 74 65 6d 2d  ect==0 || pItem-
18e70 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 29 20 63  >isPopulated ) c
18e80 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
18e90 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30   pItem->zName!=0
18ea0 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64   ){.      zSaved
18eb0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50  AuthContext = pP
18ec0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
18ed0 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  xt;.      pParse
18ee0 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
18ef0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20   pItem->zName;. 
18f00 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65       needRestore
18f10 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20  Context = 1;.   
18f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65   }else{.      ne
18f30 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
18f40 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 69 66 20   = 0;.    }.#if 
18f50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
18f60 45 53 54 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  EST) || SQLITE_M
18f70 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
18f80 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
18f90 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62   Parse.nHeight b
18fa0 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20  y the height of 
18fb0 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72  the largest expr
18fc0 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72  ession.    ** tr
18fd0 65 65 20 72 65 66 65 72 65 64 20 74 6f 20 62 79  ee refered to by
18fe0 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e   this, the paren
18ff0 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68  t select. The ch
19000 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a  ild select.    *
19010 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78  * may contain ex
19020 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f  pression trees o
19030 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a  f at most.    **
19040 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50   (SQLITE_MAX_EXP
19050 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48  R_DEPTH-Parse.nH
19060 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54  eight) height. T
19070 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20  his is a bit.   
19080 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76   ** more conserv
19090 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73  ative than neces
190a0 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65  sary, but much e
190b0 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72  asier than enfor
190c0 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65  cing.    ** an e
190d0 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20  xact limit..    
190e0 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
190f0 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65  Height += sqlite
19100 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
19110 74 28 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  t(p);.#endif.   
19120 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
19130 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
19140 65 6c 65 63 74 2c 20 53 52 54 5f 45 70 68 65 6d  elect, SRT_Ephem
19150 54 61 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Tab, .          
19160 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43         pItem->iC
19170 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26 69 73  ursor, p, i, &is
19180 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  Agg, 0);.    if(
19190 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
191a0 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  d ){.      goto 
191b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
191c0 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  }.#if defined(SQ
191d0 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 53 51  LITE_TEST) || SQ
191e0 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
191f0 50 54 48 3e 30 0a 20 20 20 20 70 50 61 72 73 65  PTH>0.    pParse
19200 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c  ->nHeight -= sql
19210 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
19220 69 67 68 74 28 70 29 3b 0a 23 65 6e 64 69 66 0a  ight(p);.#endif.
19230 20 20 20 20 69 66 28 20 6e 65 65 64 52 65 73 74      if( needRest
19240 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20  oreContext ){.  
19250 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
19260 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
19270 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  dAuthContext;.  
19280 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74    }.    pTabList
19290 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
192a0 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
192b0 72 65 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e  re;.    if( !Ign
192c0 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 65 44  orableOrderby(eD
192d0 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70 4f  est) ){.      pO
192e0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
192f0 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  erBy;.    }.    
19300 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
19310 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61 76  roupBy;.    pHav
19320 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67  ing = p->pHaving
19330 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63 74  ;.    isDistinct
19340 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
19350 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
19360 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  /* Check for the
19370 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   special case of
19380 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28   a min() or max(
19390 29 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 69 74  ) function by it
193a0 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65  self.  ** in the
193b0 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a   result set..  *
193c0 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d 69  /.  if( simpleMi
193d0 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72 73 65  nMaxQuery(pParse
193e0 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72  , p, eDest, iPar
193f0 6d 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30  m) ){.    rc = 0
19400 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  ;.    goto selec
19410 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
19420 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
19430 20 74 68 69 73 20 69 73 20 61 20 73 75 62 71 75   this is a subqu
19440 65 72 79 20 74 68 61 74 20 63 61 6e 20 62 65 20  ery that can be 
19450 22 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f  "flattened" into
19460 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a   its parent..  *
19470 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
19480 69 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c  is a possiblity,
19490 20 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72   do so and retur
194a0 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20  n immediately.  
194b0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
194c0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
194d0 20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20   if( pParent && 
194e0 70 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20  pParentAgg &&.  
194f0 20 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75      flattenSubqu
19500 65 72 79 28 64 62 2c 20 70 50 61 72 65 6e 74 2c  ery(db, pParent,
19510 20 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61   parentTab, *pPa
19520 72 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20  rentAgg, isAgg) 
19530 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67  ){.    if( isAgg
19540 20 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d   ) *pParentAgg =
19550 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   1;.    goto sel
19560 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e  ect_end;.  }.#en
19570 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73  dif..  /* If pos
19580 73 69 62 6c 65 2c 20 72 65 77 72 69 74 65 20 74  sible, rewrite t
19590 68 65 20 71 75 65 72 79 20 74 6f 20 75 73 65 20  he query to use 
195a0 47 52 4f 55 50 20 42 59 20 69 6e 73 74 65 61 64  GROUP BY instead
195b0 20 6f 66 20 44 49 53 54 49 4e 43 54 2e 0a 20 20   of DISTINCT..  
195c0 2a 2a 20 47 52 4f 55 50 20 42 59 20 6d 61 79 20  ** GROUP BY may 
195d0 75 73 65 20 61 6e 20 69 6e 64 65 78 2c 20 44 49  use an index, DI
195e0 53 54 49 4e 43 54 20 6e 65 76 65 72 20 64 6f 65  STINCT never doe
195f0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
19600 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 21  >isDistinct && !
19610 70 2d 3e 69 73 41 67 67 20 26 26 20 21 70 2d 3e  p->isAgg && !p->
19620 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
19630 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
19640 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
19650 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  (db, p->pEList);
19660 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
19670 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
19680 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d   p->isDistinct =
19690 20 30 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e   0;.    isDistin
196a0 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ct = 0;.  }..  /
196b0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
196c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
196d0 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74  , then this sort
196e0 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d  ing.  ** index m
196f0 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e  ight end up bein
19700 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20  g unused if the 
19710 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a  data can be .  *
19720 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70  * extracted in p
19730 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  re-sorted order.
19740 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65    If that is the
19750 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a   case, then the.
19760 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65    ** OP_OpenEphe
19770 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
19780 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  n will be change
19790 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20  d to an OP_Noop 
197a0 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67  once.  ** we fig
197b0 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65  ure out that the
197c0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
197d0 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54  s not needed.  T
197e0 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  he addrSortIndex
197f0 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69  .  ** variable i
19800 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69  s used to facili
19810 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65  tate that change
19820 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
19830 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79  derBy ){.    Key
19840 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
19850 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
19860 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 67 6f  nErr ){.      go
19870 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
19880 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 49 6e 66     }.    pKeyInf
19890 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
198a0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
198b0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70  pOrderBy);.    p
198c0 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
198d0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
198e0 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f  ++;.    p->addrO
198f0 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64  penEphm[2] = add
19900 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20  rSortIndex =.   
19910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
19920 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  3(v, OP_OpenEphe
19930 6d 65 72 61 6c 2c 20 70 4f 72 64 65 72 42 79 2d  meral, pOrderBy-
19940 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65  >iECursor, pOrde
19950 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 20 20  rBy->nExpr+2,   
19960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19970 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
19980 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P3_KEYINFO_HA
19990 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b  NDOFF);.  }else{
199a0 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e 64  .    addrSortInd
199b0 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ex = -1;.  }..  
199c0 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
199d0 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
199e0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
199f0 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
19a00 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
19a10 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
19a20 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
19a30 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
19a40 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
19a50 20 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e   iParm, pEList->
19a60 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nExpr);.  }..  /
19a70 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
19a80 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d  r..  */.  iEnd =
19a90 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19aa0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70  Label(v);.  comp
19ab0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
19ac0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e  s(pParse, p, iEn
19ad0 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61  d);..  /* Open a
19ae0 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
19af0 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
19b00 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
19b10 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63  .  if( isDistinc
19b20 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  t ){.    KeyInfo
19b30 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
19b40 61 73 73 65 72 74 28 20 69 73 41 67 67 20 7c 7c  assert( isAgg ||
19b50 20 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20   pGroupBy );.   
19b60 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72   distinct = pPar
19b70 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
19b80 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
19b90 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
19ba0 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
19bb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19bc0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
19bd0 45 70 68 65 6d 65 72 61 6c 2c 20 64 69 73 74 69  Ephemeral, disti
19be0 6e 63 74 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  nct, 0, .       
19bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c00 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
19c10 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
19c20 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DOFF);.  }else{.
19c30 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d      distinct = -
19c40 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67  1;.  }..  /* Agg
19c50 72 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61  regate and non-a
19c60 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
19c70 20 61 72 65 20 68 61 6e 64 6c 65 64 20 64 69 66   are handled dif
19c80 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66  ferently */.  if
19c90 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f  ( !isAgg && pGro
19ca0 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  upBy==0 ){.    /
19cb0 2a 20 54 68 69 73 20 63 61 73 65 20 69 73 20 66  * This case is f
19cc0 6f 72 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  or non-aggregate
19cd0 20 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2a 20   queries.    ** 
19ce0 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
19cf0 73 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20  se scan.    */. 
19d00 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
19d10 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
19d20 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
19d30 70 57 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42  pWhere, &pOrderB
19d40 79 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  y);.    if( pWIn
19d50 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
19d60 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a  ect_end;..    /*
19d70 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65   If sorting inde
19d80 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74  x that was creat
19d90 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50  ed by a prior OP
19da0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a  _OpenEphemeral .
19db0 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
19dc0 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20  on ended up not 
19dd0 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68  being needed, th
19de0 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  en change the OP
19df0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20  _OpenEphemeral. 
19e00 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50     ** into an OP
19e10 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Noop..    */.  
19e20 20 20 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e    if( addrSortIn
19e30 64 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72  dex>=0 && pOrder
19e40 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  By==0 ){.      s
19e50 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
19e60 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f  ToNoop(v, addrSo
19e70 72 74 49 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20  rtIndex, 1);.   
19e80 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
19e90 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[2] = -1;.    
19ea0 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  }..    /* Use th
19eb0 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
19ec0 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20   loop.    */.   
19ed0 20 61 73 73 65 72 74 28 21 69 73 44 69 73 74 69   assert(!isDisti
19ee0 6e 63 74 29 3b 0a 20 20 20 20 69 66 28 20 73 65  nct);.    if( se
19ef0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
19f00 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
19f10 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
19f20 20 2d 31 2c 20 65 44 65 73 74 2c 0a 20 20 20 20   -1, eDest,.    
19f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f40 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69  iParm, pWInfo->i
19f50 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f  Continue, pWInfo
19f60 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66 29 20 29  ->iBreak, aff) )
19f70 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  {.       goto se
19f80 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
19f90 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  .    /* End the 
19fa0 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
19fb0 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  op..    */.    s
19fc0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
19fd0 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  WInfo);.  }else{
19fe0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
19ff0 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66  the processing f
1a000 6f 72 20 61 67 67 72 65 67 61 74 65 20 71 75 65  or aggregate que
1a010 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65  ries */.    Name
1a020 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
1a030 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
1a040 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61  for processing a
1a050 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61  ggregate informa
1a060 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tion */.    int 
1a070 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iAMem;          
1a080 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
1a090 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67  ress for storing
1a0a0 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
1a0b0 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d  Y */.    int iBM
1a0c0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
1a0d0 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
1a0e0 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47  s for previous G
1a0f0 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
1a100 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20  nt iUseFlag;    
1a110 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
1a120 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69  s holding flag i
1a130 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61  ndicating that a
1a140 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20  t least.        
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a160 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  ** one row of th
1a170 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61  e input to the a
1a180 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65  ggregator has be
1a190 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  en.             
1a1a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72             ** pr
1a1b0 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69  ocessed */.    i
1a1c0 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20  nt iAbortFlag;  
1a1d0 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
1a1e0 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71  s which causes q
1a1f0 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f  uery abort if po
1a200 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e  sitive */.    in
1a210 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20  t groupBySort;  
1a220 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66    /* Rows come f
1a230 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52  rom source in GR
1a240 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a  OUP BY order */.
1a250 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ..    /* The fol
1a260 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73  lowing variables
1a270 20 68 6f 6c 64 20 61 64 64 72 65 73 73 65 73 20   hold addresses 
1a280 6f 72 20 6c 61 62 65 6c 73 20 66 6f 72 20 70 61  or labels for pa
1a290 72 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  rts of the.    *
1a2a0 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
1a2b0 65 20 70 72 6f 67 72 61 6d 20 77 65 20 61 72 65  e program we are
1a2c0 20 70 75 74 74 69 6e 67 20 74 6f 67 65 74 68 65   putting togethe
1a2d0 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
1a2e0 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 20 20  rOutputRow;     
1a2f0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62   /* Start of sub
1a300 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
1a310 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f  puts a result ro
1a320 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  w */.    int add
1a330 72 53 65 74 41 62 6f 72 74 3b 20 20 20 20 20 20  rSetAbort;      
1a340 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72   /* Set the abor
1a350 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72  t flag and retur
1a360 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  n */.    int add
1a370 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 3b  rInitializeLoop;
1a380 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64   /* Start of cod
1a390 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a  e that initializ
1a3a0 65 73 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  es the input loo
1a3b0 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  p */.    int add
1a3c0 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20 20 20  rTopOfLoop;     
1a3d0 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
1a3e0 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
1a3f0 20 69 6e 74 20 61 64 64 72 47 72 6f 75 70 42 79   int addrGroupBy
1a400 43 68 61 6e 67 65 3b 20 20 2f 2a 20 43 6f 64 65  Change;  /* Code
1a410 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 20   that runs when 
1a420 61 6e 79 20 47 52 4f 55 50 20 42 59 20 74 65 72  any GROUP BY ter
1a430 6d 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20  m changes */.   
1a440 20 69 6e 74 20 61 64 64 72 50 72 6f 63 65 73 73   int addrProcess
1a450 52 6f 77 3b 20 20 20 20 20 2f 2a 20 43 6f 64 65  Row;     /* Code
1a460 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 73 69   to process a si
1a470 6e 67 6c 65 20 69 6e 70 75 74 20 72 6f 77 20 2a  ngle input row *
1a480 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e  /.    int addrEn
1a490 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
1a4a0 20 45 6e 64 20 6f 66 20 61 6c 6c 20 70 72 6f 63   End of all proc
1a4b0 65 73 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  essing */.    in
1a4c0 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  t addrSortingIdx
1a4d0 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f  ;     /* The OP_
1a4e0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f  OpenEphemeral fo
1a4f0 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
1a500 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  dex */.    int a
1a510 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 20  ddrReset;       
1a520 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
1a530 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74   for resetting t
1a540 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a  he accumulator *
1a550 2f 0a 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d  /..    addrEnd =
1a560 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1a570 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
1a580 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c  * Convert TK_COL
1a590 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54  UMN nodes into T
1a5a0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64  K_AGG_COLUMN and
1a5b0 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e   make entries in
1a5c0 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f  .    ** sAggInfo
1a5d0 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f   for all TK_AGG_
1a5e0 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69  FUNCTION nodes i
1a5f0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  n expressions of
1a600 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45   the.    ** SELE
1a610 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
1a620 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
1a630 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
1a640 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
1a650 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
1a660 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
1a670 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20   = pTabList;.   
1a680 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20   sNC.pAggInfo = 
1a690 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73  &sAggInfo;.    s
1a6a0 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
1a6b0 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42  Column = pGroupB
1a6c0 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y ? pGroupBy->nE
1a6d0 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73  xpr+1 : 0;.    s
1a6e0 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79  AggInfo.pGroupBy
1a6f0 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20   = pGroupBy;.   
1a700 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1a710 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
1a720 73 4e 43 2c 20 70 45 4c 69 73 74 29 20 29 7b 0a  sNC, pEList) ){.
1a730 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
1a740 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
1a750 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1a760 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
1a770 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 20 29  sNC, pOrderBy) )
1a780 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
1a790 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
1a7a0 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 26     if( pHaving &
1a7b0 26 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  & sqlite3ExprAna
1a7c0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26  lyzeAggregates(&
1a7d0 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 20 29 7b  sNC, pHaving) ){
1a7e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
1a7f0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
1a800 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75    sAggInfo.nAccu
1a810 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e  mulator = sAggIn
1a820 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  fo.nColumn;.    
1a830 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
1a840 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  nfo.nFunc; i++){
1a850 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1a860 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1a870 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49  List(&sNC, sAggI
1a880 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
1a890 70 72 2d 3e 70 4c 69 73 74 29 20 29 7b 0a 20 20  pr->pList) ){.  
1a8a0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
1a8b0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
1a8c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
1a8d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1a8e0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1a8f0 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73  ..    /* Process
1a900 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
1a910 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59  es with GROUP BY
1a920 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65   is very differe
1a930 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75  nt and.    ** mu
1a940 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20  ch more complex 
1a950 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20  than aggregates 
1a960 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20  without a GROUP 
1a970 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  BY..    */.    i
1a980 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
1a990 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
1a9a0 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69  eyInfo;  /* Keyi
1a9b0 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
1a9c0 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20  or the group by 
1a9d0 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 20 20 20  clause */..     
1a9e0 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c   /* Create label
1a9f0 73 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  s that we will b
1aa00 65 20 6e 65 65 64 69 6e 67 0a 20 20 20 20 20 20  e needing.      
1aa10 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 20 61  */.     .      a
1aa20 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f  ddrInitializeLoo
1aa30 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  p = sqlite3VdbeM
1aa40 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1aa50 20 20 20 61 64 64 72 47 72 6f 75 70 42 79 43 68     addrGroupByCh
1aa60 61 6e 67 65 20 3d 20 73 71 6c 69 74 65 33 56 64  ange = sqlite3Vd
1aa70 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1aa80 20 20 20 20 20 20 61 64 64 72 50 72 6f 63 65 73        addrProces
1aa90 73 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  sRow = sqlite3Vd
1aaa0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1aab0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1aac0 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59  re is a GROUP BY
1aad0 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74   clause we might
1aae0 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20   need a sorting 
1aaf0 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a  index to.      *
1ab00 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20  * implement it. 
1ab10 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73   Allocate that s
1ab20 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77  orting index now
1ab30 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f  .  If it turns o
1ab40 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ut.      ** that
1ab50 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20   we do not need 
1ab60 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68  it after all, th
1ab70 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  e OpenEphemeral 
1ab80 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20  instruction.    
1ab90 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e    ** will be con
1aba0 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f  verted into a No
1abb0 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20  op.  .      */. 
1abc0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
1abd0 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73  rtingIdx = pPars
1abe0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
1abf0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
1ac00 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
1ac10 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
1ac20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72  );.      addrSor
1ac30 74 69 6e 67 49 64 78 20 3d 0a 20 20 20 20 20 20  tingIdx =.      
1ac40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
1ac50 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p3(v, OP_OpenEph
1ac60 65 6d 65 72 61 6c 2c 20 73 41 67 67 49 6e 66 6f  emeral, sAggInfo
1ac70 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20  .sortingIdx,.   
1ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac90 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e        sAggInfo.n
1aca0 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 0a 20  SortingColumn,. 
1acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acc0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1acd0 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49  KeyInfo, P3_KEYI
1ace0 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20  NFO_HANDOFF);.. 
1acf0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69       /* Initiali
1ad00 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ze memory locati
1ad10 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55  ons used by GROU
1ad20 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70  P BY aggregate p
1ad30 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20  rocessing.      
1ad40 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61  */.      iUseFla
1ad50 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
1ad60 2b 2b 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74  ++;.      iAbort
1ad70 46 6c 61 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Flag = pParse->n
1ad80 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 41 4d  Mem++;.      iAM
1ad90 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
1ada0 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  m;.      pParse-
1adb0 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
1adc0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
1add0 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iBMem = pParse->
1ade0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72  nMem;.      pPar
1adf0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
1ae00 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
1ae10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ae20 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74  dOp(v, OP_MemInt
1ae30 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 0, iAbortFlag)
1ae40 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1ae50 65 6e 74 28 28 76 2c 20 22 23 20 63 6c 65 61 72  ent((v, "# clear
1ae60 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
1ae70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ae80 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
1ae90 49 6e 74 2c 20 30 2c 20 69 55 73 65 46 6c 61 67  Int, 0, iUseFlag
1aea0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1aeb0 6d 65 6e 74 28 28 76 2c 20 22 23 20 69 6e 64 69  ment((v, "# indi
1aec0 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  cate accumulator
1aed0 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20   empty"));.     
1aee0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1aef0 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
1af00 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c   addrInitializeL
1af10 6f 6f 70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  oop);..      /* 
1af20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1af30 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
1af40 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ts a single row 
1af50 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
1af60 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69      ** set.  Thi
1af70 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72  s subroutine fir
1af80 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  st looks at the 
1af90 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55  iUseFlag.  If iU
1afa0 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20  seFlag.      ** 
1afb0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
1afc0 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
1afd0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73  he subroutine is
1afe0 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20   a no-op.  If.  
1aff0 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
1b000 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20  ssing calls for 
1b010 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f  the query to abo
1b020 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  rt, this subrout
1b030 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63  ine.      ** inc
1b040 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f  rements the iAbo
1b050 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f  rtFlag memory lo
1b060 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65  cation before re
1b070 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20  turning in.     
1b080 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67   ** order to sig
1b090 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74  nal the caller t
1b0a0 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a  o abort..      *
1b0b0 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41  /.      addrSetA
1b0c0 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  bort = sqlite3Vd
1b0d0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1b0e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1b0f0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
1b100 65 6d 49 6e 74 2c 20 31 2c 20 69 41 62 6f 72 74  emInt, 1, iAbort
1b110 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
1b120 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
1b130 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29  set abort flag")
1b140 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b150 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1b160 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20  Return, 0, 0);. 
1b170 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
1b180 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
1b190 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1b1a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b1b0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d  eAddOp(v, OP_IfM
1b1c0 65 6d 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c  emPos, iUseFlag,
1b1d0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32   addrOutputRow+2
1b1e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1b1f0 6d 65 6e 74 28 28 76 2c 20 22 23 20 47 72 6f 75  ment((v, "# Grou
1b200 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
1b210 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74  ator entry point
1b220 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1b230 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1b240 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b  P_Return, 0, 0);
1b250 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41  .      finalizeA
1b260 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
1b270 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
1b280 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e        if( pHavin
1b290 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
1b2a0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1b2b0 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
1b2c0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31   addrOutputRow+1
1b2d0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
1b2e0 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49      rc = selectI
1b2f0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
1b300 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30   p, p->pEList, 0
1b310 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20  , 0, pOrderBy,. 
1b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b330 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e            distin
1b340 63 74 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  ct, eDest, iParm
1b350 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
1b370 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61  drOutputRow+1, a
1b380 64 64 72 53 65 74 41 62 6f 72 74 2c 20 61 66 66  ddrSetAbort, aff
1b390 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1b3a0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1b3b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
1b3c0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1b3d0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1b3e0 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a  _Return, 0, 0);.
1b3f0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1b400 74 28 28 76 2c 20 22 23 20 65 6e 64 20 67 72 6f  t((v, "# end gro
1b410 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
1b420 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  rator"));..     
1b430 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1b440 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
1b450 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72  ill reset the gr
1b460 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74  oup-by accumulat
1b470 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  or.      */.    
1b480 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71    addrReset = sq
1b490 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1b4a0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 72  Addr(v);.      r
1b4b0 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
1b4c0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
1b4d0 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
1b4e0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1b4f0 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a  _Return, 0, 0);.
1b500 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  .      /* Begin 
1b510 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
1b520 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75   extract all sou
1b530 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55  rce rows in GROU
1b540 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20  P BY order..    
1b550 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
1b560 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61  involve two sepa
1b570 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20  rate loops with 
1b580 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65  an OP_Sort in be
1b590 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20  tween, or.      
1b5a0 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ** it might be a
1b5b0 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61   single loop tha
1b5c0 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20  t uses an index 
1b5d0 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72  to extract infor
1b5e0 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  mation.      ** 
1b5f0 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64  in the right ord
1b600 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68  er to begin with
1b610 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1b620 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1b630 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
1b640 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b  InitializeLoop);
1b650 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1b660 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
1b670 73 75 62 2c 20 30 2c 20 61 64 64 72 52 65 73 65  sub, 0, addrRese
1b680 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  t);.      pWInfo
1b690 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
1b6a0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
1b6b0 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26  bList, pWhere, &
1b6c0 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20  pGroupBy);.     
1b6d0 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
1b6e0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1b6f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f  ;.      if( pGro
1b700 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  upBy==0 ){.     
1b710 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69     /* The optimi
1b720 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64  zer is able to d
1b730 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67  eliver rows in g
1b740 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f  roup by order so
1b750 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64  .        ** we d
1b760 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f  o not have to so
1b770 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e  rt.  The OP_Open
1b780 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  Ephemeral table 
1b790 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
1b7a0 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74  ** cancelled lat
1b7b0 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74  er because we st
1b7c0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20  ill need to use 
1b7d0 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20  the pKeyInfo.   
1b7e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1b7f0 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
1b800 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
1b810 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b  groupBySort = 0;
1b820 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b830 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72        /* Rows ar
1b840 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20  e coming out in 
1b850 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64  undetermined ord
1b860 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  er.  We have to 
1b870 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  push.        ** 
1b880 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20  each row into a 
1b890 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74  sorting index, t
1b8a0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72  erminate the fir
1b8b0 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  st loop,.       
1b8c0 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76   ** then loop ov
1b8d0 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  er the sorting i
1b8e0 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f  ndex in order to
1b8f0 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a   get the output.
1b900 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f          ** in so
1b910 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20  rted order.     
1b920 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72     */.        gr
1b930 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20  oupBySort = 1;. 
1b940 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1b950 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
1b960 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29  Parse, pGroupBy)
1b970 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1b980 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1b990 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49  _Sequence, sAggI
1b9a0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
1b9b0 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  0);.        j = 
1b9c0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b  pGroupBy->nExpr+
1b9d0 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  1;.        for(i
1b9e0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
1b9f0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
1ba00 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
1ba10 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
1ba20 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f   = &sAggInfo.aCo
1ba30 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
1ba40 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
1ba50 72 43 6f 6c 75 6d 6e 3c 6a 20 29 20 63 6f 6e 74  rColumn<j ) cont
1ba60 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1ba70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1ba80 65 74 43 6f 6c 75 6d 6e 28 76 2c 20 70 43 6f 6c  etColumn(v, pCol
1ba90 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43  ->pTab, pCol->iC
1baa0 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61  olumn, pCol->iTa
1bab0 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ble);.          
1bac0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  j++;.        }. 
1bad0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1bae0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
1baf0 6b 65 52 65 63 6f 72 64 2c 20 6a 2c 20 30 29 3b  keRecord, j, 0);
1bb00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1bb10 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1bb20 49 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49  IdxInsert, sAggI
1bb30 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
1bb40 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
1bb50 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
1bb60 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  fo);.        sql
1bb70 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1bb80 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e   OP_Sort, sAggIn
1bb90 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
1bba0 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20  ddrEnd);.       
1bbb0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1bbc0 20 22 23 20 47 52 4f 55 50 20 42 59 20 73 6f 72   "# GROUP BY sor
1bbd0 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41  t"));.        sA
1bbe0 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e  ggInfo.useSortin
1bbf0 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  gIdx = 1;.      
1bc00 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c  }..      /* Eval
1bc10 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  uate the current
1bc20 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
1bc30 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c  and store in b0,
1bc40 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20   b1, b2....     
1bc50 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72   ** (b0 is memor
1bc60 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d  y location iBMem
1bc70 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b  +0, b1 is iBMem+
1bc80 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  1, and so forth)
1bc90 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63  .      ** Then c
1bca0 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65  ompare the curre
1bcb0 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
1bcc0 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52  s against the GR
1bcd0 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20  OUP BY terms.   
1bce0 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70     ** from the p
1bcf0 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72  revious row curr
1bd00 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
1bd10 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20  a0, a1, a2....  
1bd20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
1bd30 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c  rTopOfLoop = sql
1bd40 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1bd50 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f  ddr(v);.      fo
1bd60 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
1bd70 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
1bd80 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75          if( grou
1bd90 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
1bda0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1bdb0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
1bdc0 6d 6e 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  mn, sAggInfo.sor
1bdd0 74 69 6e 67 49 64 78 2c 20 6a 29 3b 0a 20 20 20  tingIdx, j);.   
1bde0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1bdf0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64        sAggInfo.d
1be00 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
1be10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1be20 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1be30 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e   pGroupBy->a[j].
1be40 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1be50 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
1be60 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1be70 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 42 4d 65 6d  _MemStore, iBMem
1be80 2b 6a 2c 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  +j, j<pGroupBy->
1be90 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20  nExpr-1);.      
1bea0 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 47  }.      for(j=pG
1beb0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 3b  roupBy->nExpr-1;
1bec0 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20   j>=0; j--){.   
1bed0 20 20 20 20 20 69 66 28 20 6a 3c 70 47 72 6f 75       if( j<pGrou
1bee0 70 42 79 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a  pBy->nExpr-1 ){.
1bef0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1bf00 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1bf10 5f 4d 65 6d 4c 6f 61 64 2c 20 69 42 4d 65 6d 2b  _MemLoad, iBMem+
1bf20 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  j, 0);.        }
1bf30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1bf40 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1bf50 4d 65 6d 4c 6f 61 64 2c 20 69 41 4d 65 6d 2b 6a  MemLoad, iAMem+j
1bf60 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
1bf70 28 20 6a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( j==0 ){.      
1bf80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bf90 64 64 4f 70 28 76 2c 20 4f 50 5f 45 71 2c 20 30  ddOp(v, OP_Eq, 0
1bfa0 78 32 30 30 2c 20 61 64 64 72 50 72 6f 63 65 73  x200, addrProces
1bfb0 73 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d  sRow);.        }
1bfc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1bfd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bfe0 28 76 2c 20 4f 50 5f 4e 65 2c 20 30 78 32 30 30  (v, OP_Ne, 0x200
1bff0 2c 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61  , addrGroupByCha
1c000 6e 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nge);.        }.
1c010 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1c020 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
1c030 31 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e  1, (void*)pKeyIn
1c040 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 2c 20 50 33  fo->aColl[j], P3
1c050 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
1c060 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e   }..      /* Gen
1c070 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1c080 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68  runs whenever th
1c090 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67  e GROUP BY chang
1c0a0 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61  es..      ** Cha
1c0b0 6e 67 65 20 69 6e 20 74 68 65 20 47 52 4f 55 50  nge in the GROUP
1c0c0 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64   BY are detected
1c0d0 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
1c0e0 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62   code.      ** b
1c0f0 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20  lock.  If there 
1c100 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c  were no changes,
1c110 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73   this block is s
1c120 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  kipped..      **
1c130 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63  .      ** This c
1c140 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65  ode copies curre
1c150 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d  nt group by term
1c160 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e  s in b0,b1,b2,..
1c170 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20  ..      ** over 
1c180 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74  to a0,a1,a2.  It
1c190 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20   then calls the 
1c1a0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
1c1b0 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  e.      ** and r
1c1c0 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67  esets the aggreg
1c1d0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
1c1e0 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65  registers in pre
1c1f0 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  paration.      *
1c200 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47  * for the next G
1c210 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20  ROUP BY batch.. 
1c220 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
1c230 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1c240 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 47 72 6f  Label(v, addrGro
1c250 75 70 42 79 43 68 61 6e 67 65 29 3b 0a 20 20 20  upByChange);.   
1c260 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47     for(j=0; j<pG
1c270 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a  roupBy->nExpr; j
1c280 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
1c290 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1c2a0 20 4f 50 5f 4d 65 6d 4d 6f 76 65 2c 20 69 41 4d   OP_MemMove, iAM
1c2b0 65 6d 2b 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  em+j, iBMem+j);.
1c2c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1c2d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1c2e0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61  , OP_Gosub, 0, a
1c2f0 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
1c300 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1c310 28 28 76 2c 20 22 23 20 6f 75 74 70 75 74 20 6f  ((v, "# output o
1c320 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20  ne row"));.     
1c330 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c340 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73  p(v, OP_IfMemPos
1c350 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64  , iAbortFlag, ad
1c360 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64  drEnd);.      Vd
1c370 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
1c380 20 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61   check abort fla
1c390 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
1c3a0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1c3b0 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64  OP_Gosub, 0, add
1c3c0 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56  rReset);.      V
1c3d0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1c3e0 23 20 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61  # reset accumula
1c3f0 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
1c400 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67  * Update the agg
1c410 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
1c420 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ors based on the
1c430 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20   content of.    
1c440 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
1c450 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20   row.      */.  
1c460 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1c470 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
1c480 64 64 72 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a  ddrProcessRow);.
1c490 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
1c4a0 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
1c4b0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
1c4c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c4d0 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c  Op(v, OP_MemInt,
1c4e0 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   1, iUseFlag);. 
1c4f0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1c500 28 28 76 2c 20 22 23 20 69 6e 64 69 63 61 74 65  ((v, "# indicate
1c510 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c   data in accumul
1c520 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
1c530 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f  /* End of the lo
1c540 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  op.      */.    
1c550 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
1c560 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1c570 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1c580 20 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e   OP_Next, sAggIn
1c590 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
1c5a0 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20  ddrTopOfLoop);. 
1c5b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c5c0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1c5d0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
1c5e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c5f0 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
1c600 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20  addrSortingIdx, 
1c610 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
1c620 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65     /* Output the
1c630 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65   final row of re
1c640 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sult.      */.  
1c650 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c660 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62  ddOp(v, OP_Gosub
1c670 2c 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52  , 0, addrOutputR
1c680 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
1c690 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6f 75  omment((v, "# ou
1c6a0 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29  tput final row")
1c6b0 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 20  );.      .    } 
1c6c0 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42  /* endif pGroupB
1c6d0 79 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a  y */.    else {.
1c6e0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
1c6f0 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61  se runs if the a
1c700 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20  ggregate has no 
1c710 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
1c720 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 70    The.      ** p
1c730 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63  rocessing is muc
1c740 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20  h simpler since 
1c750 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
1c760 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20  single row.     
1c770 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20   ** of output.. 
1c780 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
1c790 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
1c7a0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
1c7b0 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
1c7c0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
1c7d0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
1c7e0 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30 29  List, pWhere, 0)
1c7f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
1c800 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
1c810 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 75  ect_end;.      u
1c820 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
1c830 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
1c840 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
1c850 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
1c860 6f 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69  o);.      finali
1c870 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
1c880 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
1c890 29 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  );.      pOrderB
1c8a0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  y = 0;.      if(
1c8b0 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
1c8c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1c8d0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1c8e0 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c  Having, addrEnd,
1c8f0 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
1c900 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
1c910 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
1c920 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30  >pEList, 0, 0, 0
1c930 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  , -1, .         
1c940 20 20 20 20 20 20 20 20 20 20 20 20 20 65 44 65               eDe
1c950 73 74 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 45  st, iParm, addrE
1c960 6e 64 2c 20 61 64 64 72 45 6e 64 2c 20 61 66 66  nd, addrEnd, aff
1c970 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1c980 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1c990 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29  abel(v, addrEnd)
1c9a0 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e  ;.    .  } /* en
1c9b0 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75  dif aggregate qu
1c9c0 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ery */..  /* If 
1c9d0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
1c9e0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
1c9f0 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72  n we need to sor
1ca00 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  t the results.  
1ca10 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d  ** and send them
1ca20 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
1ca30 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a   one by one..  *
1ca40 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
1ca50 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
1ca60 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c  SortTail(pParse,
1ca70 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e   p, v, pEList->n
1ca80 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61  Expr, eDest, iPa
1ca90 72 6d 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  rm);.  }..#ifnde
1caa0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1cab0 42 51 55 45 52 59 0a 20 20 2f 2a 20 49 66 20 74  BQUERY.  /* If t
1cac0 68 69 73 20 77 61 73 20 61 20 73 75 62 71 75 65  his was a subque
1cad0 72 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20  ry, we have now 
1cae0 63 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73 75  converted the su
1caf0 62 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20  bquery into a.  
1cb00 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
1cb10 6c 65 2e 20 20 53 6f 20 73 65 74 20 74 68 65 20  le.  So set the 
1cb20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69 73 50  SrcList_item.isP
1cb30 6f 70 75 6c 61 74 65 64 20 66 6c 61 67 20 74 6f  opulated flag to
1cb40 20 70 72 65 76 65 6e 74 0a 20 20 2a 2a 20 74 68   prevent.  ** th
1cb50 69 73 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d  is subquery from
1cb60 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64   being evaluated
1cb70 20 61 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f   again and to fo
1cb80 72 63 65 20 74 68 65 20 75 73 65 20 6f 66 0a 20  rce the use of. 
1cb90 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
1cba0 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  y table..  */.  
1cbb0 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20  if( pParent ){. 
1cbc0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1cbd0 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70  nt->pSrc->nSrc>p
1cbe0 61 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20  arentTab );.    
1cbf0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1cc00 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54  >pSrc->a[parentT
1cc10 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29  ab].pSelect==p )
1cc20 3b 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70  ;.    pParent->p
1cc30 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62  Src->a[parentTab
1cc40 5d 2e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20  ].isPopulated = 
1cc50 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  1;.  }.#endif.. 
1cc60 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
1cc70 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79   skip this query
1cc80 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1cc90 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1cca0 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  v, iEnd);..  /* 
1ccb0 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73  The SELECT was s
1ccc0 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65  uccessfully code
1ccd0 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74  d.   Set the ret
1cce0 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20  urn code to 0.  
1ccf0 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e  ** to indicate n
1cd00 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20  o errors..  */. 
1cd10 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43   rc = 0;..  /* C
1cd20 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20  ontrol jumps to 
1cd30 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72  here if an error
1cd40 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
1cd50 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20  above, or upon. 
1cd60 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63   ** successful c
1cd70 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c  oding of the SEL
1cd80 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74  ECT..  */.select
1cd90 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e  _end:..  /* Iden
1cda0 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
1cdb0 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20  s if we will be 
1cdc0 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20  using them in a 
1cdd0 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a  callback.  This.
1cde0 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69    ** step is ski
1cdf0 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70  pped if the outp
1ce00 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73  ut is going to s
1ce10 6f 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e  ome other destin
1ce20 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  ation..  */.  if
1ce30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ce40 26 26 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  && eDest==SRT_Ca
1ce50 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65  llback ){.    ge
1ce60 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
1ce70 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
1ce80 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st, pEList);.  }
1ce90 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
1cea0 28 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b  (sAggInfo.aCol);
1ceb0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1cec0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b  sAggInfo.aFunc);
1ced0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1cee0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1cef0 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
1cf00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cf10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cf20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cf30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cf40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1cf50 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
1cf60 6f 64 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ode is used for 
1cf70 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
1cf80 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65  gging only.  The
1cf90 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20 66 6f   code.** that fo
1cfa0 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61  llows does not a
1cfb0 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c 20  ppear in normal 
1cfc0 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  builds..**.** Th
1cfd0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
1cfe0 20 75 73 65 64 20 74 6f 20 70 72 69 6e 74 20 6f   used to print o
1cff0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ut the content o
1d000 66 20 61 6c 6c 20 6f 72 20 70 61 72 74 20 6f 66  f all or part of
1d010 20 61 20 0a 2a 2a 20 70 61 72 73 65 20 73 74 72   a .** parse str
1d020 75 63 74 75 72 65 73 20 73 75 63 68 20 61 73 20  uctures such as 
1d030 53 65 6c 65 63 74 20 6f 72 20 45 78 70 72 2e 20  Select or Expr. 
1d040 20 53 75 63 68 20 70 72 69 6e 74 6f 75 74 73 20   Such printouts 
1d050 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f  are useful.** fo
1d060 72 20 68 65 6c 70 69 6e 67 20 74 6f 20 75 6e 64  r helping to und
1d070 65 72 73 74 61 6e 64 20 77 68 61 74 20 69 73 20  erstand what is 
1d080 68 61 70 70 65 6e 69 6e 67 20 69 6e 73 69 64 65  happening inside
1d090 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
1d0a0 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68  tor.** during th
1d0b0 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63  e execution of c
1d0c0 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54 20 73 74  omplex SELECT st
1d0d0 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
1d0e0 54 68 65 73 65 20 72 6f 75 74 69 6e 65 20 61 72  These routine ar
1d0f0 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 6e 79  e not called any
1d100 77 68 65 72 65 20 66 72 6f 6d 20 77 69 74 68 69  where from withi
1d110 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20  n the normal.** 
1d120 63 6f 64 65 20 62 61 73 65 2e 20 20 54 68 65 6e  code base.  Then
1d130 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 74 6f   are intended to
1d140 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
1d150 77 69 74 68 69 6e 20 74 68 65 20 64 65 62 75 67  within the debug
1d160 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20 74  ger.** or from t
1d170 65 6d 70 6f 72 61 72 79 20 22 70 72 69 6e 74 66  emporary "printf
1d180 22 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73  " statements ins
1d190 65 72 74 65 64 20 66 6f 72 20 64 65 62 75 67 67  erted for debugg
1d1a0 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ing..*/.void sql
1d1b0 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 45 78  ite3PrintExpr(Ex
1d1c0 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  pr *p){.  if( p-
1d1d0 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 2d 3e 74  >token.z && p->t
1d1e0 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a 20 20 20 20  oken.n>0 ){.    
1d1f0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1d200 74 66 28 22 28 25 2e 2a 73 22 2c 20 70 2d 3e 74  tf("(%.*s", p->t
1d210 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74 6f 6b 65 6e  oken.n, p->token
1d220 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  .z);.  }else{.  
1d230 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1d240 69 6e 74 66 28 22 28 25 64 22 2c 20 70 2d 3e 6f  intf("(%d", p->o
1d250 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  p);.  }.  if( p-
1d260 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 73 71  >pLeft ){.    sq
1d270 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1d280 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  (" ");.    sqlit
1d290 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70  e3PrintExpr(p->p
1d2a0 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Left);.  }.  if(
1d2b0 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20   p->pRight ){.  
1d2c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1d2d0 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73  intf(" ");.    s
1d2e0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
1d2f0 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  p->pRight);.  }.
1d300 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1d310 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76 6f 69  intf(")");.}.voi
1d320 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78  d sqlite3PrintEx
1d330 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
1d340 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1d350 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1d360 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1d370 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  ){.    sqlite3Pr
1d380 69 6e 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61  intExpr(pList->a
1d390 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
1d3a0 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  if( i<pList->nEx
1d3b0 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  pr-1 ){.      sq
1d3c0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1d3d0 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20  (", ");.    }.  
1d3e0 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
1d3f0 50 72 69 6e 74 53 65 6c 65 63 74 28 53 65 6c 65  PrintSelect(Sele
1d400 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65 6e  ct *p, int inden
1d410 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  t){.  sqlite3Deb
1d420 75 67 50 72 69 6e 74 66 28 22 25 2a 73 53 45 4c  ugPrintf("%*sSEL
1d430 45 43 54 28 25 70 29 20 22 2c 20 69 6e 64 65 6e  ECT(%p) ", inden
1d440 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73 71 6c  t, "", p);.  sql
1d450 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
1d460 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  t(p->pEList);.  
1d470 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1d480 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66 28 20  tf("\n");.  if( 
1d490 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 63  p->pSrc ){.    c
1d4a0 68 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a 20 20  har *zPrefix;.  
1d4b0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a 50 72    int i;.    zPr
1d4c0 65 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b 0a 20  efix = "FROM";. 
1d4d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
1d4e0 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  >pSrc->nSrc; i++
1d4f0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1d500 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1d510 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e  tem = &p->pSrc->
1d520 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[i];.      sqli
1d530 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1d540 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b 36 2c  %*s ", indent+6,
1d550 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20   zPrefix);.     
1d560 20 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a 20   zPrefix = "";. 
1d570 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1d580 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
1d590 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1d5a0 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a 20 20  rintf("(\n");.  
1d5b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 69        sqlite3Pri
1d5c0 6e 74 53 65 6c 65 63 74 28 70 49 74 65 6d 2d 3e  ntSelect(pItem->
1d5d0 70 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e 74 2b  pSelect, indent+
1d5e0 31 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  10);.        sql
1d5f0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1d600 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74 2b 38  "%*s)", indent+8
1d610 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , "");.      }el
1d620 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e  se if( pItem->zN
1d630 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
1d640 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1d650 66 28 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  f("%s", pItem->z
1d660 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
1d670 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1d680 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
1d690 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1d6a0 74 66 28 22 28 74 61 62 6c 65 3a 20 25 73 29 22  tf("(table: %s)"
1d6b0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
1d6c0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
1d6d0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1d6e0 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
1d6f0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1d700 69 6e 74 66 28 22 20 41 53 20 25 73 22 2c 20 70  intf(" AS %s", p
1d710 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
1d720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1d730 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
1d740 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  -1 ){.        sq
1d750 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1d760 28 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (",");.      }. 
1d770 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
1d780 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
1d790 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
1d7a0 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
1d7b0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1d7c0 74 66 28 22 25 2a 73 20 57 48 45 52 45 20 22 2c  tf("%*s WHERE ",
1d7d0 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
1d7e0 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
1d7f0 70 72 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  pr(p->pWhere);. 
1d800 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1d810 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
1d820 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70  .  if( p->pGroup
1d830 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
1d840 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
1d850 73 20 47 52 4f 55 50 20 42 59 20 22 2c 20 69 6e  s GROUP BY ", in
1d860 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
1d870 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
1d880 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 29  ist(p->pGroupBy)
1d890 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
1d8a0 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
1d8b0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61    }.  if( p->pHa
1d8c0 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  ving ){.    sqli
1d8d0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1d8e0 25 2a 73 20 48 41 56 49 4e 47 20 22 2c 20 69 6e  %*s HAVING ", in
1d8f0 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
1d900 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
1d910 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  p->pHaving);.   
1d920 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1d930 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
1d940 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
1d950 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1d960 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
1d970 4f 52 44 45 52 20 42 59 20 22 2c 20 69 6e 64 65  ORDER BY ", inde
1d980 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
1d990 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
1d9a0 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  t(p->pOrderBy);.
1d9b0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1d9c0 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
1d9d0 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68  }.}./* End of th
1d9e0 65 20 73 74 72 75 63 74 75 72 65 20 64 65 62 75  e structure debu
1d9f0 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a  g printing code.
1da00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1da10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1da20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1da30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1da40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23  *************/.#
1da50 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
1da60 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
1da70 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1da80 44 45 42 55 47 29 20 2a 2f 0a                    DEBUG) */.