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

Artifact 539a71c9b302ac003e5be72eee007d1f2e452e43:


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 38 30  select.c,v 1.380
0200: 20 32 30 30 38 2f 30 31 2f 30 33 20 30 39 3a 35   2008/01/03 09:5
0210: 31 3a 35 35 20 64 61 6e 69 65 6c 6b 31 39 37 37  1:55 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: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
3020: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
3030: 72 73 6f 72 2c 20 30 29 3b 0a 20 20 73 71 6c 69  rsor, 0);.  sqli
3040: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3050: 20 4f 50 5f 50 75 6c 6c 2c 20 70 4f 72 64 65 72   OP_Pull, pOrder
3060: 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20 30  By->nExpr + 1, 0
3070: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3080: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp2(v, OP_Mak
3090: 65 52 65 63 6f 72 64 2c 20 70 4f 72 64 65 72 42  eRecord, pOrderB
30a0: 79 2d 3e 6e 45 78 70 72 20 2b 20 32 2c 20 30 29  y->nExpr + 2, 0)
30b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
30c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
30d0: 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79 2d  nsert, pOrderBy-
30e0: 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20  >iECursor, 0);. 
30f0: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c   if( pSelect->iL
3100: 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69  imit>=0 ){.    i
3110: 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b  nt addr1, addr2;
3120: 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
3130: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3140: 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20  , OP_IfMemZero, 
3150: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 2b  pSelect->iLimit+
3160: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
3170: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3180: 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20  OP_MemIncr, -1, 
3190: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 2b  pSelect->iLimit+
31a0: 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  1);.    addr2 = 
31b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
31c0: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
31d0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
31e0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
31f0: 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69  addr1);.    sqli
3200: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3210: 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72   OP_Last, pOrder
3220: 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29  By->iECursor, 0)
3230: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3240: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65  eAddOp2(v, OP_De
3250: 6c 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  lete, pOrderBy->
3260: 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20  iECursor, 0);.  
3270: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
3280: 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b  pHere(v, addr2);
3290: 0a 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c  .    pSelect->iL
32a0: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 7d  imit = -1;.  }.}
32b0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65  ../*.** Add code
32c0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
32d0: 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74  e OFFSET.*/.stat
32e0: 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73  ic void codeOffs
32f0: 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  et(.  Vdbe *v,  
3300: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
3310: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
3320: 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63  is VM */.  Selec
3330: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  t *p,        /* 
3340: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
3350: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
3360: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
3370: 6e 75 65 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  nue,    /* Jump 
3380: 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65  here to skip the
3390: 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20   current record 
33a0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 70 20 20 20  */.  int nPop   
33b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
33c0: 20 6f 66 20 74 69 6d 65 73 20 74 6f 20 70 6f 70   of times to pop
33d0: 20 73 74 61 63 6b 20 77 68 65 6e 20 6a 75 6d 70   stack when jump
33e0: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ing */.){.  if( 
33f0: 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 26 26  p->iOffset>=0 &&
3400: 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b   iContinue!=0 ){
3410: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  .    int addr;. 
3420: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3430: 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  dOp2(v, OP_MemIn
3440: 63 72 2c 20 2d 31 2c 20 70 2d 3e 69 4f 66 66 73  cr, -1, p->iOffs
3450: 65 74 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  et);.    addr = 
3460: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3470: 32 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 4e 65 67  2(v, OP_IfMemNeg
3480: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 30 29  , p->iOffset, 0)
3490: 3b 0a 20 20 20 20 69 66 28 20 6e 50 6f 70 3e 30  ;.    if( nPop>0
34a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
34b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
34c0: 50 5f 50 6f 70 2c 20 6e 50 6f 70 2c 20 30 29 3b  P_Pop, nPop, 0);
34d0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
34e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
34f0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
3500: 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65  tinue);.    Vdbe
3510: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69  Comment((v, "ski
3520: 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73  p OFFSET records
3530: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
3540: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
3550: 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  addr);.  }.}../*
3560: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
3570: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
3580: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 6f  make sure the to
3590: 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  p N elements of 
35a0: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 61 72 65  the.** stack are
35b0: 20 64 69 73 74 69 6e 63 74 2e 20 20 69 54 61 62   distinct.  iTab
35c0: 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e   is a sorting in
35d0: 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70  dex that holds p
35e0: 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65  reviously.** see
35f0: 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  n combinations o
3600: 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20  f the N values. 
3610: 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   A new entry is 
3620: 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20  made in iTab.** 
3630: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e  if the current N
3640: 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e   values are new.
3650: 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f  .**.** A jump to
3660: 20 61 64 64 72 52 65 70 65 61 74 20 69 73 20 6d   addrRepeat is m
3670: 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20  ade and the N+1 
3680: 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65  values are poppe
3690: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74  d from the.** st
36a0: 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e  ack if the top N
36b0: 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f   elements are no
36c0: 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73  t distinct..*/.s
36d0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44  tatic void codeD
36e0: 69 73 74 69 6e 63 74 5f 4f 4c 44 28 0a 20 20 56  istinct_OLD(.  V
36f0: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
3700: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
3710: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20  de into this VM 
3720: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
3730: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72          /* A sor
3740: 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20  ting index used 
3750: 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74  to test for dist
3760: 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e  inctness */.  in
3770: 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20  t addrRepeat,   
3780: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
3790: 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74   if not distinct
37a0: 20 2a 2f 0a 20 20 69 6e 74 20 4e 20 20 20 20 20   */.  int N     
37b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
37c0: 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 6f  top N elements o
37d0: 66 20 74 68 65 20 73 74 61 63 6b 20 6d 75 73 74  f the stack must
37e0: 20 62 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a   be distinct */.
37f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
3800: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp2(v, OP_Mak
3810: 65 52 65 63 6f 72 64 2c 20 2d 4e 2c 20 30 29 3b  eRecord, -N, 0);
3820: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3830: 64 4f 70 32 28 76 2c 20 4f 50 5f 44 69 73 74 69  dOp2(v, OP_Disti
3840: 6e 63 74 2c 20 69 54 61 62 2c 20 73 71 6c 69 74  nct, iTab, sqlit
3850: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
3860: 72 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74  r(v)+3);.  sqlit
3870: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3880: 4f 50 5f 50 6f 70 2c 20 4e 2b 31 2c 20 30 29 3b  OP_Pop, N+1, 0);
3890: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
38a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
38b0: 20 30 2c 20 61 64 64 72 52 65 70 65 61 74 29 3b   0, addrRepeat);
38c0: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
38d0: 76 2c 20 22 73 6b 69 70 20 69 6e 64 69 73 74 69  v, "skip indisti
38e0: 6e 63 74 20 72 65 63 6f 72 64 73 22 29 29 3b 0a  nct records"));.
38f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3900: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
3910: 65 72 74 2c 20 69 54 61 62 2c 20 30 29 3b 0a 7d  ert, iTab, 0);.}
3920: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65  ../*.** Add code
3930: 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b   that will check
3940: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
3950: 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73  e top N elements
3960: 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b   of the.** stack
3970: 20 61 72 65 20 64 69 73 74 69 6e 63 74 2e 20 20   are distinct.  
3980: 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e  iTab is a sortin
3990: 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  g index that hol
39a0: 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  ds previously.**
39b0: 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f   seen combinatio
39c0: 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75  ns of the N valu
39d0: 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  es.  A new entry
39e0: 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62   is made in iTab
39f0: 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65  .** if the curre
3a00: 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20  nt N values are 
3a10: 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d  new..**.** A jum
3a20: 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20  p to addrRepeat 
3a30: 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20  is made and the 
3a40: 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70  N+1 values are p
3a50: 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  opped from the.*
3a60: 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74  * stack if the t
3a70: 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72  op N elements ar
3a80: 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a  e not distinct..
3a90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3aa0: 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 56  odeDistinct(.  V
3ab0: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
3ac0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
3ad0: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20  de into this VM 
3ae0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
3af0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72          /* A sor
3b00: 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20  ting index used 
3b10: 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74  to test for dist
3b20: 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e  inctness */.  in
3b30: 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20  t addrRepeat,   
3b40: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
3b50: 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74   if not distinct
3b60: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20   */.  int iMem  
3b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
3b80: 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  t element */.){.
3b90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3ba0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 67 4d 61 6b  Op2(v, OP_RegMak
3bb0: 65 52 65 63 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a  eRec, iMem, 0);.
3bc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3bd0: 4f 70 32 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e  Op2(v, OP_Distin
3be0: 63 74 2c 20 69 54 61 62 2c 20 73 71 6c 69 74 65  ct, iTab, sqlite
3bf0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3c00: 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74 65  (v)+3);.  sqlite
3c10: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3c20: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
3c30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3c40: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
3c50: 20 61 64 64 72 52 65 70 65 61 74 29 3b 0a 20 20   addrRepeat);.  
3c60: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
3c70: 22 73 6b 69 70 20 69 6e 64 69 73 74 69 6e 63 74  "skip indistinct
3c80: 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 73   records"));.  s
3c90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3ca0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
3cb0: 2c 20 69 54 61 62 2c 20 30 29 3b 0a 7d 0a 0a 2f  , iTab, 0);.}../
3cc0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
3cd0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
3ce0: 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20  hen a SELECT is 
3cf0: 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 73 75  used within a su
3d00: 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28  bexpression.** (
3d10: 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20  example:  "a IN 
3d20: 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
3d30: 61 62 6c 65 29 22 29 20 62 75 74 20 69 74 20 68  able)") but it h
3d40: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72  as more than 1 r
3d50: 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e  esult.** column.
3d60: 20 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20    We do this in 
3d70: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63  a subroutine bec
3d80: 61 75 73 65 20 74 68 65 20 65 72 72 6f 72 20 6f  ause the error o
3d90: 63 63 75 72 73 20 69 6e 20 6d 75 6c 74 69 70 6c  ccurs in multipl
3da0: 65 0a 2a 2a 20 70 6c 61 63 65 73 2e 0a 2a 2f 0a  e.** places..*/.
3db0: 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
3dc0: 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65  ForMultiColumnSe
3dd0: 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72  lectError(.  Par
3de0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
3df0: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
3e00: 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  xt. */.  SelectD
3e10: 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a  est *pDest,   /*
3e20: 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20   Destination of 
3e30: 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a  SELECT results *
3e40: 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20  /.  int nExpr   
3e50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3e60: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
3e70: 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
3e80: 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20   SELECT */.){.  
3e90: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
3ea0: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20  t->eDest;.  if( 
3eb0: 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65 73  nExpr>1 && (eDes
3ec0: 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44  t==SRT_Mem || eD
3ed0: 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b  est==SRT_Set) ){
3ee0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
3ef0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e  rMsg(pParse, "on
3f00: 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  ly a single resu
3f10: 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22  lt allowed for "
3f20: 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43  .       "a SELEC
3f30: 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  T that is part o
3f40: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22  f an expression"
3f50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
3f60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
3f70: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 0;.  }.}../
3f80: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3f90: 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  e generates the 
3fa0: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73  code for the ins
3fb0: 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  ide of the inner
3fc0: 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45   loop.** of a SE
3fd0: 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  LECT..**.** If s
3fe0: 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d  rcTab and nColum
3ff0: 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c  n are both zero,
4000: 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74   then the pEList
4010: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
4020: 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e  are evaluated in
4030: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
4040: 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  e data for this 
4050: 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e  row.  If nColumn
4060: 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61 20  >0.** then data 
4070: 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73  is pulled from s
4080: 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74  rcTab and pEList
4090: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f   is used only to
40a0: 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61   get the.** data
40b0: 74 79 70 65 73 20 66 6f 72 20 65 61 63 68 20 63  types for each c
40c0: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  olumn..*/.static
40d0: 20 69 6e 74 20 73 65 6c 65 63 74 49 6e 6e 65 72   int selectInner
40e0: 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Loop(.  Parse *p
40f0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4100: 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
4110: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
4120: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
4130: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65     /* The comple
4140: 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  te select statem
4150: 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ent being coded 
4160: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
4170: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  EList,       /* 
4180: 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62  List of values b
4190: 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a  eing extracted *
41a0: 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20  /.  int srcTab, 
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
41c0: 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ull data from th
41d0: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  is table */.  in
41e0: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t nColumn,      
41f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4200: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
4210: 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a  e source table *
4220: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
4230: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49  rderBy,     /* I
4240: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74  f not NULL, sort
4250: 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74   results using t
4260: 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  his key */.  int
4270: 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20   distinct,      
4280: 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20       /* If >=0, 
4290: 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74  make sure result
42a0: 73 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a  s are distinct *
42b0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
42c0: 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48  pDest,      /* H
42d0: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
42e0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
42f0: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
4300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4310: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
4320: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
4330: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
4340: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
4350: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
4360: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
4370: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63  nner loop */.  c
4380: 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20  har *aff        
4390: 20 20 20 20 20 20 20 2f 2a 20 61 66 66 69 6e 69         /* affini
43a0: 74 79 20 73 74 72 69 6e 67 20 69 66 20 65 44 65  ty string if eDe
43b0: 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20  st is SRT_Union 
43c0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
43d0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
43e0: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
43f0: 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20  nt hasDistinct; 
4400: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
4410: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
4420: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
4430: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 3b  t */.  int iMem;
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4450: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
4460: 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  y holding result
4470: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44   set */.  int eD
4480: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
4490: 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20  st;.  int iParm 
44a0: 3d 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a  = pDest->iParm;.
44b0: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
44c0: 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
44d0: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a  ( pEList!=0 );..
44e0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
44f0: 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  s a LIMIT clause
4500: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
4510: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64  tatement, then d
4520: 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a  o the check.  **
4530: 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
4540: 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75  row should be ou
4550: 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61 73  tput..  */.  has
4560: 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69  Distinct = disti
4570: 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69 73 74  nct>=0 && pEList
4580: 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20 20 69 66 28  ->nExpr>0;.  if(
4590: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20   pOrderBy==0 && 
45a0: 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  !hasDistinct ){.
45b0: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
45c0: 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  , p, iContinue, 
45d0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75  0);.  }..  /* Pu
45e0: 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ll the requested
45f0: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20   columns..  */. 
4600: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
4610: 7b 0a 20 20 20 20 6e 20 3d 20 6e 43 6f 6c 75 6d  {.    n = nColum
4620: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
4630: 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  n = pEList->nExp
4640: 72 3b 0a 20 20 7d 0a 20 20 69 4d 65 6d 20 3d 20  r;.  }.  iMem = 
4650: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
4660: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
4670: 6e 2b 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  n+1;.  sqlite3Vd
4680: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
4690: 65 6d 49 6e 74 2c 20 6e 2c 20 69 4d 65 6d 29 3b  emInt, n, iMem);
46a0: 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30  .  if( nColumn>0
46b0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
46c0: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
46d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
46e0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
46f0: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
4700: 69 2c 20 69 4d 65 6d 2b 69 2b 31 29 3b 0a 20 20  i, iMem+i+1);.  
4710: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
4720: 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74  eDest!=SRT_Exist
4730: 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  s ){.    /* If t
4740: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
4750: 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29  s an EXISTS(...)
4760: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
4770: 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76   actual.    ** v
4780: 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62  alues returned b
4790: 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  y the SELECT are
47a0: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
47b0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
47c0: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
47d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
47e0: 6e 74 6f 52 65 67 28 70 50 61 72 73 65 2c 20 70  ntoReg(pParse, p
47f0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
4800: 72 2c 20 69 4d 65 6d 2b 69 2b 31 29 3b 0a 20 20  r, iMem+i+1);.  
4810: 20 20 7d 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d    }.  }.  nColum
4820: 6e 20 3d 20 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  n = n;..  /* If 
4830: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
4840: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
4850: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
4860: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
4870: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
4880: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
4890: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
48a0: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
48b0: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
48c0: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  lt..  */.  if( h
48d0: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
48e0: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
48f0: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
4900: 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t( pEList->nExpr
4910: 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ==nColumn );.   
4920: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 76 2c   codeDistinct(v,
4930: 20 64 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74   distinct, iCont
4940: 69 6e 75 65 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  inue, iMem);.   
4950: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
4960: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
4970: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
4980: 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  inue, nColumn);.
4990: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
49a0: 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
49b0: 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
49c0: 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70  pParse, pDest, p
49d0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
49e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
49f0: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44   }..  switch( eD
4a00: 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  est ){.    /* In
4a10: 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74   this mode, writ
4a20: 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73  e each query res
4a30: 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f  ult to the key o
4a40: 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  f the temporary.
4a50: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61      ** table iPa
4a60: 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  rm..    */.#ifnd
4a70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
4a80: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
4a90: 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f     case SRT_Unio
4aa0: 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  n: {.      sqlit
4ab0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4ac0: 4f 50 5f 52 65 67 4d 61 6b 65 52 65 63 2c 20 69  OP_RegMakeRec, i
4ad0: 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  Mem, 0);.      i
4ae0: 66 28 20 61 66 66 20 29 7b 0a 20 20 20 20 20 20  f( aff ){.      
4af0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
4b00: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 61 66 66  ngeP4(v, -1, aff
4b10: 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
4b20: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
4b30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4b40: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
4b50: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
4b60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4b70: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61    /* Construct a
4b80: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
4b90: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62   query result, b
4ba0: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20  ut instead of.  
4bb0: 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74    ** saving that
4bc0: 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20   record, use it 
4bd0: 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65  as a key to dele
4be0: 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d  te elements from
4bf0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70  .    ** the temp
4c00: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
4c10: 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  m..    */.    ca
4c20: 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b  se SRT_Except: {
4c30: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
4c40: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
4c50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4c60: 76 2c 20 4f 50 5f 52 65 67 4d 61 6b 65 52 65 63  v, OP_RegMakeRec
4c70: 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  , iMem, 0);.    
4c80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
4c90: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 61 66 66  ngeP4(v, -1, aff
4ca0: 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
4cb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4cc0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 46  ddOp2(v, OP_NotF
4cd0: 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20 61 64 64  ound, iParm, add
4ce0: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
4cf0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4d00: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61 72   OP_Delete, iPar
4d10: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  m, 0);.      bre
4d20: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
4d30: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
4d40: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
4d50: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
4d60: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
4d70: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
4d80: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
4d90: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
4da0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4db0: 32 28 76 2c 20 4f 50 5f 52 65 67 4d 61 6b 65 52  2(v, OP_RegMakeR
4dc0: 65 63 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20  ec, iMem, 0);.  
4dd0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
4de0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
4df0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
4e00: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 29 3b  e, pOrderBy, p);
4e10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4e30: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
4e40: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 30  wRowid, iParm, 0
4e50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4e60: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4e70: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
4e80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
4e90: 6f 64 65 49 6e 73 65 72 74 28 70 50 61 72 73 65  odeInsert(pParse
4ea0: 2c 20 69 50 61 72 6d 2c 20 4f 50 46 4c 41 47 5f  , iParm, OPFLAG_
4eb0: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 7d  APPEND);.      }
4ec0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4ed0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
4ee0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
4ef0: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
4f00: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
4f10: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
4f20: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
4f30: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
4f40: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
4f50: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
4f60: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
4f70: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
4f80: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
4f90: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
4fa0: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
4fb0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4fc0: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
4fd0: 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20 20 20 20  int addr2;..    
4fe0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
4ff0: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 64  n==1 );.      ad
5000: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
5010: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
5020: 4d 65 6d 4e 75 6c 6c 2c 20 69 4d 65 6d 2b 31 2c  MemNull, iMem+1,
5030: 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66   0);.      p->af
5040: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
5050: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
5060: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
5070: 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 69 6e  pr, pDest->affin
5080: 69 74 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ity);.      if( 
5090: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
50a0: 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20      /* At first 
50b0: 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64  glance you would
50c0: 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20   think we could 
50d0: 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65  optimize out the
50e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  .        ** ORDE
50f0: 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73  R BY in this cas
5100: 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65  e since the orde
5110: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
5120: 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20  the set.        
5130: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74  ** does not matt
5140: 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d  er.  But there m
5150: 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20  ight be a LIMIT 
5160: 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68  clause, in which
5170: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65  .        ** case
5180: 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20   the order does 
5190: 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  matter */.      
51a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
51b0: 4f 70 32 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  Op2(v, OP_MemLoa
51c0: 64 2c 20 69 4d 65 6d 2b 31 2c 20 30 29 3b 0a 20  d, iMem+1, 0);. 
51d0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
51e0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
51f0: 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20  rderBy, p);.    
5200: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5210: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5220: 70 34 28 76 2c 20 4f 50 5f 52 65 67 4d 61 6b 65  p4(v, OP_RegMake
5230: 52 65 63 2c 20 69 4d 65 6d 2c 20 30 2c 20 30 2c  Rec, iMem, 0, 0,
5240: 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31   &p->affinity, 1
5250: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5260: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5270: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
5280: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  arm, 0);.      }
5290: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
52a0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
52b0: 64 72 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61  dr2);.      brea
52c0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
52d0: 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73   If any row exis
52e0: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
52f0: 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74  set, record that
5300: 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e   fact and abort.
5310: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5320: 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20   SRT_Exists: {. 
5330: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5340: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 65 6d  AddOp2(v, OP_Mem
5350: 49 6e 74 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a  Int, 1, iParm);.
5360: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
5370: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
5380: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
5390: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
53a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
53b0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
53c0: 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
53d0: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
53e0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
53f0: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
5400: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
5410: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
5420: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
5430: 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
5440: 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
5450: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
5460: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
5470: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
5480: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
5490: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
54a0: 4f 70 32 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  Op2(v, OP_MemLoa
54b0: 64 2c 20 69 4d 65 6d 2b 31 2c 20 30 29 3b 0a 20  d, iMem+1, 0);. 
54c0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
54d0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
54e0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
54f0: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 29  se, pOrderBy, p)
5500: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5510: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5520: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
5530: 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20  emStore, iParm, 
5540: 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  1);.        /* T
5550: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
5560: 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
5570: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
5580: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
5590: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
55a0: 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
55b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
55c0: 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
55d0: 20 53 65 6e 64 20 74 68 65 20 64 61 74 61 20 74   Send the data t
55e0: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  o the callback f
55f0: 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20  unction or to a 
5600: 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20  subroutine.  In 
5610: 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  the.    ** case 
5620: 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c  of a subroutine,
5630: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
5640: 69 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e  itself is respon
5650: 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  sible for.    **
5660: 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74   popping the dat
5670: 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  a from the stack
5680: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
5690: 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65  e SRT_Subroutine
56a0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  :.    case SRT_C
56b0: 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20  allback: {.     
56c0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
56d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
56e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
56f0: 5f 52 65 67 4d 61 6b 65 52 65 63 2c 20 69 4d 65  _RegMakeRec, iMe
5700: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  m, 0);.        p
5710: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
5720: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
5730: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  p);.      }else 
5740: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
5750: 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  ubroutine ){.   
5760: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5770: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 20 73 71  nColumn; i++) sq
5780: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5790: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69  v, OP_MemLoad, i
57a0: 4d 65 6d 2b 69 2b 31 2c 20 30 29 3b 0a 20 20 20  Mem+i+1, 0);.   
57b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
57c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
57d0: 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20  ub, 0, iParm);. 
57e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
57f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5800: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
5810: 6c 74 52 6f 77 2c 20 69 4d 65 6d 2b 31 2c 20 6e  ltRow, iMem+1, n
5820: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
5830: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5840: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
5850: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
5860: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
5870: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
5880: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
5890: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
58a0: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
58b0: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
58c0: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
58d0: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
58e0: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
58f0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
5900: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
5910: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
5920: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
5930: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
5940: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
5950: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
5960: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
5970: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
5980: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
5990: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
59a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
59b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
59c0: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
59d0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
59e0: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
59f0: 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f  is reached..  */
5a00: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
5a10: 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d  >=0 && pOrderBy=
5a20: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
5a30: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5a40: 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70  P_MemIncr, -1, p
5a50: 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73  ->iLimit);.    s
5a60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5a70: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f  (v, OP_IfMemZero
5a80: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
5a90: 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  eak);.  }.  retu
5aa0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
5ab0: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
5ac0: 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74  on list, generat
5ad0: 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  e a KeyInfo stru
5ae0: 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72  cture that recor
5af0: 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74  ds.** the collat
5b00: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
5b10: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
5b20: 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73   in that express
5b30: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
5b40: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
5b50: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  is an ORDER BY o
5b60: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
5b70: 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  e then the resul
5b80: 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ting.** KeyInfo 
5b90: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
5ba0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
5bb0: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
5bc0: 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20  ual index to.** 
5bd0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63  implement that c
5be0: 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45  lause.  If the E
5bf0: 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72  xprList is the r
5c00: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
5c10: 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68  ELECT.** then th
5c20: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
5c30: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
5c40: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
5c50: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ing a virtual.**
5c60: 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d   index to implem
5c70: 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74  ent a DISTINCT t
5c80: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  est..**.** Space
5c90: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
5ca0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
5cb0: 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20 6d 61  s obtain from ma
5cc0: 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69  lloc.  The calli
5cd0: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  ng.** function i
5ce0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
5cf0: 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74 68  r seeing that th
5d00: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
5d10: 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
5d20: 65 65 64 2e 20 20 41 64 64 20 74 68 65 20 4b 65  eed.  Add the Ke
5d30: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
5d40: 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c 64 20  to the P4 field 
5d50: 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75 73 69  of an opcode usi
5d60: 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e 46 4f  ng.** P4_KEYINFO
5d70: 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68 65 20  _HANDOFF is the 
5d80: 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64 65 61  usual way of dea
5d90: 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73 2e 0a  ling with this..
5da0: 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
5db0: 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  o *keyInfoFromEx
5dc0: 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a 70 50  prList(Parse *pP
5dd0: 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a  arse, ExprList *
5de0: 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65  pList){.  sqlite
5df0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
5e00: 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b  db;.  int nExpr;
5e10: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66  .  KeyInfo *pInf
5e20: 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  o;.  struct Expr
5e30: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
5e40: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45  ;.  int i;..  nE
5e50: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
5e60: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
5e70: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
5e80: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  o(db, sizeof(*pI
5e90: 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73 69  nfo) + nExpr*(si
5ea0: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
5eb0: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f  ) );.  if( pInfo
5ec0: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61   ){.    pInfo->a
5ed0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
5ee0: 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e  )&pInfo->aColl[n
5ef0: 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e 66 6f  Expr];.    pInfo
5f00: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78 70 72  ->nField = nExpr
5f10: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e 63  ;.    pInfo->enc
5f20: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
5f30: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
5f40: 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70 72  List->a; i<nExpr
5f50: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
5f60: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
5f70: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f  pColl;.      pCo
5f80: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
5f90: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
5fa0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
5fb0: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
5fc0: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
5fd0: 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
5fe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5ff0: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  pInfo->aColl[i] 
6000: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
6010: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
6020: 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72  [i] = pItem->sor
6030: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
6040: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f  }.  return pInfo
6050: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ;.}.../*.** If t
6060: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61  he inner loop wa
6070: 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e  s generated usin
6080: 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72  g a non-null pOr
6090: 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a  derBy argument,.
60a0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  ** then the resu
60b0: 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20  lts were placed 
60c0: 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66  in a sorter.  Af
60d0: 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20  ter the loop is 
60e0: 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65  terminated.** we
60f0: 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65   need to run the
6100: 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70   sorter and outp
6110: 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  ut the results. 
6120: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   The following.*
6130: 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
6140: 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65  tes the code nee
6150: 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  ded to do that..
6160: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
6170: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
6180: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6190: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
61a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
61b0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f  ect *p,        /
61c0: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
61d0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65  tement */.  Vdbe
61e0: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a   *v,          /*
61f0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
6200: 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f  nto this VDBE */
6210: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
6220: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6230: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
6240: 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
6250: 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74  t *pDest /* Writ
6260: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
6270: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
6280: 20 20 69 6e 74 20 62 72 6b 20 3d 20 73 71 6c 69    int brk = sqli
6290: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
62a0: 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 20  (v);.  int cont 
62b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
62c0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74  eLabel(v);.  int
62d0: 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54 61   addr;.  int iTa
62e0: 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f 54  b;.  int pseudoT
62f0: 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69  ab = 0;.  ExprLi
6300: 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
6310: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 69  ->pOrderBy;..  i
6320: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
6330: 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69  ->eDest;.  int i
6340: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 50  Parm = pDest->iP
6350: 61 72 6d 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70  arm;..  iTab = p
6360: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
6370: 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  r;.  if( eDest==
6380: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c 20  SRT_Callback || 
6390: 65 44 65 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f  eDest==SRT_Subro
63a0: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65  utine ){.    pse
63b0: 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d  udoTab = pParse-
63c0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nTab++;.    sql
63d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
63e0: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
63f0: 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a   pseudoTab, 0);.
6400: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6410: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e  ddOp2(v, OP_SetN
6420: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 73 65 75 64  umColumns, pseud
6430: 6f 54 61 62 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  oTab, nColumn);.
6440: 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b    }.  addr = 1 +
6450: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6460: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  p2(v, OP_Sort, i
6470: 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f 64  Tab, brk);.  cod
6480: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 63 6f  eOffset(v, p, co
6490: 6e 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 65 44  nt, 0);.  if( eD
64a0: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
64b0: 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  k || eDest==SRT_
64c0: 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  Subroutine ){.  
64d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
64e0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
64f0: 72 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  r, 1, 0);.  }.  
6500: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6510: 32 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  2(v, OP_Column, 
6520: 69 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e  iTab, pOrderBy->
6530: 6e 45 78 70 72 20 2b 20 31 29 3b 0a 20 20 73 77  nExpr + 1);.  sw
6540: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
6550: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
6560: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
6570: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
6580: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6590: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
65a0: 69 64 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  id, iParm, 0);. 
65b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
65c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 75 6c  AddOp2(v, OP_Pul
65d0: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 1, 0);.      
65e0: 73 71 6c 69 74 65 33 43 6f 64 65 49 6e 73 65 72  sqlite3CodeInser
65f0: 74 28 70 50 61 72 73 65 2c 20 69 50 61 72 6d 2c  t(pParse, iParm,
6600: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
6610: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6620: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
6630: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
6640: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
6650: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
6660: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
6670: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6680: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
6690: 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71 6c 69  otNull, -1, sqli
66a0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
66b0: 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20  dr(v)+3);.      
66c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
66d0: 32 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  2(v, OP_Pop, 1, 
66e0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
66f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6700: 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74  P_Goto, 0, sqlit
6710: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6720: 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20 73  r(v)+3);.      s
6730: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
6740: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6750: 64 2c 20 31 2c 20 30 2c 20 30 2c 20 26 70 2d 3e  d, 1, 0, 0, &p->
6760: 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
6770: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6780: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
6790: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 30 29  nsert, iParm, 0)
67a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
67b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
67c0: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
67d0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
67e0: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
67f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6800: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61  OP_MemStore, iPa
6810: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a  rm, 1);.      /*
6820: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
6830: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
6840: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
6850: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
6860: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
6870: 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62    case SRT_Callb
6880: 61 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ack:.    case SR
6890: 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a  T_Subroutine: {.
68a0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
68b0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 49 6e     sqlite3CodeIn
68c0: 73 65 72 74 28 70 50 61 72 73 65 2c 20 70 73 65  sert(pParse, pse
68d0: 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  udoTab, 0);.    
68e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
68f0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
6900: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6910: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp2(v, OP_Colu
6920: 6d 6e 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 69  mn, pseudoTab, i
6930: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6940: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
6950: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
6960: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6970: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61 6c 6c  ddOp2(v, OP_Call
6980: 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  back, nColumn, 0
6990: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
69a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
69b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
69c0: 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29  Gosub, 0, iParm)
69d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
69e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
69f0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6a00: 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
6a10: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
6a20: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6a30: 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
6a40: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 68 65 6e  of the loop when
6a50: 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
6a60: 61 63 68 65 64 0a 20 20 2a 2f 0a 20 20 69 66 28  ached.  */.  if(
6a70: 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b   p->iLimit>=0 ){
6a80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6a90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 65 6d  AddOp2(v, OP_Mem
6aa0: 49 6e 63 72 2c 20 2d 31 2c 20 70 2d 3e 69 4c 69  Incr, -1, p->iLi
6ab0: 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mit);.    sqlite
6ac0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6ad0: 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e  P_IfMemZero, p->
6ae0: 69 4c 69 6d 69 74 2c 20 62 72 6b 29 3b 0a 20 20  iLimit, brk);.  
6af0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74  }..  /* The bott
6b00: 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  om of the loop. 
6b10: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
6b20: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
6b30: 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65   cont);.  sqlite
6b40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6b50: 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
6b60: 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dr);.  sqlite3Vd
6b70: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
6b80: 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28 20 65 44  , brk);.  if( eD
6b90: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
6ba0: 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  k || eDest==SRT_
6bb0: 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  Subroutine ){.  
6bc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6bd0: 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
6be0: 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a   pseudoTab, 0);.
6bf0: 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65    }..}../*.** Re
6c00: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6c10: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  o a string conta
6c20: 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61  ining the 'decla
6c30: 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20  ration type' of 
6c40: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
6c50: 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74 72  n pExpr. The str
6c60: 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61 74  ing may be treat
6c70: 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79 20  ed as static by 
6c80: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
6c90: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
6ca0: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
6cb0: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
6cc0: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
6cd0: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72  d from the.** or
6ce0: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
6cf0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
6d00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6d10: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  is a column. The
6d20: 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  .** declaration 
6d30: 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44  type for a ROWID
6d40: 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45   field is INTEGE
6d50: 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20  R. Exactly when 
6d60: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
6d70: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
6d80: 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63   column can be c
6d90: 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72  omplex in the pr
6da0: 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65  esence of subque
6db0: 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73  ries. The.** res
6dc0: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
6dd0: 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65  on in all of the
6de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43   following SELEC
6df0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
6e00: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
6e10: 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20   column by this 
6e20: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
6e30: 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f    SELECT col FRO
6e40: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
6e50: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
6e60: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
6e70: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
6e80: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20   FROM tbl);.**  
6e90: 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d   SELECT abc FROM
6ea0: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20   (SELECT col AS 
6eb0: 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  abc FROM tbl);.*
6ec0: 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  * .** The declar
6ed0: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
6ee0: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74  ny expression ot
6ef0: 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d  her than a colum
6f00: 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  n is NULL..*/.st
6f10: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
6f20: 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20 4e  *columnType(.  N
6f30: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
6f40: 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
6f50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
6f60: 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63 6f  pzOriginDb,.  co
6f70: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
6f80: 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  ginTab,.  const 
6f90: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 43  char **pzOriginC
6fa0: 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  ol.){.  char con
6fb0: 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  st *zType = 0;. 
6fc0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
6fd0: 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63 68  iginDb = 0;.  ch
6fe0: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69  ar const *zOrigi
6ff0: 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  nTab = 0;.  char
7000: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 43   const *zOriginC
7010: 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  ol = 0;.  int j;
7020: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
7030: 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  || pNC->pSrcList
7040: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7050: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
7060: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
7070: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
7080: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
7090: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  MN: {.      /* T
70a0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
70b0: 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74   a column. Locat
70c0: 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20  e the table the 
70d0: 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a  column is being.
70e0: 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74        ** extract
70f0: 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43  ed from in NameC
7100: 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e  ontext.pSrcList.
7110: 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20   This table may 
7120: 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a  be real.      **
7130: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
7140: 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20  or a subquery.. 
7150: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
7160: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
7170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
7180: 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c  le structure col
7190: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
71a0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53   from */.      S
71b0: 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20  elect *pS = 0;  
71c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
71d0: 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lect the column 
71e0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
71f0: 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  m */.      int i
7200: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
7210: 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20  lumn;  /* Index 
7220: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61  of column in pTa
7230: 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65  b */.      while
7240: 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20 29  ( pNC && !pTab )
7250: 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73  {.        SrcLis
7260: 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e  t *pTabList = pN
7270: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
7280: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70       for(j=0;j<p
7290: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26  TabList->nSrc &&
72a0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
72b0: 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e  iCursor!=pExpr->
72c0: 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20  iTable;j++);.   
72d0: 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c       if( j<pTabL
72e0: 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20  ist->nSrc ){.   
72f0: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
7300: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
7310: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 20  b;.          pS 
7320: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
7330: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
7340: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7350: 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e     pNC = pNC->pN
7360: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ext;.        }. 
7370: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
7380: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
7390: 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a       /* FIX ME:.
73a0: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
73b0: 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20 79 6f  can occurs if yo
73c0: 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69 6e 67  u have something
73d0: 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20 6e 65   like "SELECT ne
73e0: 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20 20 20  w.x;" inside.   
73f0: 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
7400: 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  r.  In other wor
7410: 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66 65 72  ds, if you refer
7420: 65 6e 63 65 20 74 68 65 20 73 70 65 63 69 61 6c  ence the special
7430: 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20 20 2a   "new".        *
7440: 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 72  * table in the r
7450: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 73  esult set of a s
7460: 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f  elect.  We do no
7470: 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20 77 61  t have a good wa
7480: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  y.        ** to 
7490: 66 69 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20  find the actual 
74a0: 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f 20 63  table type, so c
74b0: 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e 20 20  all it "TEXT".  
74c0: 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79 0a 20  This is really. 
74d0: 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68         ** someth
74e0: 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20 62 75  ing of a bug, bu
74f0: 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20  t I do not know 
7500: 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e 0a 20  how to fix it.. 
7510: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
7520: 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64    ** This code d
7530: 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63 65 20  oes not produce 
7540: 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
7550: 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70 72 65  er - it just pre
7560: 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  vents.        **
7570: 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20 53 65   a segfault.  Se
7580: 65 20 74 69 63 6b 65 74 20 23 31 32 32 39 2e 0a  e ticket #1229..
7590: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
75a0: 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54     zType = "TEXT
75b0: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
75c0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
75d0: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 29 3b   assert( pTab );
75e0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b  .      if( pS ){
75f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
7600: 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61  "table" is actua
7610: 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74  lly a sub-select
7620: 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68   or a view in th
7630: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
7640: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
7650: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7660: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
7670: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
7680: 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20  d origin.       
7690: 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65   ** data for the
76a0: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
76b0: 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  mn of the sub-se
76c0: 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  lect..        */
76d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
76e0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d  l>=0 && iCol<pS-
76f0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
7700: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
7710: 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74  f iCol is less t
7720: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
7730: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
7740: 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20  quests the.     
7750: 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66       ** rowid of
7760: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
7770: 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78  or view. This ex
7780: 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61  pression is lega
7790: 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20  l (see .        
77a0: 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d    ** test case m
77b0: 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61  isc2.2.2) - it a
77c0: 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20  lways evaluates 
77d0: 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20  to NULL..       
77e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
77f0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
7800: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
7810: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
7820: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a  >a[iCol].pExpr;.
7830: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53            sNC.pS
7840: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
7850: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  c;.          sNC
7860: 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  .pNext = 0;.    
7870: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
7880: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
7890: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
78a0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
78b0: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62  C, p, &zOriginDb
78c0: 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26  , &zOriginTab, &
78d0: 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20  zOriginCol); .  
78e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
78f0: 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 70 53  lse if( pTab->pS
7900: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
7910: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
7920: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
7930: 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20  rt( !pS );.     
7940: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
7950: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
7960: 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ey;.        asse
7970: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
7980: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
7990: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
79a0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
79b0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
79c0: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
79d0: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  ";.          zOr
79e0: 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f 77 69 64  iginCol = "rowid
79f0: 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
7a00: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
7a10: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
7a20: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
7a30: 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c        zOriginCol
7a40: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
7a50: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
7a60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72     }.        zOr
7a70: 69 67 69 6e 54 61 62 20 3d 20 70 54 61 62 2d 3e  iginTab = pTab->
7a80: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
7a90: 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29  f( pNC->pParse )
7aa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
7ab0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
7ac0: 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e  emaToIndex(pNC->
7ad0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
7ae0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
7af0: 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 44 62 20        zOriginDb 
7b00: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pNC->pParse->d
7b10: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
7b20: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
7b30: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7b40: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
7b50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
7b60: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
7b70: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
7b80: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
7b90: 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  on is a sub-sele
7ba0: 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  ct. Return the d
7bb0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
7bc0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69  and.      ** ori
7bd0: 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65  gin info for the
7be0: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69   single column i
7bf0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
7c00: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
7c10: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
7c20: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
7c30: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
7c40: 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  C;.      Select 
7c50: 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 70 53 65  *pS = pExpr->pSe
7c60: 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72  lect;.      Expr
7c70: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
7c80: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
7c90: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
7ca0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
7cb0: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
7cc0: 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50  NC;.      sNC.pP
7cd0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
7ce0: 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20  se;.      zType 
7cf0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
7d00: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62  C, p, &zOriginDb
7d10: 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26  , &zOriginTab, &
7d20: 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20  zOriginCol); .  
7d30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7d40: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20  .#endif.  }.  . 
7d50: 20 69 66 28 20 70 7a 4f 72 69 67 69 6e 44 62 20   if( pzOriginDb 
7d60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
7d70: 7a 4f 72 69 67 69 6e 54 61 62 20 26 26 20 70 7a  zOriginTab && pz
7d80: 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20  OriginCol );.   
7d90: 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a   *pzOriginDb = z
7da0: 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70  OriginDb;.    *p
7db0: 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72  zOriginTab = zOr
7dc0: 69 67 69 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a  iginTab;.    *pz
7dd0: 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69  OriginCol = zOri
7de0: 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65  ginCol;.  }.  re
7df0: 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f  turn zType;.}../
7e00: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
7e10: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
7e20: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64  l the VDBE the d
7e30: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73  eclaration types
7e40: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
7e50: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
7e60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7e70: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
7e80: 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ypes(.  Parse *p
7e90: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
7ea0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
7eb0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
7ec0: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
7ed0: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
7ee0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
7ef0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
7f00: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
7f10: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20  sult set */.){. 
7f20: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
7f30: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
7f40: 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
7f50: 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63   sNC;.  sNC.pSrc
7f60: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
7f70: 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
7f80: 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d  pParse;.  for(i=
7f90: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
7fa0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
7fb0: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
7fc0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
7fd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
7fe0: 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  gDb = 0;.    con
7ff0: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61  st char *zOrigTa
8000: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
8010: 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20   char *zOrigCol 
8020: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
8030: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 63 6f 6c  har *zType = col
8040: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
8050: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
8060: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29  gTab, &zOrigCol)
8070: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64  ;..    /* The vd
8080: 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73  be must make its
8090: 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65   own copy of the
80a0: 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64   column-type and
80b0: 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63   other .    ** c
80c0: 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73  olumn specific s
80d0: 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20  trings, in case 
80e0: 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65  the schema is re
80f0: 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a  set before this.
8100: 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d      ** virtual m
8110: 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65  achine is delete
8120: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
8130: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8140: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8150: 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70  E_DECLTYPE, zTyp
8160: 65 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29  e, P4_TRANSIENT)
8170: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8180: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8190: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41  , COLNAME_DATABA
81a0: 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 50 34 5f  SE, zOrigDb, P4_
81b0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
81c0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
81d0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
81e0: 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67  AME_TABLE, zOrig
81f0: 54 61 62 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e  Tab, P4_TRANSIEN
8200: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
8210: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8220: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55   i, COLNAME_COLU
8230: 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 50 34  MN, zOrigCol, P4
8240: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
8250: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
8260: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
8270: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
8280: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
8290: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
82a0: 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73  esult set.  This
82b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
82c0: 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  used to provide 
82d0: 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76  the.** azCol[] v
82e0: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c  alues in the cal
82f0: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
8300: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
8310: 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72  lumnNames(.  Par
8320: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8330: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
8340: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
8350: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
8360: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
8370: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
8380: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
8390: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
83a0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
83b0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
83c0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
83d0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c   int i, j;.  sql
83e0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
83f0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
8400: 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d  lNames, shortNam
8410: 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  es;..#ifndef SQL
8420: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
8430: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
8440: 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69   an EXPLAIN, ski
8450: 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20  p this step */. 
8460: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
8470: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75  lain ){.    retu
8480: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
8490: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
84a0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
84b0: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76  colNamesSet || v
84c0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
84d0: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
84e0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  ;.  pParse->colN
84f0: 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66  amesSet = 1;.  f
8500: 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e  ullNames = (db->
8510: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
8520: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ullColNames)!=0;
8530: 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20  .  shortNames = 
8540: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
8550: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
8560: 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  s)!=0;.  sqlite3
8570: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
8580: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
8590: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
85a0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
85b0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
85c0: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
85d0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
85e0: 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74   if( p==0 ) cont
85f0: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45  inue;.    if( pE
8600: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
8610: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
8620: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
8630: 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
8640: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8650: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8660: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
8670: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
8680: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
8690: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
86a0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
86b0: 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b  N && pTabList ){
86c0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
86d0: 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ab;.      char *
86e0: 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  zCol;.      int 
86f0: 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  iCol = p->iColum
8700: 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  n;.      for(j=0
8710: 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; j<pTabList->nS
8720: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
8730: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d  a[j].iCursor!=p-
8740: 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a  >iTable; j++){}.
8750: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
8760: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
8770: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
8780: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
8790: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  ab;.      if( iC
87a0: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
87b0: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
87c0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
87d0: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
87e0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
87f0: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ) );.      if( i
8800: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
8810: 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b   zCol = "rowid";
8820: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8830: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61        zCol = pTa
8840: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
8850: 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
8860: 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d     if( !shortNam
8870: 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73  es && !fullNames
8880: 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26   && p->span.z &&
8890: 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b   p->span.z[0] ){
88a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
88b0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
88c0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
88d0: 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61  E, (char*)p->spa
88e0: 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b  n.z, p->span.n);
88f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
8900: 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21   fullNames || (!
8910: 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70 54  shortNames && pT
8920: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20  abList->nSrc>1) 
8930: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
8940: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  *zName = 0;.    
8950: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a      char *zTab;.
8960: 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d   .        zTab =
8970: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
8980: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
8990: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c  if( fullNames ||
89a0: 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20   zTab==0 ) zTab 
89b0: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
89c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
89d0: 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20  tString(&zName, 
89e0: 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c  zTab, ".", zCol,
89f0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
8a00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8a10: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8a20: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
8a30: 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  ame, P4_DYNAMIC)
8a40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8a50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8a60: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8a70: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
8a80: 20 7a 43 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43   zCol, strlen(zC
8a90: 6f 6c 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ol));.      }.  
8aa0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73    }else if( p->s
8ab0: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
8ac0: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73  .z[0] ){.      s
8ad0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8ae0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8af0: 4d 45 5f 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29  ME_NAME, (char*)
8b00: 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70  p->span.z, p->sp
8b10: 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 2f 2a 20  an.n);.      /* 
8b20: 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 70 72  sqlite3VdbeCompr
8b30: 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64 72  essSpace(v, addr
8b40: 29 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  ); */.    }else{
8b50: 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d  .      char zNam
8b60: 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73  e[30];.      ass
8b70: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43  ert( p->op!=TK_C
8b80: 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73  OLUMN || pTabLis
8b90: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  t==0 );.      sq
8ba0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
8bb0: 69 7a 65 6f 66 28 7a 4e 61 6d 65 29 2c 20 7a 4e  izeof(zName), zN
8bc0: 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c  ame, "column%d",
8bd0: 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c   i+1);.      sql
8be0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
8bf0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
8c00: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 30 29  _NAME, zName, 0)
8c10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65  ;.    }.  }.  ge
8c20: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
8c30: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
8c40: 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a  st, pEList);.}..
8c50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8c60: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
8c70: 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f  ECT./*.** Name o
8c80: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
8c90: 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20   operator, used 
8ca0: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
8cb0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
8cc0: 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74  nst char *select
8cd0: 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a  OpName(int id){.
8ce0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69    char *z;.  swi
8cf0: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63  tch( id ){.    c
8d00: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
8d10: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c    z = "UNION ALL
8d20: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
8d30: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
8d40: 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43  T: z = "INTERSEC
8d50: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
8d60: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
8d70: 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22      z = "EXCEPT"
8d80: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
8d90: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
8da0: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22       z = "UNION"
8db0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
8dc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
8dd0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8de0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
8df0: 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SELECT */../*.**
8e00: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
8e10: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tion.*/.static i
8e20: 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d  nt prepSelectStm
8e30: 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63 74  t(Parse*, Select
8e40: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  *);../*.** Given
8e50: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
8e60: 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ent, generate a 
8e70: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
8e80: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a  that describes.*
8e90: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
8ea0: 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e   of that SELECT.
8eb0: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
8ec0: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
8ed0: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
8ee0: 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d  e, char *zTabNam
8ef0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
8f00: 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ct){.  Table *pT
8f10: 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ab;.  int i, j;.
8f20: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
8f30: 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43  st;.  Column *aC
8f40: 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c  ol, *pCol;.  sql
8f50: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
8f60: 65 2d 3e 64 62 3b 0a 0a 20 20 77 68 69 6c 65 28  e->db;..  while(
8f70: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
8f80: 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65   ) pSelect = pSe
8f90: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
8fa0: 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74  if( prepSelectSt
8fb0: 6d 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  mt(pParse, pSele
8fc0: 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ct) ){.    retur
8fd0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 0;.  }.  if( s
8fe0: 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f  qlite3SelectReso
8ff0: 6c 76 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c  lve(pParse, pSel
9000: 65 63 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  ect, 0) ){.    r
9010: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
9020: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
9030: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
9040: 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
9050: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
9060: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
9070: 7d 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d  }.  pTab->nRef =
9080: 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d   1;.  pTab->zNam
9090: 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73  e = zTabName ? s
90a0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
90b0: 62 2c 20 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30  b, zTabName) : 0
90c0: 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  ;.  pEList = pSe
90d0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
90e0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c  pTab->nCol = pEL
90f0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73  ist->nExpr;.  as
9100: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
9110: 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43  >0 );.  pTab->aC
9120: 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69  ol = aCol = sqli
9130: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
9140: 64 62 2c 20 73 69 7a 65 6f 66 28 70 54 61 62 2d  db, sizeof(pTab-
9150: 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e  >aCol[0])*pTab->
9160: 6e 43 6f 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30  nCol);.  for(i=0
9170: 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70  , pCol=aCol; i<p
9180: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  Tab->nCol; i++, 
9190: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 45 78 70  pCol++){.    Exp
91a0: 72 20 2a 70 2c 20 2a 70 52 3b 0a 20 20 20 20 63  r *p, *pR;.    c
91b0: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20  har *zType;.    
91c0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
91d0: 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20   int nName;.    
91e0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
91f0: 20 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20      int cnt;.   
9200: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
9210: 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 47 65  ;.    .    /* Ge
9220: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
9230: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f   name for the co
9240: 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lumn.    */.    
9250: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
9260: 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
9270: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
9280: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74   || p->pRight->t
9290: 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e  oken.z==0 || p->
92a0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b  pRight->token.z[
92b0: 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  0]!=0 );.    if(
92c0: 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
92d0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
92e0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
92f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
9300: 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65  ins an "AS <name
9310: 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c  >" phrase, use <
9320: 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d  name> as the nam
9330: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
9340: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
9350: 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  up(db, zName);. 
9360: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
9370: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20  op==TK_DOT .    
9380: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 52            && (pR
9390: 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30 20 26  =p->pRight)!=0 &
93a0: 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26  & pR->token.z &&
93b0: 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20   pR->token.z[0] 
93c0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
93d0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 66  columns of the f
93e0: 72 6f 6d 20 41 2e 42 20 75 73 65 20 42 20 61 73  rom A.B use B as
93f0: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
9400: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
9410: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
9420: 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b  T", &pR->token);
9430: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
9440: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
9450: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
9460: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69    /* Use the ori
9470: 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68  ginal text of th
9480: 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  e column express
9490: 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20  ion as its name 
94a0: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
94b0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
94c0: 64 62 2c 20 22 25 54 22 2c 20 26 70 2d 3e 73 70  db, "%T", &p->sp
94d0: 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  an);.    }else{.
94e0: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
94f0: 65 6c 73 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65  else fails, make
9500: 20 75 70 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20   up a name */.  
9510: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
9520: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
9530: 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b  column%d", i+1);
9540: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
9550: 7a 4e 61 6d 65 20 7c 7c 20 64 62 2d 3e 6d 61 6c  zName || db->mal
9560: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
9570: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
9580: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  led = 1;.      s
9590: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
95a0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
95b0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 54 61  3DeleteTable(pTa
95c0: 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  b);.      return
95d0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
95e0: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
95f0: 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  me);..    /* Mak
9600: 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d  e sure the colum
9610: 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65  n name is unique
9620: 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69  .  If the name i
9630: 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20  s not unique,.  
9640: 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e    ** append a in
9650: 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d  teger to the nam
9660: 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63  e so that it bec
9670: 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20  omes unique..   
9680: 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20   */.    nName = 
9690: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
96a0: 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20     for(j=cnt=0; 
96b0: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
96c0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
96d0: 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  Cmp(aCol[j].zNam
96e0: 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  e, zName)==0 ){.
96f0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e          zName[nN
9700: 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ame] = 0;.      
9710: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
9720: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a  3MPrintf(db, "%z
9730: 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  :%d", zName, ++c
9740: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  nt);.        j =
9750: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28   -1;.        if(
9760: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61   zName==0 ) brea
9770: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
9780: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  .    pCol->zName
9790: 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f   = zName;..    /
97a0: 2a 20 47 65 74 20 74 68 65 20 74 79 70 65 6e 61  * Get the typena
97b0: 6d 65 2c 20 74 79 70 65 20 61 66 66 69 6e 69 74  me, type affinit
97c0: 79 2c 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  y, and collating
97d0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
97e0: 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e  e.    ** column.
97f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
9800: 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
9810: 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
9820: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65  C.pSrcList = pSe
9830: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20  lect->pSrc;.    
9840: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44  zType = sqlite3D
9850: 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75  bStrDup(db, colu
9860: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
9870: 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70  0, 0, 0));.    p
9880: 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a 54 79  Col->zType = zTy
9890: 70 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  pe;.    pCol->af
98a0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
98b0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
98c0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
98d0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
98e0: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
98f0: 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
9900: 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d     pCol->zColl =
9910: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
9920: 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  (db, pColl->zNam
9930: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
9940: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
9950: 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  ;.  return pTab;
9960: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
9970: 65 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  e a SELECT state
9980: 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73  ment for process
9990: 69 6e 67 20 62 79 20 64 6f 69 6e 67 20 74 68 65  ing by doing the
99a0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68   following.** th
99b0: 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ings:.**.**    (
99c0: 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44  1)  Make sure VD
99d0: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
99e0: 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
99f0: 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a  gned to every.**
9a00: 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74           element
9a10: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
9a20: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  use..**.**    (2
9a30: 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  )  Fill in the p
9a40: 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61  TabList->a[].pTa
9a50: 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  b fields in the 
9a60: 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a  SrcList that .**
9a70: 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73           defines
9a80: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57   FROM clause.  W
9a90: 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72  hen views appear
9aa0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
9ab0: 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  use,.**         
9ac0: 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61  fill pTabList->a
9ad0: 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20  [].pSelect with 
9ae0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
9af0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
9b00: 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69  *         that i
9b10: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
9b20: 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d  ew.  A copy is m
9b30: 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27  ade of the view'
9b40: 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  s SELECT.**     
9b50: 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f      statement so
9b60: 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65   that we can fre
9b70: 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65  ely modify or de
9b80: 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  lete that statem
9b90: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  ent.**         w
9ba0: 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20  ithout worrying 
9bb0: 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70  about messing up
9bc0: 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20   the presistent 
9bd0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a  representation.*
9be0: 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  *         of the
9bf0: 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   view..**.**    
9c00: 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74  (3)  Add terms t
9c10: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
9c20: 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65  se to accomodate
9c30: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
9c40: 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
9c50: 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65  on joins and the
9c60: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
9c70: 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a  ause of joins..*
9c80: 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61  *.**    (4)  Sca
9c90: 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
9ca0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
9cb0: 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29  ult set (pEList)
9cc0: 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   looking.**     
9cd0: 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65      for instance
9ce0: 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65  s of the "*" ope
9cf0: 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42  rator or the TAB
9d00: 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LE.* operator..*
9d10: 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75  *         If fou
9d20: 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20  nd, expand each 
9d30: 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20  "*" to be every 
9d40: 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20  column in every 
9d50: 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
9d60: 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20   and TABLE.* to 
9d70: 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
9d80: 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  in TABLE..**.** 
9d90: 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63  Return 0 on succ
9da0: 65 73 73 2e 20 20 49 66 20 74 68 65 72 65 20 61  ess.  If there a
9db0: 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61  re problems, lea
9dc0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
9dd0: 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65  age.** in pParse
9de0: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
9df0: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
9e00: 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53 74  int prepSelectSt
9e10: 6d 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mt(Parse *pParse
9e20: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
9e30: 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b  int i, j, k, rc;
9e40: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
9e50: 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  List;.  ExprList
9e60: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75   *pEList;.  stru
9e70: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
9e80: 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65  *pFrom;.  sqlite
9e90: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9ea0: 64 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20  db;..  if( p==0 
9eb0: 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c  || p->pSrc==0 ||
9ec0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9ed0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
9ee0: 31 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73  1;.  }.  pTabLis
9ef0: 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
9f00: 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
9f10: 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  t;..  /* Make su
9f20: 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  re cursor number
9f30: 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
9f40: 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72  gned to all entr
9f50: 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  ies in.  ** the 
9f60: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
9f70: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
9f80: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ent..  */.  sqli
9f90: 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
9fa0: 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
9fb0: 70 2d 3e 70 53 72 63 29 3b 0a 0a 20 20 2f 2a 20  p->pSrc);..  /* 
9fc0: 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61  Look up every ta
9fd0: 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65  ble named in the
9fe0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
9ff0: 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a  the select.  If.
a000: 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66    ** an entry of
a010: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
a020: 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69   is a subquery i
a030: 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c  nstead of a tabl
a040: 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20  e or view,.  ** 
a050: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72  then create a tr
a060: 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74  ansient table st
a070: 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72  ructure to descr
a080: 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ibe the subquery
a090: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
a0a0: 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
a0b0: 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
a0c0: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
a0d0: 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
a0e0: 2a 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  *pTab;.    if( p
a0f0: 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b  From->pTab!=0 ){
a100: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
a110: 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72  tatement has alr
a120: 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72  eady been prepar
a130: 65 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ed.  There is no
a140: 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74   need.      ** t
a150: 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f  o go further. */
a160: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
a170: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  ==0 );.      ret
a180: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
a190: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d   if( pFrom->zNam
a1a0: 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  e==0 ){.#ifndef 
a1b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
a1c0: 55 45 52 59 0a 20 20 20 20 20 20 2f 2a 20 41 20  UERY.      /* A 
a1d0: 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
a1e0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
a1f0: 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
a200: 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
a210: 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20  >pSelect!=0 );. 
a220: 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e       if( pFrom->
a230: 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20  zAlias==0 ){.   
a240: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69       pFrom->zAli
a250: 61 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73  as =.          s
a260: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
a270: 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65  , "sqlite_subque
a280: 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29  ry_%p_", (void*)
a290: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
a2a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
a2b0: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
a2c0: 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
a2d0: 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
a2e0: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
a2f0: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
a300: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 46  elect(pParse, pF
a310: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70 46 72  rom->zAlias, pFr
a320: 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  om->pSelect);.  
a330: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
a340: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
a350: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
a360: 20 20 20 2f 2a 20 54 68 65 20 69 73 45 70 68 65     /* The isEphe
a370: 6d 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  m flag indicates
a380: 20 74 68 61 74 20 74 68 65 20 54 61 62 6c 65 20   that the Table 
a390: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 62 65  structure has be
a3a0: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e 61  en.      ** dyna
a3b0: 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
a3c0: 64 20 61 6e 64 20 6d 61 79 20 62 65 20 66 72 65  d and may be fre
a3d0: 65 64 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 20  ed at any time. 
a3e0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
a3f0: 0a 20 20 20 20 20 20 2a 2a 20 70 54 61 62 20 69  .      ** pTab i
a400: 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74  s not pointing t
a410: 6f 20 61 20 70 65 72 73 69 73 74 65 6e 74 20 74  o a persistent t
a420: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
a430: 68 61 74 20 64 65 66 69 6e 65 73 0a 20 20 20 20  hat defines.    
a440: 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65    ** part of the
a450: 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20   schema. */.    
a460: 20 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20    pTab->isEphem 
a470: 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 1;.#endif.    
a480: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
a490: 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
a4a0: 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
a4b0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
a4c0: 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
a4d0: 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
a4e0: 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
a4f0: 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
a500: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a510: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
a520: 73 65 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c  se,pFrom->zName,
a530: 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pFrom->zDatabase
a540: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
a550: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
a560: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
a570: 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  }.      pTab->nR
a580: 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e  ef++;.#if !defin
a590: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
a5a0: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
a5b0: 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49   (SQLITE_OMIT_VI
a5c0: 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20  RTUALTABLE).    
a5d0: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
a5e0: 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  ect || IsVirtual
a5f0: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
a600: 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65    /* We reach he
a610: 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  re if the named 
a620: 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c  table is a reall
a630: 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  y a view */.    
a640: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
a650: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
a660: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
a670: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
a680: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
a690: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70  .        /* If p
a6a0: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30  From->pSelect!=0
a6b0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
a6c0: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a   dealing with a.
a6d0: 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20          ** view 
a6e0: 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20  within a view.  
a6f0: 54 68 65 20 53 45 4c 45 43 54 20 73 74 72 75 63  The SELECT struc
a700: 74 75 72 65 20 68 61 73 20 61 6c 72 65 61 64 79  ture has already
a710: 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   been.        **
a720: 20 63 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f   copied by the o
a730: 75 74 65 72 20 76 69 65 77 20 73 6f 20 77 65 20  uter view so we 
a740: 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70  can skip the cop
a750: 79 20 73 74 65 70 20 68 65 72 65 0a 20 20 20 20  y step here.    
a760: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
a770: 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20  ner view..      
a780: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
a790: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d   pFrom->pSelect=
a7a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a7b0: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
a7c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
a7d0: 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c  p(db, pTab->pSel
a7e0: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ect);.        }.
a7f0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
a800: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
a810: 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b  rocess NATURAL k
a820: 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20  eywords, and ON 
a830: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
a840: 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f  s of joins..  */
a850: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f  .  if( sqlitePro
a860: 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
a870: 20 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   p) ) return 1;.
a880: 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
a890: 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
a8a0: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
a8b0: 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
a8c0: 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
a8d0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
a8e0: 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
a8f0: 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
a900: 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
a910: 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
a920: 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
a930: 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
a940: 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
a950: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
a960: 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65  h the TK_ALL ope
a970: 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
a980: 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
a990: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
a9a0: 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ist..  ** The fo
a9b0: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
a9c0: 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
a9d0: 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65  the TK_ALL expre
a9e0: 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
a9f0: 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20  d.  ** each one 
aa00: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
aa10: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
aa20: 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
aa30: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
aa40: 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
aa50: 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
aa60: 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
aa70: 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
aa80: 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
aa90: 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
aaa0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
aab0: 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  k++){.    Expr *
aac0: 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
aad0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
aae0: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   pE->op==TK_ALL 
aaf0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
ab00: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
ab10: 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26  && pE->pRight &&
ab20: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
ab30: 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20  =TK_ALL.        
ab40: 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26   && pE->pLeft &&
ab50: 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
ab60: 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20  TK_ID ) break;. 
ab70: 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69   }.  rc = 0;.  i
ab80: 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
ab90: 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
aba0: 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
abb0: 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
abc0: 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
abd0: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
abe0: 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
abf0: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
ac00: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
ac10: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
ac20: 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
ac30: 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
ac40: 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
ac50: 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
ac60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
ac70: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
ac80: 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
ac90: 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
aca0: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
acb0: 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65  t flags = pParse
acc0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ->db->flags;.   
acd0: 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d   int longNames =
ace0: 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
acf0: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
ad00: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
ad10: 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67             (flag
ad20: 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
ad30: 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20  ColNames)==0;.. 
ad40: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
ad50: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
ad60: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
ad70: 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
ad80: 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
ad90: 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20  !=TK_ALL &&.    
ada0: 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d         (pE->op!=
adb0: 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
adc0: 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70  ight==0 || pE->p
add0: 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  Right->op!=TK_AL
ade0: 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  L) ){.        /*
adf0: 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
ae00: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
ae10: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
ae20: 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20  expanded..      
ae30: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
ae40: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
ae50: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
ae60: 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  , pNew, a[k].pEx
ae70: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
ae80: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
ae90: 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
aea0: 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
aeb0: 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
aec0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
aed0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
aee0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
aef0: 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
af00: 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d   0;.        a[k]
af10: 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
af20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
af30: 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
af40: 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
af50: 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
af60: 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
af70: 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
af80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
af90: 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
afa0: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
afb0: 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
afc0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
afd0: 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20  ar *zTName;     
afe0: 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
aff0: 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
b000: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
b010: 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
b020: 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20   pE->pLeft ){.  
b030: 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
b040: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
b050: 54 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d 3e 70  Token(db, &pE->p
b060: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  Left->token);.  
b070: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b080: 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
b090: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
b0a0: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46       for(i=0, pF
b0b0: 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
b0c0: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
b0d0: 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
b0e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
b0f0: 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
b100: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
b110: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
b120: 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
b130: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
b140: 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54  TabName==0 || zT
b150: 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20  abName[0]==0 ){ 
b160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61  .            zTa
b170: 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
b180: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ame;.          }
b190: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
b1a0: 54 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e 61  TName && (zTabNa
b1b0: 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d  me==0 || zTabNam
b1c0: 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20  e[0]==0 || .    
b1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
b1e0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61  ite3StrICmp(zTNa
b1f0: 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30  me, zTabName)!=0
b200: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
b210: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
b220: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b230: 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
b240: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
b250: 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
b260: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
b270: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20     Expr *pExpr, 
b280: 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  *pRight;.       
b290: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
b2a0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
b2b0: 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20  .zName;..       
b2c0: 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c       /* If a col
b2d0: 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73  umn is marked as
b2e0: 20 27 68 69 64 64 65 6e 27 20 28 63 75 72 72 65   'hidden' (curre
b2f0: 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62  ntly only possib
b300: 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
b310: 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61  * for virtual ta
b320: 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e  bles), do not in
b330: 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20  clude it in the 
b340: 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20  expanded.       
b350: 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73       ** result-s
b360: 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20  et list..       
b370: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
b380: 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e      if( IsHidden
b390: 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
b3a0: 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ol[j]) ){.      
b3b0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 49          assert(I
b3c0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b  sVirtual(pTab));
b3d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
b3e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
b3f0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
b400: 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20      if( i>0 ){. 
b410: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
b420: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
b430: 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c   *pLeft = &pTabL
b440: 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20  ist->a[i-1];.   
b450: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
b460: 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70  pLeft[1].jointyp
b470: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
b480: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
b490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
b4a0: 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d  lumnIndex(pLeft-
b4b0: 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30  >pTab, zName)>=0
b4c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b4d0: 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
b4e0: 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
b4f0: 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
b500: 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
b510: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
b520: 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  le on the right 
b530: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
b540: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
b550: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
b560: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
b570: 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
b580: 78 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73 69 6e  x(pLeft[1].pUsin
b590: 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5b0: 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
b5c0: 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
b5d0: 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
b5e0: 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
b5f0: 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
b600: 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
b610: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
b620: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
b630: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
b650: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
b660: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
b670: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
b680: 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30  pParse, TK_ID, 0
b690: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
b6a0: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 3d       if( pRight=
b6b0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
b6c0: 20 20 20 20 20 20 20 20 73 65 74 51 75 6f 74 65          setQuote
b6d0: 64 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26  dToken(pParse, &
b6e0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a  pRight->token, z
b6f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
b700: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20     if( zTabName 
b710: 26 26 20 28 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  && (longNames ||
b720: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
b730: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
b740: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
b750: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
b760: 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c  Parse, TK_ID, 0,
b770: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
b780: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
b790: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
b7a0: 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
b7b0: 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  , pRight, 0);.  
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
b7d0: 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b  pExpr==0 ) break
b7e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b7f0: 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70  setQuotedToken(p
b800: 50 61 72 73 65 2c 20 26 70 4c 65 66 74 2d 3e 74  Parse, &pLeft->t
b810: 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b  oken, zTabName);
b820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
b830: 65 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e  etToken(&pExpr->
b840: 73 70 61 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  span, .         
b850: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b860: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
b870: 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  %s", zTabName, z
b880: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
b890: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
b8a0: 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20  n.dyn = 1;.     
b8b0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
b8c0: 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20  token.z = 0;.   
b8d0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
b8e0: 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20  ->token.n = 0;. 
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
b900: 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20  pr->token.dyn = 
b910: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
b920: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
b930: 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67      pExpr = pRig
b940: 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
b950: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20    pExpr->span = 
b960: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pExpr->token;.  
b970: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
b980: 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 30 3b  r->span.dyn = 0;
b990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
b9a0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
b9b0: 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
b9c0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
b9d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
b9e0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
b9f0: 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70 45 78  New, pExpr, &pEx
ba00: 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20  pr->span);.     
ba10: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
ba30: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
ba40: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
ba50: 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70   pNew, pExpr, &p
ba60: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  Right->token);. 
ba70: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
ba80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ba90: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
baa0: 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
bab0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
bac0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
bad0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
bae0: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
baf0: 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54  h table: %s", zT
bb00: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
bb10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bb20: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
bb30: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
bb40: 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
bb50: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
bb60: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
bb70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bb80: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
bb90: 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  (zTName);.      
bba0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
bbb0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
bbc0: 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  e(pEList);.    p
bbd0: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
bbe0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45  .  }.  if( p->pE
bbf0: 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73  List && p->pELis
bc00: 74 2d 3e 6e 45 78 70 72 3e 53 51 4c 49 54 45 5f  t->nExpr>SQLITE_
bc10: 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  MAX_COLUMN ){.  
bc20: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
bc30: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
bc40: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72  any columns in r
bc50: 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 20  esult set");.   
bc60: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
bc70: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  OR;.  }.  if( db
bc80: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
bc90: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
bca0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
bcb0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
bcc0: 2a 2a 20 70 45 20 69 73 20 61 20 70 6f 69 6e 74  ** pE is a point
bcd0: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
bce0: 69 6f 6e 20 77 68 69 63 68 20 69 73 20 61 20 73  ion which is a s
bcf0: 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 0a 2a 2a  ingle term in.**
bd00: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
bd10: 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a  UP BY clause..**
bd20: 0a 2a 2a 20 49 66 20 70 45 20 65 76 61 6c 75 61  .** If pE evalua
bd30: 74 65 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  tes to an intege
bd40: 72 20 63 6f 6e 73 74 61 6e 74 20 69 2c 20 74 68  r constant i, th
bd50: 65 6e 20 72 65 74 75 72 6e 20 69 2e 0a 2a 2a 20  en return i..** 
bd60: 54 68 69 73 20 69 73 20 61 6e 20 69 6e 64 69 63  This is an indic
bd70: 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 61 6c  ation to the cal
bd80: 6c 65 72 20 74 68 61 74 20 69 74 20 73 68 6f 75  ler that it shou
bd90: 6c 64 20 73 6f 72 74 0a 2a 2a 20 62 79 20 74 68  ld sort.** by th
bda0: 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e i-th column of
bdb0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
bdc0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 20 69 73 20  .**.** If pE is 
bdd0: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 65 78  a well-formed ex
bde0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 74 68 65  pression and the
bdf0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
be00: 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 70  t.** is not comp
be10: 6f 75 6e 64 2c 20 74 68 65 6e 20 72 65 74 75 72  ound, then retur
be20: 6e 20 30 2e 20 20 54 68 69 73 20 69 6e 64 69 63  n 0.  This indic
be30: 61 74 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ates to the.** c
be40: 61 6c 6c 65 72 20 74 68 61 74 20 69 74 20 73 68  aller that it sh
be50: 6f 75 6c 64 20 73 6f 72 74 20 62 79 20 74 68 65  ould sort by the
be60: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4f 52   value of the OR
be70: 44 45 52 20 42 59 0a 2a 2a 20 65 78 70 72 65 73  DER BY.** expres
be80: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  sion..**.** If t
be90: 68 65 20 53 45 4c 45 43 54 20 69 73 20 63 6f 6d  he SELECT is com
bea0: 70 6f 75 6e 64 2c 20 74 68 65 6e 20 61 74 74 65  pound, then atte
beb0: 6d 70 74 20 74 6f 20 6d 61 74 63 68 20 70 45 20  mpt to match pE 
bec0: 61 67 61 69 6e 73 74 0a 2a 2a 20 72 65 73 75 6c  against.** resul
bed0: 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  t set columns in
bee0: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 53   the left-most S
bef0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
bf00: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
bf10: 69 6e 64 65 78 20 69 20 6f 66 20 74 68 65 20 6d  index i of the m
bf20: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20  atching column, 
bf30: 61 73 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e  as an indication
bf40: 20 74 6f 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c   to the .** call
bf50: 65 72 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c  er that it shoul
bf60: 64 20 73 6f 72 74 20 62 79 20 74 68 65 20 69 2d  d sort by the i-
bf70: 74 68 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 20 74  th column.  If t
bf80: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 6d 61  here is.** no ma
bf90: 74 63 68 2c 20 72 65 74 75 72 6e 20 2d 31 20 61  tch, return -1 a
bfa0: 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
bfb0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
bfc0: 72 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rse..*/.static i
bfd0: 6e 74 20 6d 61 74 63 68 4f 72 64 65 72 42 79 54  nt matchOrderByT
bfe0: 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 0a 20  ermToExprList(. 
bff0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c000: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
c010: 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72  ontext for error
c020: 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53   messages */.  S
c030: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
c040: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
c050: 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20 74  statement with t
c060: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
c070: 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  se */.  Expr *pE
c080: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
c090: 65 20 73 70 65 63 69 66 69 63 20 4f 52 44 45 52  e specific ORDER
c0a0: 20 42 59 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e   BY term */.  in
c0b0: 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  t idx,          
c0c0: 20 2f 2a 20 57 68 65 6e 20 4f 52 44 45 52 20 42   /* When ORDER B
c0d0: 59 20 74 65 72 6d 20 69 73 20 74 68 69 73 20 2a  Y term is this *
c0e0: 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6f 75  /.  int isCompou
c0f0: 6e 64 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 69  nd,    /* True i
c100: 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 70  f this is a comp
c110: 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ound SELECT */. 
c120: 20 75 38 20 2a 70 48 61 73 41 67 67 20 20 20 20   u8 *pHasAgg    
c130: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65      /* True if e
c140: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
c150: 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ns aggregate fun
c160: 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69  ctions */.){.  i
c170: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
c180: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
c190: 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  r */.  ExprList 
c1a0: 2a 70 45 4c 69 73 74 3b 20 20 2f 2a 20 54 68 65  *pEList;  /* The
c1b0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
c1c0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
c1d0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 6e 63 3b 20  NameContext nc; 
c1e0: 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
c1f0: 78 74 20 66 6f 72 20 72 65 73 6f 6c 76 69 6e 67  xt for resolving
c200: 20 70 45 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 49 66   pE */...  /* If
c210: 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 6e 20   the term is an 
c220: 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
c230: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c  , return the val
c240: 75 65 20 6f 66 20 74 68 61 74 0a 20 20 2a 2a 20  ue of that.  ** 
c250: 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 70 45  constant */.  pE
c260: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
c270: 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71  pEList;.  if( sq
c280: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
c290: 65 72 28 70 45 2c 20 26 69 29 20 29 7b 0a 20 20  er(pE, &i) ){.  
c2a0: 20 20 69 66 28 20 69 3c 3d 30 20 29 7b 0a 20 20    if( i<=0 ){.  
c2b0: 20 20 20 20 2f 2a 20 49 66 20 69 20 69 73 20 74      /* If i is t
c2c0: 6f 6f 20 73 6d 61 6c 6c 2c 20 6d 61 6b 65 20 69  oo small, make i
c2d0: 74 20 74 6f 6f 20 62 69 67 2e 20 20 54 68 61 74  t too big.  That
c2e0: 20 77 61 79 20 74 68 65 20 63 61 6c 6c 69 6e 67   way the calling
c2f0: 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
c300: 6f 6e 20 73 74 69 6c 6c 20 73 65 65 73 20 61 20  on still sees a 
c310: 76 61 6c 75 65 20 74 68 61 74 20 69 73 20 6f 75  value that is ou
c320: 74 20 6f 66 20 72 61 6e 67 65 2c 20 62 75 74 20  t of range, but 
c330: 64 6f 65 73 0a 20 20 20 20 20 20 2a 2a 20 6e 6f  does.      ** no
c340: 74 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 6f  t confuse the co
c350: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68  lumn number with
c360: 20 30 20 6f 72 20 2d 31 20 72 65 73 75 6c 74 20   0 or -1 result 
c370: 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  code..      */. 
c380: 20 20 20 20 20 69 20 3d 20 70 45 4c 69 73 74 2d       i = pEList-
c390: 3e 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 7d 0a  >nExpr+1;.    }.
c3a0: 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20      return i;.  
c3b0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74  }..  /* If the t
c3c0: 65 72 6d 20 69 73 20 61 20 73 69 6d 70 6c 65 20  erm is a simple 
c3d0: 69 64 65 6e 74 69 66 69 65 72 20 74 68 61 74 20  identifier that 
c3e0: 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 61  try to match tha
c3f0: 74 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 2a  t identifier.  *
c400: 2a 20 61 67 61 69 6e 73 74 20 61 20 63 6f 6c 75  * against a colu
c410: 6d 6e 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 72  mn name in the r
c420: 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  esult set..  */.
c430: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
c440: 5f 49 44 20 7c 7c 20 28 70 45 2d 3e 6f 70 3d 3d  _ID || (pE->op==
c450: 54 4b 5f 53 54 52 49 4e 47 20 26 26 20 70 45 2d  TK_STRING && pE-
c460: 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 27 5c 27  >token.z[0]!='\'
c470: 27 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ') ){.    sqlite
c480: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
c490: 64 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  db;.    char *zC
c4a0: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ol = sqlite3Name
c4b0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26 70  FromToken(db, &p
c4c0: 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 69  E->token);.    i
c4d0: 66 28 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  f( zCol==0 ){.  
c4e0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
c4f0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
c500: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
c510: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  r; i++){.      c
c520: 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73  har *zAs = pELis
c530: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
c540: 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20       if( zAs!=0 
c550: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
c560: 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20  p(zAs, zCol)==0 
c570: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
c580: 65 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20  e3_free(zCol);. 
c590: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 2b         return i+
c5a0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
c5b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
c5c0: 65 28 7a 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20  e(zCol);.  }..  
c5d0: 2f 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e  /* Resolve all n
c5e0: 61 6d 65 73 20 69 6e 20 74 68 65 20 4f 52 44 45  ames in the ORDE
c5f0: 52 20 42 59 20 74 65 72 6d 20 65 78 70 72 65 73  R BY term expres
c600: 73 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  sion.  */.  mems
c610: 65 74 28 26 6e 63 2c 20 30 2c 20 73 69 7a 65 6f  et(&nc, 0, sizeo
c620: 66 28 6e 63 29 29 3b 0a 20 20 6e 63 2e 70 50 61  f(nc));.  nc.pPa
c630: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
c640: 6e 63 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  nc.pSrcList = pS
c650: 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 6e  elect->pSrc;.  n
c660: 63 2e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  c.pEList = pELis
c670: 74 3b 0a 20 20 6e 63 2e 61 6c 6c 6f 77 41 67 67  t;.  nc.allowAgg
c680: 20 3d 20 31 3b 0a 20 20 6e 63 2e 6e 45 72 72 20   = 1;.  nc.nErr 
c690: 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
c6a0: 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
c6b0: 65 73 28 26 6e 63 2c 20 70 45 29 20 29 7b 0a 20  es(&nc, pE) ){. 
c6c0: 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e     if( isCompoun
c6d0: 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
c6e0: 65 33 45 72 72 6f 72 43 6c 65 61 72 28 70 50 61  e3ErrorClear(pPa
c6f0: 72 73 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  rse);.      retu
c700: 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rn 0;.    }else{
c710: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
c720: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
c730: 28 20 6e 63 2e 68 61 73 41 67 67 20 26 26 20 70  ( nc.hasAgg && p
c740: 48 61 73 41 67 67 20 29 7b 0a 20 20 20 20 2a 70  HasAgg ){.    *p
c750: 48 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a  HasAgg = 1;.  }.
c760: 0a 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 6d 70  .  /* For a comp
c770: 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 77 65 20  ound SELECT, we 
c780: 6e 65 65 64 20 74 6f 20 74 72 79 20 74 6f 20 6d  need to try to m
c790: 61 74 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  atch the ORDER B
c7a0: 59 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  Y.  ** expressio
c7b0: 6e 20 61 67 61 69 6e 73 74 20 61 6e 20 65 78 70  n against an exp
c7c0: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72  ression in the r
c7d0: 65 73 75 6c 74 20 73 65 74 0a 20 20 2a 2f 0a 20  esult set.  */. 
c7e0: 20 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64 20   if( isCompound 
c7f0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
c800: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
c810: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
c820: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
c830: 61 72 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  are(pEList->a[i]
c840: 2e 70 45 78 70 72 2c 20 70 45 29 20 29 7b 0a 20  .pExpr, pE) ){. 
c850: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 2b         return i+
c860: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
c870: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
c880: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  .}.../*.** Analy
c890: 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  ze and ORDER BY 
c8a0: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
c8b0: 73 65 20 69 6e 20 61 20 73 69 6d 70 6c 65 20 53  se in a simple S
c8c0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
c8d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
c8e0: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
c8f0: 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  seen..**.** Ever
c900: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  y term of the OR
c910: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
c920: 42 59 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20  BY clause needs 
c930: 74 6f 20 62 65 20 61 6e 0a 2a 2a 20 65 78 70 72  to be an.** expr
c940: 65 73 73 69 6f 6e 2e 20 20 49 66 20 61 6e 79 20  ession.  If any 
c950: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
c960: 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   integer constan
c970: 74 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 61 74 20  t, then.** that 
c980: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
c990: 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 63 6f  placed by the co
c9a0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 2a 2a 20  rresponding .** 
c9b0: 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
c9c0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
c9d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
c9e0: 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42  ocessOrderGroupB
c9f0: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
ca00: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
ca10: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20  rsing context.  
ca20: 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  Leave error mess
ca30: 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 53  ages here */.  S
ca40: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
ca50: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
ca60: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e  CT statement con
ca70: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6c 61 75  taining the clau
ca80: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
ca90: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
caa0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72   The ORDER BY or
cab0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
cac0: 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64   to be processed
cad0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 72 64 65   */.  int isOrde
cae0: 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31  r,          /* 1
caf0: 20 66 6f 72 20 4f 52 44 45 52 20 42 59 2e 20 20   for ORDER BY.  
cb00: 30 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 2a  0 for GROUP BY *
cb10: 2f 0a 20 20 75 38 20 2a 70 48 61 73 41 67 67 20  /.  u8 *pHasAgg 
cb20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
cb30: 20 74 6f 20 54 52 55 45 20 69 66 20 61 6e 79 20   to TRUE if any 
cb40: 74 65 72 6d 20 63 6f 6e 74 61 69 6e 73 20 61 6e  term contains an
cb50: 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 29 7b   aggregate */.){
cb60: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
cb70: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
cb80: 2d 3e 64 62 3b 0a 20 20 45 78 70 72 4c 69 73 74  ->db;.  ExprList
cb90: 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28   *pEList;..  if(
cba0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72   pOrderBy==0 ) r
cbb0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
cbc0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 53  OrderBy->nExpr>S
cbd0: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
cbe0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
cbf0: 61 72 20 2a 7a 54 79 70 65 20 3d 20 69 73 4f 72  ar *zType = isOr
cc00: 64 65 72 20 3f 20 22 4f 52 44 45 52 22 20 3a 20  der ? "ORDER" : 
cc10: 22 47 52 4f 55 50 22 3b 0a 20 20 20 20 73 71 6c  "GROUP";.    sql
cc20: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
cc30: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74  rse, "too many t
cc40: 65 72 6d 73 20 69 6e 20 25 73 20 42 59 20 63 6c  erms in %s BY cl
cc50: 61 75 73 65 22 2c 20 7a 54 79 70 65 29 3b 0a 20  ause", zType);. 
cc60: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
cc70: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
cc80: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  ect->pEList;.  i
cc90: 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a  f( pEList==0 ){.
cca0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ccb0: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
ccc0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
ccd0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  i++){.    int iC
cce0: 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  ol;.    Expr *pE
ccf0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
cd00: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 43 6f  ].pExpr;.    iCo
cd10: 6c 20 3d 20 6d 61 74 63 68 4f 72 64 65 72 42 79  l = matchOrderBy
cd20: 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 70  TermToExprList(p
cd30: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
cd40: 70 45 2c 20 69 2b 31 2c 20 30 2c 20 70 48 61 73  pE, i+1, 0, pHas
cd50: 41 67 67 29 3b 0a 20 20 20 20 69 66 28 20 69 43  Agg);.    if( iC
cd60: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 65  ol<0 ){.      re
cd70: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
cd80: 20 20 69 66 28 20 69 43 6f 6c 3e 70 45 4c 69 73    if( iCol>pELis
cd90: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
cda0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
cdb0: 79 70 65 20 3d 20 69 73 4f 72 64 65 72 20 3f 20  ype = isOrder ? 
cdc0: 22 4f 52 44 45 52 22 20 3a 20 22 47 52 4f 55 50  "ORDER" : "GROUP
cdd0: 22 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ";.      sqlite3
cde0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
cdf0: 20 0a 20 20 20 20 20 20 20 20 20 22 25 72 20 25   .         "%r %
ce00: 73 20 42 59 20 74 65 72 6d 20 6f 75 74 20 6f 66  s BY term out of
ce10: 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20   range - should 
ce20: 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 22 62  be ".         "b
ce30: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22  etween 1 and %d"
ce40: 2c 20 69 2b 31 2c 20 7a 54 79 70 65 2c 20 70 45  , i+1, zType, pE
ce50: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
ce60: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
ce70: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
ce80: 3e 30 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  >0 ){.      Coll
ce90: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 45 2d  Seq *pColl = pE-
cea0: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 6e  >pColl;.      in
ceb0: 74 20 66 6c 61 67 73 20 3d 20 70 45 2d 3e 66 6c  t flags = pE->fl
cec0: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
ced0: 61 74 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ate;.      sqlit
cee0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 29  e3ExprDelete(pE)
cef0: 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 73 71 6c  ;.      pE = sql
cf00: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
cf10: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31  pEList->a[iCol-1
cf20: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
cf30: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
cf40: 45 78 70 72 20 3d 20 70 45 3b 0a 20 20 20 20 20  Expr = pE;.     
cf50: 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 66 6c   if( pColl && fl
cf60: 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ags ){.        p
cf70: 45 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c  E->pColl = pColl
cf80: 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 66 6c  ;.        pE->fl
cf90: 61 67 73 20 7c 3d 20 66 6c 61 67 73 3b 0a 20 20  ags |= flags;.  
cfa0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
cfb0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
cfc0: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64  *.** Analyze and
cfd0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
cfe0: 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  UP BY clause in 
cff0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
d000: 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  nt.  Return.** t
d010: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
d020: 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20  ors seen..**.** 
d030: 54 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 64  The processing d
d040: 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
d050: 72 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  r the SELECT is 
d060: 73 69 6d 70 6c 65 20 6f 72 20 63 6f 6d 70 6f 75  simple or compou
d070: 6e 64 2e 0a 2a 2a 20 46 6f 72 20 61 20 73 69 6d  nd..** For a sim
d080: 70 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ple SELECT state
d090: 6d 65 6e 74 2c 20 65 76 72 79 20 74 65 72 6d 20  ment, evry term 
d0a0: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
d0b0: 6f 72 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 63  or GROUP BY.** c
d0c0: 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 62  lause needs to b
d0d0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  e an expression.
d0e0: 20 20 49 66 20 61 6e 79 20 65 78 70 72 65 73 73    If any express
d0f0: 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65  ion is an intege
d100: 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 2c 20 74  r.** constant, t
d110: 68 65 6e 20 74 68 61 74 20 65 78 70 72 65 73 73  hen that express
d120: 69 6f 6e 20 69 73 20 72 65 70 6c 61 63 65 64 20  ion is replaced 
d130: 62 79 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  by the correspon
d140: 64 69 6e 67 20 0a 2a 2a 20 65 78 70 72 65 73 73  ding .** express
d150: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 72 65 73  ion from the res
d160: 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 46  ult set..**.** F
d170: 6f 72 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  or compound SELE
d180: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 65  CT statements, e
d190: 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
d1a0: 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 66 0a 2a  needs to be of.*
d1b0: 2a 20 74 79 70 65 20 54 4b 5f 43 4f 4c 55 4d 4e  * type TK_COLUMN
d1c0: 20 77 69 74 68 20 61 20 69 54 61 62 6c 65 20 76   with a iTable v
d1d0: 61 6c 75 65 20 61 73 20 67 69 76 65 6e 20 69 6e  alue as given in
d1e0: 20 74 68 65 20 34 74 68 20 70 61 72 61 6d 65 74   the 4th paramet
d1f0: 65 72 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 65 78  er..** If any ex
d200: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69  pression is an i
d210: 6e 74 65 67 65 72 2c 20 74 68 61 74 20 62 65 63  nteger, that bec
d220: 6f 6d 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  omes the column 
d230: 6e 75 6d 62 65 72 2e 0a 2a 2a 20 4f 74 68 65 72  number..** Other
d240: 77 69 73 65 2c 20 6d 61 74 63 68 20 74 68 65 20  wise, match the 
d250: 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e  expression again
d260: 73 74 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  st result set co
d270: 6c 75 6d 6e 73 20 66 72 6f 6d 0a 2a 2a 20 74 68  lumns from.** th
d280: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45  e left-most SELE
d290: 43 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  CT..*/.static in
d2a0: 74 20 70 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e  t processCompoun
d2b0: 64 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  dOrderBy(.  Pars
d2c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d2d0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d2e0: 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72  text.  Leave err
d2f0: 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65  or messages here
d300: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
d310: 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54  elect,      /* T
d320: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
d330: 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ent containing t
d340: 68 65 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  he ORDER BY */. 
d350: 20 69 6e 74 20 69 54 61 62 6c 65 20 20 20 20 20   int iTable     
d360: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
d370: 20 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 6f   table for compo
d380: 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
d390: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
d3a0: 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  t i;.  ExprList 
d3b0: 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 45 78 70  *pOrderBy;.  Exp
d3c0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
d3d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
d3e0: 69 6e 74 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31  int moreToDo = 1
d3f0: 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  ;..  pOrderBy = 
d400: 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42  pSelect->pOrderB
d410: 79 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  y;.  if( pOrderB
d420: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y==0 ) return 0;
d430: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d  .  if( pOrderBy-
d440: 3e 6e 45 78 70 72 3e 53 51 4c 49 54 45 5f 4d 41  >nExpr>SQLITE_MA
d450: 58 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  X_COLUMN ){.    
d460: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d470: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
d480: 79 20 74 65 72 6d 73 20 69 6e 20 4f 52 44 45 52  y terms in ORDER
d490: 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20 20   BY clause");.  
d4a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
d4b0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
d4c0: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  b;.  for(i=0; i<
d4d0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
d4e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4f 72 64 65   i++){.    pOrde
d4f0: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
d500: 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   0;.  }.  while(
d510: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
d520: 20 29 7b 0a 20 20 20 20 70 53 65 6c 65 63 74 20   ){.    pSelect 
d530: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
d540: 72 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  r;.  }.  while( 
d550: 70 53 65 6c 65 63 74 20 26 26 20 6d 6f 72 65 54  pSelect && moreT
d560: 6f 44 6f 20 29 7b 0a 20 20 20 20 6d 6f 72 65 54  oDo ){.    moreT
d570: 6f 44 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  oDo = 0;.    for
d580: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
d590: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
d5a0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20       int iCol;. 
d5b0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20 2a       Expr *pE, *
d5c0: 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20  pDup;.      if( 
d5d0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
d5e0: 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  one ) continue;.
d5f0: 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72 64 65        pE = pOrde
d600: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
d610: 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71  .      pDup = sq
d620: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
d630: 20 70 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20   pE);.      if( 
d640: 70 44 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDup==0 ){.     
d650: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
d660: 20 20 20 7d 0a 20 20 20 20 20 20 69 43 6f 6c 20     }.      iCol 
d670: 3d 20 6d 61 74 63 68 4f 72 64 65 72 42 79 54 65  = matchOrderByTe
d680: 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 70 50 61  rmToExprList(pPa
d690: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 44  rse, pSelect, pD
d6a0: 75 70 2c 20 69 2b 31 2c 20 31 2c 20 30 29 3b 0a  up, i+1, 1, 0);.
d6b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d6c0: 72 44 65 6c 65 74 65 28 70 44 75 70 29 3b 0a 20  rDelete(pDup);. 
d6d0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
d6e0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
d6f0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
d700: 20 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c     pEList = pSel
d710: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ect->pEList;.   
d720: 20 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30     if( pEList==0
d730: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
d740: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
d750: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 70 45 4c      if( iCol>pEL
d760: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
d770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
d780: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
d790: 20 20 20 20 20 20 20 20 20 20 22 25 72 20 4f 52            "%r OR
d7a0: 44 45 52 20 42 59 20 74 65 72 6d 20 6f 75 74 20  DER BY term out 
d7b0: 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c  of range - shoul
d7c0: 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20  d be ".         
d7d0: 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64    "between 1 and
d7e0: 20 25 64 22 2c 20 69 2b 31 2c 20 70 45 4c 69 73   %d", i+1, pELis
d7f0: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
d800: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
d810: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
d820: 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Col>0 ){.       
d830: 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c   pE->op = TK_COL
d840: 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70 45 2d  UMN;.        pE-
d850: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65  >iTable = iTable
d860: 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 69 41  ;.        pE->iA
d870: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  gg = -1;.       
d880: 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69   pE->iColumn = i
d890: 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 20 20 70  Col-1;.        p
d8a0: 45 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  E->pTab = 0;.   
d8b0: 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
d8c0: 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20  [i].done = 1;.  
d8d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d8e0: 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b     moreToDo = 1;
d8f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d900: 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65     pSelect = pSe
d910: 6c 65 63 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  lect->pNext;.  }
d920: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
d930: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
d940: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72  ++){.    if( pOr
d950: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
d960: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
d970: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
d980: 72 73 65 2c 20 22 25 72 20 4f 52 44 45 52 20 42  rse, "%r ORDER B
d990: 59 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20  Y term does not 
d9a0: 6d 61 74 63 68 20 61 6e 79 20 22 0a 20 20 20 20  match any ".    
d9b0: 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 20          "column 
d9c0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
d9d0: 74 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  t", i+1);.      
d9e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
d9f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
da00: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
da10: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
da20: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
da30: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
da40: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
da50: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
da60: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
da70: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
da80: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
da90: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
daa0: 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
dab0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
dac0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
dad0: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
dae0: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
daf0: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
db00: 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70  ite3VdbeCreate(p
db10: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a  Parse->db);.  }.
db20: 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a    return v;.}...
db30: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
db40: 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
db50: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
db60: 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
db70: 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74  on the.** pLimit
db80: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70   and pOffset exp
db90: 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69  ressions.  pLimi
dba0: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f  t and pOffset ho
dbb0: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
dbc0: 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
dbd0: 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
dbe0: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
dbf0: 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
dc00: 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
dc10: 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
dc20: 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
dc30: 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
dc40: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
dc50: 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
dc60: 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
dc70: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
dc80: 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
dc90: 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
dca0: 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
dcb0: 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
dcc0: 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
dcd0: 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
dce0: 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
dcf0: 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
dd00: 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
dd10: 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
dd20: 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c  the values of iL
dd30: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
dd40: 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
dd50: 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
dd60: 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d   defined by pLim
dd70: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20  it and pOffset. 
dd80: 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69   iLimit and.** i
dd90: 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
dda0: 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
ddb0: 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
ddc0: 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20  fault values.** 
ddd0: 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74  (usually but not
dde0: 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f   always -1) prio
ddf0: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
de00: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e  s routine..** On
de10: 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20  ly if pLimit!=0 
de20: 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f  or pOffset!=0 do
de30: 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
de40: 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65  ters get.** rede
de50: 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f  fined.  The UNIO
de60: 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75  N ALL operator u
de70: 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74  ses this propert
de80: 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68  y to force.** th
de90: 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73  e reuse of the s
dea0: 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  ame limit and of
deb0: 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61  fset registers a
dec0: 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a  cross multiple.*
ded0: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
dee0: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
def0: 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  oid computeLimit
df00: 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20  Registers(Parse 
df10: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
df20: 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b  *p, int iBreak){
df30: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a  .  Vdbe *v = 0;.
df40: 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30    int iLimit = 0
df50: 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b  ;.  int iOffset;
df60: 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64  .  int addr1, ad
df70: 64 72 32 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  dr2;..  /* .  **
df80: 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61   "LIMIT -1" alwa
df90: 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77  ys shows all row
dfa0: 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d  s.  There is som
dfb0: 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72  e.  ** contraver
dfc0: 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68  sy about what th
dfd0: 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
dfe0: 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20  or should be..  
dff0: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69  ** The current i
e000: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
e010: 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20  terprets "LIMIT 
e020: 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20  0" to mean.  ** 
e030: 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  no rows..  */.  
e040: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
e050: 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
e060: 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 72 73 65   iLimit = pParse
e070: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 50 61 72  ->nMem;.    pPar
e080: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20  se->nMem += 2;. 
e090: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
e0a0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
e0b0: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
e0c0: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
e0d0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
e0e0: 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
e0f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e100: 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
e110: 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Int, 0, 0);.    
e120: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e130: 32 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  2(v, OP_MemStore
e140: 2c 20 69 4c 69 6d 69 74 2c 20 31 29 3b 0a 20 20  , iLimit, 1);.  
e150: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
e160: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
e170: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
e180: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e190: 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 69 4c 69 6d  _IfMemZero, iLim
e1a0: 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  it, iBreak);.   
e1b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e1c0: 70 32 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  p2(v, OP_MemLoad
e1d0: 2c 20 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20  , iLimit, 0);.  
e1e0: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73  }.  if( p->pOffs
e1f0: 65 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4f 66  et ){.    p->iOf
e200: 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d  fset = iOffset =
e210: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
e220: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
e230: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
e240: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
e250: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
e260: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
e270: 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  se, p->pOffset);
e280: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e290: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
e2a0: 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20  tBeInt, 0, 0);. 
e2b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e2c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  dOp2(v, OP_MemSt
e2d0: 6f 72 65 2c 20 69 4f 66 66 73 65 74 2c 20 70 2d  ore, iOffset, p-
e2e0: 3e 70 4c 69 6d 69 74 3d 3d 30 29 3b 0a 20 20 20  >pLimit==0);.   
e2f0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
e300: 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72   "OFFSET counter
e310: 22 29 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d  "));.    addr1 =
e320: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e330: 70 32 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f  p2(v, OP_IfMemPo
e340: 73 2c 20 69 4f 66 66 73 65 74 2c 20 30 29 3b 0a  s, iOffset, 0);.
e350: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e360: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 6f 70 2c  ddOp2(v, OP_Pop,
e370: 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   1, 0);.    sqli
e380: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e390: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
e3a0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
e3b0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
e3c0: 64 64 72 31 29 3b 0a 20 20 20 20 69 66 28 20 70  ddr1);.    if( p
e3d0: 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
e3e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e3f0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 2c 20 30  Op2(v, OP_Add, 0
e400: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
e410: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
e420: 29 7b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73  ){.    addr1 = s
e430: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e440: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c  (v, OP_IfMemPos,
e450: 20 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20   iLimit, 0);.   
e460: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e470: 70 32 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  p2(v, OP_Pop, 1,
e480: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
e490: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e4a0: 5f 4d 65 6d 49 6e 74 2c 20 2d 31 2c 20 69 4c 69  _MemInt, -1, iLi
e4b0: 6d 69 74 2b 31 29 3b 0a 20 20 20 20 61 64 64 72  mit+1);.    addr
e4c0: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
e4d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
e4e0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
e4f0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
e500: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
e510: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e520: 32 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  2(v, OP_MemStore
e530: 2c 20 69 4c 69 6d 69 74 2b 31 2c 20 31 29 3b 0a  , iLimit+1, 1);.
e540: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
e550: 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45  (v, "LIMIT+OFFSE
e560: 54 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  T"));.    sqlite
e570: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
e580: 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a   addr2);.  }.}..
e590: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
e5a0: 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
e5b0: 6f 20 75 73 65 20 66 6f 72 20 73 6f 72 74 69 6e  o use for sortin
e5c0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
e5d0: 64 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49  d createSortingI
e5e0: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
e5f0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 45  se, Select *p, E
e600: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
e610: 79 29 7b 0a 20 20 69 66 28 20 70 4f 72 64 65 72  y){.  if( pOrder
e620: 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  By ){.    int ad
e630: 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  dr;.    assert( 
e640: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
e650: 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72  or==0 );.    pOr
e660: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20  derBy->iECursor 
e670: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
e680: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
e690: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
e6a0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
e6b0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a  _OpenEphemeral,.
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64              pOrd
e6e0: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
e6f0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
e700: 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
e710: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
e720: 32 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  2] == -1 );.    
e730: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
e740: 32 5d 20 3d 20 61 64 64 72 3b 0a 20 20 7d 0a 7d  2] = addr;.  }.}
e750: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e760: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
e770: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ELECT./*.** Retu
e780: 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
e790: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
e7a0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43  uence for the iC
e7b0: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a  ol-th column of.
e7c0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
e7d0: 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  t for the compou
e7e0: 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd-select statem
e7f0: 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e  ent "p".  Return
e800: 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20   NULL if.** the 
e810: 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65  column has no de
e820: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
e830: 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
e840: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
e850: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63  quence for the c
e860: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69  ompound select i
e870: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65  s taken from the
e880: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  .** left-most te
e890: 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  rm of the select
e8a0: 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c   that has a coll
e8b0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
e8c0: 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65  */.static CollSe
e8d0: 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f  q *multiSelectCo
e8e0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
e8f0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
e900: 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c  int iCol){.  Col
e910: 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66  lSeq *pRet;.  if
e920: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
e930: 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53     pRet = multiS
e940: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
e950: 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  rse, p->pPrior, 
e960: 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol);.  }else{.
e970: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
e980: 7d 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  }.  if( pRet==0 
e990: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  ){.    pRet = sq
e9a0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
e9b0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
e9c0: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
e9d0: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
e9e0: 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20   pRet;.}.#endif 
e9f0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
ea00: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
ea10: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
ea20: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
ea30: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69  SELECT./*.** Thi
ea40: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
ea50: 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
ea60: 20 71 75 65 72 79 20 74 68 61 74 20 69 73 20 72   query that is r
ea70: 65 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a  eally the union.
ea80: 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65 63 74 69  ** or intersecti
ea90: 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  on of two or mor
eaa0: 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
eab0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f  es..**.** "p" po
eac0: 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68  ints to the righ
ead0: 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77  t-most of the tw
eae0: 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20  o queries.  the 
eaf0: 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20  query on the.** 
eb00: 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f  left is p->pPrio
eb10: 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65  r.  The left que
eb20: 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  ry could also be
eb30: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
eb40: 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61  y.** in which ca
eb50: 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
eb60: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72  will be called r
eb70: 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a  ecursively. .**.
eb80: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f  ** The results o
eb90: 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
eba0: 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74  y are to be writ
ebb0: 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69  ten into a desti
ebc0: 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70  nation.** of typ
ebd0: 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72  e eDest with par
ebe0: 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a  ameter iParm..**
ebf0: 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
ec00: 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65  Consider a three
ec10: 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51  -way compound SQ
ec20: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  L statement..**.
ec30: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
ec40: 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
ec50: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55  LECT b FROM t2 U
ec60: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52  NION SELECT c FR
ec70: 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73  OM t3.**.** This
ec80: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
ec90: 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f  rsed up as follo
eca0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ws:.**.**     SE
ecb0: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
ecc0: 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  *      |.**     
ecd0: 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54   `----->  SELECT
ece0: 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20   b FROM t2.**   
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
ed00: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
ed10: 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43   `------>  SELEC
ed20: 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a  T a FROM t1.**.*
ed30: 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20  * The arrows in 
ed40: 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76  the diagram abov
ed50: 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  e represent the 
ed60: 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f  Select.pPrior po
ed70: 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20  inter..** So if 
ed80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
ed90: 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71  called with p eq
eda0: 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75  ual to the t3 qu
edb0: 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72  ery, then.** pPr
edc0: 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ior will be the 
edd0: 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70  t2 query.  p->op
ede0: 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f   will be TK_UNIO
edf0: 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  N in this case..
ee00: 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61  **.** Notice tha
ee10: 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  t because of the
ee20: 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73   way SQLite pars
ee30: 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  es compound SELE
ee40: 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69  CTs, the.** indi
ee50: 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61  vidual selects a
ee60: 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d  lways group from
ee70: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a   left to right..
ee80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
ee90: 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72  ltiSelect(.  Par
eea0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
eeb0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
eec0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
eed0: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
eee0: 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
eef0: 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
ef00: 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
ef10: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
ef20: 2c 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20  ,    /* What to 
ef30: 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
ef40: 73 75 6c 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  sults */.  char 
ef50: 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20  *aff            
ef60: 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20   /* If eDest is 
ef70: 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61  SRT_Union, the a
ef80: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
ef90: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
efa0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
efb0: 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
efc0: 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
efd0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
efe0: 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
eff0: 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
f000: 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
f010: 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
f020: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
f030: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
f040: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
f050: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
f060: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
f070: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
f080: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
f090: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
f0a0: 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
f0b0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
f0c0: 20 6f 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20 61   on p */.  int a
f0d0: 53 65 74 50 32 5b 32 5d 3b 20 20 20 20 20 20 20  SetP2[2];       
f0e0: 20 2f 2a 20 53 65 74 20 50 32 20 76 61 6c 75 65   /* Set P2 value
f0f0: 20 6f 66 20 74 68 65 73 65 20 6f 70 20 74 6f 20   of these op to 
f100: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
f110: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 74 50  s */.  int nSetP
f120: 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  2 = 0;       /* 
f130: 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20  Number of slots 
f140: 69 6e 20 61 53 65 74 50 32 5b 5d 20 75 73 65 64  in aSetP2[] used
f150: 20 2a 2f 0a 0a 20 20 53 65 6c 65 63 74 44 65 73   */..  SelectDes
f160: 74 20 64 65 73 74 3b 0a 20 20 64 65 73 74 2e 65  t dest;.  dest.e
f170: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
f180: 65 73 74 3b 0a 20 20 64 65 73 74 2e 69 50 61 72  est;.  dest.iPar
f190: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  m = pDest->iParm
f1a0: 3b 0a 20 20 64 65 73 74 2e 61 66 66 69 6e 69 74  ;.  dest.affinit
f1b0: 79 20 3d 20 70 44 65 73 74 2d 3e 61 66 66 69 6e  y = pDest->affin
f1c0: 69 74 79 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ity;..  /* Make 
f1d0: 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
f1e0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
f1f0: 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
f200: 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
f210: 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
f220: 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c  (right-most) SEL
f230: 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
f240: 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
f250: 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e  DER BY or LIMIT.
f260: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30  .  */.  if( p==0
f270: 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30   || p->pPrior==0
f280: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
f290: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
f2a0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
f2b0: 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
f2c0: 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ior;.  assert( p
f2d0: 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
f2e0: 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61  t!=pPrior );.  a
f2f0: 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
f300: 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52  Rightmost==p->pR
f310: 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 69 66  ightmost );.  if
f320: 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
f330: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
f340: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f350: 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
f360: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
f370: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
f380: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
f390: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
f3a0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
f3b0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
f3c0: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
f3d0: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
f3e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
f3f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
f400: 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
f410: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
f420: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
f430: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
f440: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
f450: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
f460: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
f470: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
f480: 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76  sure we have a v
f490: 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e  alid query engin
f4a0: 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61  e.  If not, crea
f4b0: 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20  te a new one..  
f4c0: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
f4d0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
f4e0: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
f4f0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
f500: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
f510: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
f520: 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
f530: 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
f540: 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
f550: 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ary.  */.  if( d
f560: 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45  est.eDest==SRT_E
f570: 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61  phemTab ){.    a
f580: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
f590: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f5a0: 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28 61 53  nSetP2<sizeof(aS
f5b0: 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61 53 65  etP2)/sizeof(aSe
f5c0: 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20 61  tP2[0]) );.    a
f5d0: 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20  SetP2[nSetP2++] 
f5e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f5f0: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
f600: 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 50  hemeral, dest.iP
f610: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 64 65 73  arm, 0);.    des
f620: 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61  t.eDest = SRT_Ta
f630: 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ble;.  }..  /* G
f640: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
f650: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
f660: 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
f670: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 4f  ments..  */.  pO
f680: 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
f690: 65 72 42 79 3b 0a 20 20 73 77 69 74 63 68 28 20  erBy;.  switch( 
f6a0: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
f6b0: 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20  e TK_ALL: {.    
f6c0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
f6d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
f6e0: 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20   addr = 0;.     
f6f0: 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
f700: 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
f710: 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
f720: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
f730: 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72  ;.        pPrior
f740: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70  ->pOffset = p->p
f750: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
f760: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
f770: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
f780: 72 2c 20 26 64 65 73 74 2c 20 30 2c 20 30 2c 20  r, &dest, 0, 0, 
f790: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20  0, aff);.       
f7a0: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
f7b0: 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73          p->pOffs
f7c0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
f7d0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
f7e0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
f7f0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
f800: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
f810: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
f820: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
f830: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
f840: 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73          p->iOffs
f850: 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
f860: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66  fset;.        if
f870: 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29  ( p->iLimit>=0 )
f880: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72  {.          addr
f890: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f8a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  dOp2(v, OP_IfMem
f8b0: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
f8c0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56   0);.          V
f8d0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
f8e0: 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49  Jump ahead if LI
f8f0: 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a  MIT reached"));.
f900: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f910: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
f920: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
f930: 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  &dest, 0, 0, 0, 
f940: 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  aff);.        p-
f950: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
f960: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
f970: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
f980: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f990: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
f9a0: 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72 20         if( addr 
f9b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
f9c0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
f9d0: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
f9e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
f9f0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
fa00: 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41    /* For UNION A
fa10: 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20  LL ... ORDER BY 
fa20: 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
fa30: 74 68 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f  the next case */
fa40: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
fa50: 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63  TK_EXCEPT:.    c
fa60: 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a  ase TK_UNION: {.
fa70: 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54        int unionT
fa80: 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ab;    /* Cursor
fa90: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
faa0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68  emporary table h
fab0: 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f  olding result */
fac0: 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
fad0: 30 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  0;      /* One o
fae0: 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61  f the SRT_ opera
faf0: 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74  tions to apply t
fb00: 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20  o self */.      
fb10: 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20  int priorOp;    
fb20: 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65   /* The SRT_ ope
fb30: 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  ration to apply 
fb40: 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73  to prior selects
fb50: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
fb60: 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74  pLimit, *pOffset
fb70: 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65  ; /* Saved value
fb80: 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61  s of p->nLimit a
fb90: 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f  nd p->nOffset */
fba0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
fbb0: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
fbc0: 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20  t uniondest;..  
fbd0: 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d      priorOp = p-
fbe0: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52  >op==TK_ALL ? SR
fbf0: 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e  T_Table : SRT_Un
fc00: 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64  ion;.      if( d
fc10: 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72  est.eDest==prior
fc20: 4f 70 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d  Op && pOrderBy==
fc30: 30 20 26 26 20 21 70 2d 3e 70 4c 69 6d 69 74 20  0 && !p->pLimit 
fc40: 26 26 20 21 70 2d 3e 70 4f 66 66 73 65 74 20 29  && !p->pOffset )
fc50: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
fc60: 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70  can reuse a temp
fc70: 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65  orary table gene
fc80: 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43  rated by a SELEC
fc90: 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20  T to our.       
fca0: 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20   ** right..     
fcb0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
fcc0: 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 50  ionTab = dest.iP
fcd0: 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  arm;.      }else
fce0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
fcf0: 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65  will need to cre
fd00: 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70  ate our own temp
fd10: 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68  orary table to h
fd20: 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  old the.        
fd30: 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
fd40: 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20  results..       
fd50: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
fd60: 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nTab = pParse->n
fd70: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  Tab++;.        i
fd80: 66 28 20 70 72 6f 63 65 73 73 43 6f 6d 70 6f 75  f( processCompou
fd90: 6e 64 4f 72 64 65 72 42 79 28 70 50 61 72 73 65  ndOrderBy(pParse
fda0: 2c 20 70 2c 20 75 6e 69 6f 6e 54 61 62 29 20 29  , p, unionTab) )
fdb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
fdc0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   1;.          go
fdd0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
fde0: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
fdf0: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
fe00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fe10: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
fe20: 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ral, unionTab, 0
fe30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
fe40: 72 69 6f 72 4f 70 3d 3d 53 52 54 5f 54 61 62 6c  riorOp==SRT_Tabl
fe50: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  e ){.          a
fe60: 73 73 65 72 74 28 20 6e 53 65 74 50 32 3c 73 69  ssert( nSetP2<si
fe70: 7a 65 6f 66 28 61 53 65 74 50 32 29 2f 73 69 7a  zeof(aSetP2)/siz
fe80: 65 6f 66 28 61 53 65 74 50 32 5b 30 5d 29 20 29  eof(aSetP2[0]) )
fe90: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 53 65 74  ;.          aSet
fea0: 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 61  P2[nSetP2++] = a
feb0: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ddr;.        }el
fec0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
fed0: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
fee0: 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
fef0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ;.          p->a
ff00: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
ff10: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 20   addr;.         
ff20: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e   p->pRightmost->
ff30: 75 73 65 73 45 70 68 6d 20 3d 20 31 3b 0a 20 20  usesEphm = 1;.  
ff40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ff50: 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64  createSortingInd
ff60: 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  ex(pParse, p, pO
ff70: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20  rderBy);.       
ff80: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
ff90: 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  st );.      }.. 
ffa0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
ffb0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
ffc0: 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20  ts to our left. 
ffd0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
ffe0: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
fff0: 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20  OrderBy );.     
10000 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74   uniondest.eDest
10010 20 3d 20 70 72 69 6f 72 4f 70 3b 0a 20 20 20 20   = priorOp;.    
10020 20 20 75 6e 69 6f 6e 64 65 73 74 2e 69 50 61 72    uniondest.iPar
10030 6d 20 3d 20 75 6e 69 6f 6e 54 61 62 3b 0a 20 20  m = unionTab;.  
10040 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10050 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
10060 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73  Prior, &uniondes
10070 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  t, 0, 0, 0, aff)
10080 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
10090 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
100a0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
100b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
100c0 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
100d0 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
100e0 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
100f0 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f      switch( p->o
10100 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61  p ){.         ca
10110 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f  se TK_EXCEPT:  o
10120 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20  p = SRT_Except; 
10130 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
10140 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
10150 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f     op = SRT_Unio
10160 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  n;    break;.   
10170 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c        case TK_AL
10180 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f  L:     op = SRT_
10190 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b  Table;    break;
101a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
101b0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
101c0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
101d0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69  = 0;.      p->di
101e0 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20  sallowOrderBy = 
101f0 70 4f 72 64 65 72 42 79 21 3d 30 3b 0a 20 20 20  pOrderBy!=0;.   
10200 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
10210 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
10220 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
10230 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
10240 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
10250 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
10260 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44      uniondest.eD
10270 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20  est = op;.      
10280 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
10290 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75  ct(pParse, p, &u
102a0 6e 69 6f 6e 64 65 73 74 2c 20 30 2c 20 30 2c 20  niondest, 0, 0, 
102b0 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 2f  0, aff);.      /
102c0 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69  * Query flatteni
102d0 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ng in sqlite3Sel
102e0 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69  ect() might refi
102f0 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a  ll p->pOrderBy..
10300 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
10310 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
10320 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
10330 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
10340 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
10350 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
10360 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72  istDelete(p->pOr
10370 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 2d  derBy);.      p-
10380 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
10390 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
103a0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
103b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
103c0 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69  rDelete(p->pLimi
103d0 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
103e0 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
103f0 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
10400 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   pOffset;.      
10410 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a  p->iLimit = -1;.
10420 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
10430 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28   = -1;.      if(
10440 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
10450 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
10460 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a  _end;.      }...
10470 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
10480 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   the data in the
10490 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
104a0 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
104b0 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  orm.      ** it 
104c0 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
104d0 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
104e0 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20   */      .      
104f0 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d  if( dest.eDest!=
10500 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e  priorOp || union
10510 54 61 62 21 3d 64 65 73 74 2e 69 50 61 72 6d 20  Tab!=dest.iParm 
10520 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
10530 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
10540 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  tart;.        as
10550 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
10560 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
10570 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 43  est.eDest==SRT_C
10580 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
10590 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
105a0 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
105b0 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
105c0 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
105d0 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
105e0 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65  or;.          ge
105f0 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
10600 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
10610 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
10620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10630 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
10640 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
10650 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
10660 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
10670 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
10680 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
10690 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
106a0 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
106b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
106c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
106d0 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
106e0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
106f0 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
10700 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
10710 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  v);.        rc =
10720 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
10730 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
10740 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  EList, unionTab,
10750 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
10760 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
10770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10780 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 26 64  pOrderBy, -1, &d
10790 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
107a0 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ak, 0);.        
107b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
107c0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
107d0 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
107e0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
107f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
10800 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
10810 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
10820 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10830 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10840 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
10850 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , iStart);.     
10860 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
10870 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
10880 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
10890 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
108a0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e  (v, OP_Close, un
108b0 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
108c0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
108d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
108e0 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a  TK_INTERSECT: {.
108f0 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20        int tab1, 
10900 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20  tab2;.      int 
10910 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
10920 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70  Start;.      Exp
10930 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
10940 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  set;.      int a
10950 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  ddr;.      Selec
10960 74 44 65 73 74 20 69 6e 74 65 72 73 65 63 74 64  tDest intersectd
10970 65 73 74 20 3d 20 7b 53 52 54 5f 55 6e 69 6f 6e  est = {SRT_Union
10980 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 20 20 20 20  , 0, 0};..      
10990 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
109a0 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
109b0 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
109c0 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
109d0 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
109e0 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
109f0 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
10a00 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
10a10 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
10a20 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
10a30 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
10a40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
10a50 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
10a60 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
10a70 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
10a80 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f 63 65  .      if( proce
10a90 73 73 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42  ssCompoundOrderB
10aa0 79 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61 62  y(pParse, p, tab
10ab0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
10ac0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
10ad0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
10ae0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
10af0 20 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67     createSorting
10b00 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c  Index(pParse, p,
10b10 20 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20 20   pOrderBy);..   
10b20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
10b30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10b40 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
10b50 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
10b60 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
10b70 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
10b80 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
10b90 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
10ba0 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  addr;.      p->p
10bb0 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45  Rightmost->usesE
10bc0 70 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 61  phm = 1;.      a
10bd0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
10be0 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
10bf0 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
10c00 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
10c10 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
10c20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
10c30 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74  .      intersect
10c40 64 65 73 74 2e 69 50 61 72 6d 20 3d 20 74 61 62  dest.iParm = tab
10c50 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  1;.      rc = sq
10c60 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
10c70 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
10c80 65 72 73 65 63 74 64 65 73 74 2c 20 30 2c 20 30  ersectdest, 0, 0
10c90 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
10ca0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
10cb0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
10cc0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
10cd0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
10ce0 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
10cf0 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  ECT into tempora
10d00 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a  ry table "tab2".
10d10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
10d20 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
10d30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
10d40 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
10d50 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  2, 0);.      ass
10d60 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
10d70 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[1] == -1 );
10d80 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
10d90 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72  enEphm[1] = addr
10da0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
10db0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69  r = 0;.      pLi
10dc0 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
10dd0 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
10de0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
10df0 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
10e00 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
10e10 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  et = 0;.      in
10e20 74 65 72 73 65 63 74 64 65 73 74 2e 69 50 61 72  tersectdest.iPar
10e30 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20  m = tab2;.      
10e40 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
10e50 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69  ct(pParse, p, &i
10e60 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 30 2c  ntersectdest, 0,
10e70 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
10e80 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
10e90 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  Prior;.      sql
10ea0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
10eb0 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
10ec0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
10ed0 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
10ee0 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
10ef0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
10f00 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
10f10 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
10f20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
10f30 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
10f40 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
10f50 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
10f60 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
10f70 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
10f80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
10f90 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
10fa0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  );.      if( des
10fb0 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  t.eDest==SRT_Cal
10fc0 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
10fd0 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
10fe0 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = p;.        whi
10ff0 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
11000 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
11010 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
11020 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
11030 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
11040 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
11050 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
11060 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
11070 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
11080 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
11090 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
110a0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
110b0 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
110c0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
110d0 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
110e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
110f0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
11100 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
11110 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d  ;.      iStart =
11120 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11130 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c  p2(v, OP_RowKey,
11140 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
11150 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11160 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  p2(v, OP_NotFoun
11170 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 29 3b  d, tab2, iCont);
11180 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65  .      rc = sele
11190 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
111a0 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
111b0 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73  , tab1, p->pELis
111c0 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  t->nExpr,.      
111d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111e0 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2c         pOrderBy,
111f0 20 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e   -1, &dest, iCon
11200 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20  t, iBreak, 0);. 
11210 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
11220 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
11230 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
11240 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
11250 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
11260 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
11270 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
11280 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11290 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
112a0 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
112b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
112c0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
112d0 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
112e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
112f0 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
11300 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
11310 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11320 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
11330 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
11340 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
11350 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
11360 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20   all SELECTs in 
11370 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
11380 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
11390 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20  er of elements. 
113a0 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73   ** in their res
113b0 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20  ult sets..  */. 
113c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
113d0 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
113e0 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d  List );.  if( p-
113f0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
11400 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
11410 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
11420 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11430 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f  rse, "SELECTs to
11440 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
11450 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20  ght of %s".     
11460 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
11470 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
11480 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
11490 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
114a0 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
114b0 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
114c0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
114d0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
114e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
114f0 6d 6e 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  mns in temporary
11500 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e   tables.  */.  n
11510 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
11520 3e 6e 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28  >nExpr;.  while(
11530 20 6e 53 65 74 50 32 20 29 7b 0a 20 20 20 20 73   nSetP2 ){.    s
11540 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
11550 50 32 28 76 2c 20 61 53 65 74 50 32 5b 2d 2d 6e  P2(v, aSetP2[--n
11560 53 65 74 50 32 5d 2c 20 6e 43 6f 6c 29 3b 0a 20  SetP2], nCol);. 
11570 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
11580 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
11590 6e 63 65 73 20 75 73 65 64 20 62 79 20 65 69 74  nces used by eit
115a0 68 65 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  her the ORDER BY
115b0 20 63 6c 61 75 73 65 20 6f 72 0a 20 20 2a 2a 20   clause or.  ** 
115c0 62 79 20 61 6e 79 20 74 65 6d 70 6f 72 61 72 79  by any temporary
115d0 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74   tables needed t
115e0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
115f0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
11600 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65  .  ** Attach the
11610 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
11620 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72  re to all tempor
11630 61 72 79 20 74 61 62 6c 65 73 2e 20 20 49 6e 76  ary tables.  Inv
11640 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 4f 52 44  oke the.  ** ORD
11650 45 52 20 42 59 20 70 72 6f 63 65 73 73 69 6e 67  ER BY processing
11660 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
11670 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
11680 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
11690 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62  section is run b
116a0 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  y the right-most
116b0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
116c0 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c  t only..  ** SEL
116d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
116e0 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79  o the left alway
116f0 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  s skip this part
11700 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
11710 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69  t.  ** SELECT mi
11720 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68  ght also skip th
11730 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61  is part if it ha
11740 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
11750 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f  ause and.  ** no
11760 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65   temp tables are
11770 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
11780 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 7c    if( pOrderBy |
11790 7c 20 70 2d 3e 75 73 65 73 45 70 68 6d 20 29 7b  | p->usesEphm ){
117a0 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
117b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117c0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
117d0 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  er */.    KeyInf
117e0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20  o *pKeyInfo;    
117f0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
11800 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
11810 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
11820 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   */.    Select *
11830 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
11840 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
11850 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c  ping through SEL
11860 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  ECT statements *
11870 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 43 6f  /.    int nKeyCo
11880 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
11890 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
118a0 20 65 6e 74 72 69 65 73 20 69 6e 20 70 4b 65 79   entries in pKey
118b0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 2a 2f 0a  Info->aCol[] */.
118c0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70      CollSeq **ap
118d0 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
118e0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
118f0 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66   through pKeyInf
11900 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20  o->aColl[] */.  
11910 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 43 6f 70    CollSeq **aCop
11920 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
11930 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 4b 65  /* A copy of pKe
11940 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a  yInfo->aColl[] *
11950 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
11960 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20  ->pRightmost==p 
11970 29 3b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d  );.    nKeyCol =
11980 20 6e 43 6f 6c 20 2b 20 28 70 4f 72 64 65 72 42   nCol + (pOrderB
11990 79 20 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y ? pOrderBy->nE
119a0 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 70 4b  xpr : 0);.    pK
119b0 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
119c0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
119d0 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f  sizeof(*pKeyInfo
11a00 29 2b 6e 4b 65 79 43 6f 6c 2a 28 73 69 7a 65 6f  )+nKeyCol*(sizeo
11a10 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29  f(CollSeq*) + 1)
11a20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79  );.    if( !pKey
11a30 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  Info ){.      rc
11a40 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
11a50 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  .      goto mult
11a60 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
11a70 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66    }..    pKeyInf
11a80 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  o->enc = ENC(pPa
11a90 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4b  rse->db);.    pK
11aa0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d  eyInfo->nField =
11ab0 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28   nCol;..    for(
11ac0 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
11ad0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
11ae0 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
11af0 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
11b00 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
11b10 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
11b20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
11b30 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
11b40 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
11b50 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
11b60 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
11b70 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
11b80 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
11b90 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
11ba0 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
11bb0 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
11bc0 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
11bd0 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
11be0 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
11bf0 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
11c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
11c10 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
11c20 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
11c30 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
11c40 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
11c50 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
11c60 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
11c70 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
11c80 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
11c90 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
11ca0 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
11cb0 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
11cc0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
11cd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11ce0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11cf0 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
11d00 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
11d10 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
11d20 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
11d30 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
11d40 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
11d50 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
11d60 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
11d70 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
11d80 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
11d90 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
11da0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 54 65  rList_item *pOTe
11db0 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  rm = pOrderBy->a
11dc0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64  ;.      int nOrd
11dd0 65 72 42 79 45 78 70 72 20 3d 20 70 4f 72 64 65  erByExpr = pOrde
11de0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
11df0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
11e00 20 20 75 38 20 2a 70 53 6f 72 74 4f 72 64 65 72    u8 *pSortOrder
11e10 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 75 73  ;..      /* Reus
11e20 65 20 74 68 65 20 73 61 6d 65 20 70 4b 65 79 49  e the same pKeyI
11e30 6e 66 6f 20 66 6f 72 20 74 68 65 20 4f 52 44 45  nfo for the ORDE
11e40 52 20 42 59 20 61 73 20 77 61 73 20 75 73 65 64  R BY as was used
11e50 20 61 62 6f 76 65 20 66 6f 72 0a 20 20 20 20 20   above for.     
11e60 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   ** the compound
11e70 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
11e80 74 73 2e 20 20 45 78 63 65 70 74 20 77 65 20 68  ts.  Except we h
11e90 61 76 65 20 74 6f 20 63 68 61 6e 67 65 20 6f 75  ave to change ou
11ea0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70  t the.      ** p
11eb0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d  KeyInfo->aColl[]
11ec0 20 76 61 6c 75 65 73 2e 20 20 53 6f 6d 65 20 6f   values.  Some o
11ed0 66 20 74 68 65 20 61 43 6f 6c 6c 5b 5d 20 76 61  f the aColl[] va
11ee0 6c 75 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 20  lues will be.   
11ef0 20 20 20 2a 2a 20 72 65 75 73 65 64 20 77 68 65     ** reused whe
11f00 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74  n constructing t
11f10 68 65 20 70 4b 65 79 49 6e 66 6f 20 66 6f 72 20  he pKeyInfo for 
11f20 74 68 65 20 4f 52 44 45 52 20 42 59 2c 20 73 6f  the ORDER BY, so
11f30 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 61   make.      ** a
11f40 20 63 6f 70 79 2e 20 20 53 75 66 66 69 63 69 65   copy.  Sufficie
11f50 6e 74 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64  nt space to hold
11f60 20 62 6f 74 68 20 74 68 65 20 6e 43 6f 6c 20 65   both the nCol e
11f70 6e 74 72 69 65 73 20 66 6f 72 0a 20 20 20 20 20  ntries for.     
11f80 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   ** the compound
11f90 20 73 65 6c 65 63 74 20 61 6e 64 20 74 68 65 20   select and the 
11fa0 6e 4f 72 64 65 72 62 79 45 78 70 72 20 65 6e 74  nOrderbyExpr ent
11fb0 72 69 65 73 20 66 6f 72 20 74 68 65 20 4f 52 44  ries for the ORD
11fc0 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 77  ER BY.      ** w
11fd0 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f  as allocated abo
11fe0 76 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  ve.  But we need
11ff0 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 63 6f 6d   to move the com
12000 70 6f 75 6e 64 20 73 65 6c 65 63 74 0a 20 20 20  pound select.   
12010 20 20 20 2a 2a 20 65 6e 74 72 69 65 73 20 6f 75     ** entries ou
12020 74 20 6f 66 20 74 68 65 20 77 61 79 20 62 65 66  t of the way bef
12030 6f 72 65 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  ore constructing
12040 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 6e   the ORDER BY en
12050 74 72 69 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  tries..      ** 
12060 4d 6f 76 65 20 74 68 65 20 63 6f 6d 70 6f 75 6e  Move the compoun
12070 64 20 73 65 6c 65 63 74 20 65 6e 74 72 69 65 73  d select entries
12080 20 69 6e 74 6f 20 61 43 6f 70 79 5b 5d 20 77 68   into aCopy[] wh
12090 65 72 65 20 74 68 65 79 20 63 61 6e 20 62 65 0a  ere they can be.
120a0 20 20 20 20 20 20 2a 2a 20 61 63 63 65 73 73 65        ** accesse
120b0 64 20 61 6e 64 20 72 65 75 73 65 64 20 77 68 65  d and reused whe
120c0 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74  n constructing t
120d0 68 65 20 4f 52 44 45 52 20 42 59 20 65 6e 74 72  he ORDER BY entr
120e0 69 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  ies..      ** Be
120f0 63 61 75 73 65 20 6e 43 6f 6c 20 6d 69 67 68 74  cause nCol might
12100 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
12110 20 6f 72 20 6c 65 73 73 20 74 68 61 6e 20 6e 4f   or less than nO
12120 72 64 65 72 42 79 45 78 70 72 0a 20 20 20 20 20  rderByExpr.     
12130 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 75   ** we have to u
12140 73 65 20 6d 65 6d 6d 6f 76 65 28 29 20 77 68 65  se memmove() whe
12150 6e 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 70 79  n doing the copy
12160 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
12170 20 61 43 6f 70 79 20 3d 20 26 70 4b 65 79 49 6e   aCopy = &pKeyIn
12180 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72  fo->aColl[nOrder
12190 42 79 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70  ByExpr];.      p
121a0 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79  SortOrder = pKey
121b0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
121c0 20 3d 20 28 75 38 2a 29 26 61 43 6f 70 79 5b 6e   = (u8*)&aCopy[n
121d0 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 6d  Col];.      memm
121e0 6f 76 65 28 61 43 6f 70 79 2c 20 70 4b 65 79 49  ove(aCopy, pKeyI
121f0 6e 66 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e 43 6f 6c  nfo->aColl, nCol
12200 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
12210 29 29 3b 0a 0a 20 20 20 20 20 20 61 70 43 6f 6c  ));..      apCol
12220 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
12230 6f 6c 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  oll;.      for(i
12240 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 45 78  =0; i<nOrderByEx
12250 70 72 3b 20 69 2b 2b 2c 20 70 4f 54 65 72 6d 2b  pr; i++, pOTerm+
12260 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 2c 20 70 53 6f  +, apColl++, pSo
12270 72 74 4f 72 64 65 72 2b 2b 29 7b 0a 20 20 20 20  rtOrder++){.    
12280 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
12290 3d 20 70 4f 54 65 72 6d 2d 3e 70 45 78 70 72 3b  = pOTerm->pExpr;
122a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 45  .        if( (pE
122b0 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
122c0 45 78 70 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20  ExpCollate) ){. 
122d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
122e0 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 21 3d 30   pExpr->pColl!=0
122f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 61   );.          *a
12300 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70  pColl = pExpr->p
12310 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  Coll;.        }e
12320 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  lse{.          *
12330 61 70 43 6f 6c 6c 20 3d 20 61 43 6f 70 79 5b 70  apColl = aCopy[p
12340 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a  Expr->iColumn];.
12350 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12360 20 20 2a 70 53 6f 72 74 4f 72 64 65 72 20 3d 20    *pSortOrder = 
12370 70 4f 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65  pOTerm->sortOrde
12380 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
12390 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
123a0 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20  htmost==p );.   
123b0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
123c0 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3e 3d 30  drOpenEphm[2]>=0
123d0 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   );.      addr =
123e0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
123f0 5b 32 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [2];.      sqlit
12400 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
12410 2c 20 61 64 64 72 2c 20 70 2d 3e 70 4f 72 64 65  , addr, p->pOrde
12420 72 42 79 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20  rBy->nExpr+2);. 
12430 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e       pKeyInfo->n
12440 46 69 65 6c 64 20 3d 20 6e 4f 72 64 65 72 42 79  Field = nOrderBy
12450 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
12460 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
12470 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29  v, addr, (char*)
12480 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
12490 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
124a0 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
124b0 30 3b 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74  0;.      generat
124c0 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65  eSortTail(pParse
124d0 2c 20 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73  , p, v, p->pELis
124e0 74 2d 3e 6e 45 78 70 72 2c 20 26 64 65 73 74 29  t->nExpr, &dest)
124f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
12500 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 49 6e  ite3_free(pKeyIn
12510 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f  fo);.  }..multi_
12520 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 72 65  select_end:.  re
12530 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
12540 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12550 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
12560 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
12570 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
12580 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61   Forward Declara
12590 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
125a0 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
125b0 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70  st(sqlite3*, Exp
125c0 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70  rList*, int, Exp
125d0 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20  rList*);.static 
125e0 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
125f0 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63  (sqlite3*, Selec
12600 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  t *, int, ExprLi
12610 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63  st *);../*.** Sc
12620 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  an through the e
12630 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
12640 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20    Replace every 
12650 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20  reference to.** 
12660 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
12670 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20  e number iTable 
12680 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
12690 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a  he iColumn-th.**
126a0 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
126b0 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
126c0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
126d0 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
126e0 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a   unchanged.).**.
126f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12700 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
12710 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64  lattening proced
12720 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79  ure.  A subquery
12730 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74  .** whose result
12740 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20   set is defined 
12750 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72  by pEList appear
12760 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68  s as entry in th
12770 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65  e.** FROM clause
12780 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63   of a SELECT suc
12790 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  h that the VDBE 
127a0 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20  cursor assigned 
127b0 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20  to that.** FORM 
127c0 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20  clause entry is 
127d0 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f  iTable.  This ro
127e0 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e  utine make the n
127f0 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61  ecessary .** cha
12800 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f  nges to pExpr so
12810 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20   that it refers 
12820 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
12830 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20  source table.** 
12840 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
12850 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c  rather the resul
12860 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62  t set of the sub
12870 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
12880 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 28   void substExpr(
12890 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
128a0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
128b0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74   malloc errors t
128c0 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  o this connectio
128d0 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
128e0 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78  pr,        /* Ex
128f0 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73  pr in which subs
12900 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20  titution occurs 
12910 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
12920 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
12930 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  e to be substitu
12940 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
12950 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
12960 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65  Substitute expre
12970 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69  ssions */.){.  i
12980 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
12990 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
129a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
129b0 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
129c0 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  e==iTable ){.   
129d0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
129e0 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  umn<0 ){.      p
129f0 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
12a00 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
12a10 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
12a20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12a30 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
12a40 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73  r->iColumn<pELis
12a50 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
12a60 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
12a70 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
12a80 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26  pr->pRight==0 &&
12a90 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
12aa0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   );.      pNew =
12ab0 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72   pEList->a[pExpr
12ac0 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
12ad0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12ae0 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20  pNew!=0 );.     
12af0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65   pExpr->op = pNe
12b00 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73  w->op;.      ass
12b10 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
12b20 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  t==0 );.      pE
12b30 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  xpr->pLeft = sql
12b40 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
12b50 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pNew->pLeft);.  
12b60 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
12b70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
12b80 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69        pExpr->pRi
12b90 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
12ba0 72 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70  rDup(db, pNew->p
12bb0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73  Right);.      as
12bc0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69  sert( pExpr->pLi
12bd0 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  st==0 );.      p
12be0 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71  Expr->pList = sq
12bf0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
12c00 28 64 62 2c 20 70 4e 65 77 2d 3e 70 4c 69 73 74  (db, pNew->pList
12c10 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
12c20 69 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69  iTable = pNew->i
12c30 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 78  Table;.      pEx
12c40 70 72 2d 3e 70 54 61 62 20 3d 20 70 4e 65 77 2d  pr->pTab = pNew-
12c50 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 70 45 78  >pTab;.      pEx
12c60 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e  pr->iColumn = pN
12c70 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ew->iColumn;.   
12c80 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
12c90 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20   pNew->iAgg;.   
12ca0 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43     sqlite3TokenC
12cb0 6f 70 79 28 64 62 2c 20 26 70 45 78 70 72 2d 3e  opy(db, &pExpr->
12cc0 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f  token, &pNew->to
12cd0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ken);.      sqli
12ce0 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c  te3TokenCopy(db,
12cf0 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26   &pExpr->span, &
12d00 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  pNew->span);.   
12d10 20 20 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63     pExpr->pSelec
12d20 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
12d30 74 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70  tDup(db, pNew->p
12d40 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 70  Select);.      p
12d50 45 78 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e  Expr->flags = pN
12d60 65 77 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ew->flags;.    }
12d70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75  .  }else{.    su
12d80 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70  bstExpr(db, pExp
12d90 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  r->pLeft, iTable
12da0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
12db0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78  ubstExpr(db, pEx
12dc0 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  pr->pRight, iTab
12dd0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
12de0 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
12df0 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c   pExpr->pSelect,
12e00 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
12e10 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  ;.    substExprL
12e20 69 73 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  ist(db, pExpr->p
12e30 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
12e40 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
12e50 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
12e60 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65  prList(.  sqlite
12e70 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
12e80 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
12e90 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20  errors here */. 
12ea0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
12eb0 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f  ,     /* List to
12ec0 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
12ed0 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
12ee0 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20  itutes */.  int 
12ef0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
12f00 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
12f10 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
12f20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
12f30 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
12f40 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
12f50 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
12f60 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
12f70 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
12f80 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
12f90 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  +){.    substExp
12fa0 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  r(db, pList->a[i
12fb0 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c  ].pExpr, iTable,
12fc0 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
12fd0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
12fe0 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74  tSelect(.  sqlit
12ff0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
13000 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
13010 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a   errors here */.
13020 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
13030 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
13040 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68   statement in wh
13050 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
13060 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  titutions */.  i
13070 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
13080 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
13090 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20  be replaced */. 
130a0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
130b0 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
130c0 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
130d0 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
130e0 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  rn;.  substExprL
130f0 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ist(db, p->pELis
13100 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
13110 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
13120 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75  ist(db, p->pGrou
13130 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  pBy, iTable, pEL
13140 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
13150 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72  rList(db, p->pOr
13160 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  derBy, iTable, p
13170 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
13180 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  xpr(db, p->pHavi
13190 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ng, iTable, pELi
131a0 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
131b0 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  (db, p->pWhere, 
131c0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
131d0 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64  .  substSelect(d
131e0 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54  b, p->pPrior, iT
131f0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  able, pEList);.}
13200 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
13210 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13220 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  VIEW) */..#ifnde
13230 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
13240 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  EW./*.** This ro
13250 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
13260 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65  o flatten subque
13270 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  ries in order to
13280 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74   speed.** execut
13290 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ion.  It returns
132a0 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63   1 if it makes c
132b0 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20  hanges and 0 if 
132c0 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a  no flattening.**
132d0 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
132e0 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  o understand the
132f0 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74   concept of flat
13300 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72  tening, consider
13310 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
13320 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  * query:.**.**  
13330 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
13340 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20   (SELECT x+y AS 
13350 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
13360 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35  z<100) WHERE a>5
13370 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
13380 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d  lt way of implem
13390 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72  enting this quer
133a0 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  y is to execute 
133b0 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  the.** subquery 
133c0 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20  first and store 
133d0 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
133e0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
133f0 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68  , then.** run th
13400 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e  e outer query on
13410 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
13420 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71  table.  This req
13430 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73  uires two.** pas
13440 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74  ses over the dat
13450 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  a.  Furthermore,
13460 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d   because the tem
13470 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20  porary table.** 
13480 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20  has no indices, 
13490 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
134a0 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   on the outer qu
134b0 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ery cannot be.**
134c0 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a   optimized..**.*
134d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
134e0 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69  ttempts to rewri
134f0 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20  te queries such 
13500 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74  as the above int
13510 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c  o.** a single fl
13520 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20  at select, like 
13530 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
13540 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
13550 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
13560 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a  100 AND a>5.**.*
13570 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
13580 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69  ated for this si
13590 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  mpification give
135a0 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
135b0 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
135c0 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
135d0 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
135e0 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
135f0 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
13600 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
13610 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
13620 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
13630 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
13640 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
13650 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
13660 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
13670 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
13680 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  rue:.**.**   (1)
13690 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
136a0 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
136b0 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
136c0 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  se aggregates..*
136d0 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20  *.**   (2)  The 
136e0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
136f0 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
13700 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
13710 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
13720 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20  *.**   (3)  The 
13730 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
13740 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
13750 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65  d of a left oute
13760 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20  r join, or.**   
13770 20 20 20 20 20 74 68 65 20 73 75 62 71 75 65 72       the subquer
13780 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  y is not itself 
13790 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74  a join.  (Ticket
137a0 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28   #306).**.**   (
137b0 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
137c0 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
137d0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
137e0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
137f0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20  n..**.**   (5)  
13800 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
13810 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
13820 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
13830 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
13840 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65         aggregate
13850 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20  s..**.**   (6)  
13860 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
13870 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
13880 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
13890 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
138a0 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
138b0 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20  T..**.**   (7)  
138c0 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  The subquery has
138d0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a   a FROM clause..
138e0 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65  **.**   (8)  The
138f0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
13900 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
13910 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
13920 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
13930 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20  *.**   (9)  The 
13940 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
13950 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
13960 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
13970 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  oes not use.**  
13980 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73        aggregates
13990 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54  ..**.**  (10)  T
139a0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
139b0 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
139c0 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
139d0 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a   query does not.
139e0 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49  **        use LI
139f0 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29  MIT..**.**  (11)
13a00 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
13a10 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
13a20 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68  ry do not both h
13a30 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  ave ORDER BY cla
13a40 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32  uses..**.**  (12
13a50 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
13a60 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
13a70 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
13a80 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68  OUTER JOIN or th
13a90 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71  e.**        subq
13aa0 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
13ab0 45 20 63 6c 61 75 73 65 2e 20 20 28 61 64 64 65  E clause.  (adde
13ac0 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 30  d by ticket #350
13ad0 29 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54  ).**.**  (13)  T
13ae0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
13af0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
13b00 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
13b10 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54  T.**.**  (14)  T
13b20 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
13b30 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 0a   not use OFFSET.
13b40 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65  **.**  (15)  The
13b50 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
13b60 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f  not part of a co
13b70 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72  mpound select or
13b80 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
13b90 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
13ba0 20 68 61 76 65 20 62 6f 74 68 20 61 6e 20 4f 52   have both an OR
13bb0 44 45 52 20 42 59 20 61 6e 64 20 61 20 4c 49 4d  DER BY and a LIM
13bc0 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20  IT clause..**   
13bd0 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74       (See ticket
13be0 20 23 32 33 33 39 29 0a 2a 2a 0a 2a 2a 20 49 6e   #2339).**.** In
13bf0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
13c00 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72  he "p" parameter
13c10 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
13c20 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
13c30 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72  ..** The subquer
13c40 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  y is p->pSrc->a[
13c50 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69  iFrom].  isAgg i
13c60 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75  s true if the ou
13c70 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65  ter query.** use
13c80 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64  s aggregates and
13c90 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69   subqueryIsAgg i
13ca0 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75  s true if the su
13cb0 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
13cc0 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
13cd0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
13ce0 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
13cf0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
13d00 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
13d10 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
13d20 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
13d30 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
13d40 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
13d50 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
13d60 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
13d70 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
13d80 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
13d90 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
13da0 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
13db0 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
13dc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
13dd0 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
13de0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
13df0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
13e00 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
13e10 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
13e20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
13e30 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53  arent or outer S
13e40 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
13e50 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
13e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
13e70 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61  ex in p->pSrc->a
13e80 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  [] of the inner 
13e90 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
13ea0 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20  t isAgg,        
13eb0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75     /* True if ou
13ec0 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20  ter SELECT uses 
13ed0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
13ee0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  ons */.  int sub
13ef0 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a  queryIsAgg    /*
13f00 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62   True if the sub
13f10 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
13f20 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
13f30 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
13f40 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
13f50 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
13f60 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
13f70 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
13f80 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
13f90 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
13fa0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
13fb0 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63  SrcList *pSubSrc
13fc0 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
13fd0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
13fe0 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72  bquery */.  Expr
13ff0 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
14000 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
14010 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  t of the outer q
14020 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50  uery */.  int iP
14030 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  arent;        /*
14040 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
14050 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20  ber of the pSub 
14060 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20  result set temp 
14070 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
14080 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
14090 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
140a0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
140b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
140c0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
140d0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
140e0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
140f0 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f  m *pSubitem;   /
14100 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a  * The subquery *
14110 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  /..  /* Check to
14120 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69   see if flatteni
14130 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
14140 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
14150 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d  t..  */.  if( p=
14160 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
14170 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
14180 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
14190 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
141a0 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
141b0 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20  );.  pSubitem = 
141c0 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b  &pSrc->a[iFrom];
141d0 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
141e0 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
141f0 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
14200 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  ;.  if( isAgg &&
14210 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
14220 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
14230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
14240 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a  striction (1)  *
14250 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  /.  if( subquery
14260 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e  IsAgg && pSrc->n
14270 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
14280 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
14290 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a  striction (2)  *
142a0 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  /.  pSubSrc = pS
142b0 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
142c0 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
142d0 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
142e0 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
142f0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
14300 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
14310 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
14320 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
14330 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77   expresssions, w
14340 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
14350 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
14360 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
14370 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
14380 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
14390 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
143a0 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
143b0 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
143c0 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
143d0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
143e0 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
143f0 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
14400 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
14410 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
14420 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
14430 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
14440 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
14450 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
14460 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
14470 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20  pSub->pOffset ) 
14480 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
14490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144a0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
144b0 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
144c0 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26  p->pRightmost &&
144d0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
144e0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
144f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14530 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20  estriction (15) 
14540 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  */.  }.  if( pSu
14550 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20  bSrc->nSrc==0 ) 
14560 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
14570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14580 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
14590 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  7)  */.  if( (pS
145a0 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c  ub->isDistinct |
145b0 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20  | pSub->pLimit) 
145c0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 53  .         && (pS
145d0 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
145e0 41 67 67 29 20 29 7b 20 20 20 20 20 20 20 20 20  Agg) ){         
145f0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
14600 20 28 34 29 28 35 29 28 38 29 28 39 29 20 2a 2f   (4)(5)(8)(9) */
14610 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
14620 20 20 20 20 20 20 0a 20 20 7d 0a 20 20 69 66 28        .  }.  if(
14630 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26   p->isDistinct &
14640 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
14650 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
14660 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
14670 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 69 66 28  on (6)  */.  if(
14680 20 28 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64   (p->disallowOrd
14690 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4f 72 64 65  erBy || p->pOrde
146a0 72 42 79 29 20 26 26 20 70 53 75 62 2d 3e 70 4f  rBy) && pSub->pO
146b0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72  rderBy ){.     r
146c0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
146d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146f0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
14700 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20  n (11) */.  }.. 
14710 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
14720 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
14730 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
14740 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
14750 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
14760 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
14770 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
14780 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
14790 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
147a0 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
147b0 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
147c0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
147d0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
147e0 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
147f0 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
14800 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
14810 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
14820 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
14830 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
14840 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
14850 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
14860 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
14870 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f  same thing..  */
14880 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
14890 6e 53 72 63 3e 31 20 26 26 20 28 70 53 75 62 69  nSrc>1 && (pSubi
148a0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
148b0 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
148c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
148d0 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  }..  /* Restrict
148e0 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20  ion 12:  If the 
148f0 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
14900 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
14910 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20   a left outer.  
14920 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75  ** join, make su
14930 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
14940 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
14950 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61  use..  ** An exa
14960 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
14970 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  s is not allowed
14980 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
14990 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
149a0 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a  R JOIN (SELECT *
149b0 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74   FROM t2 WHERE t
149c0 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a  2.x>0).  **.  **
149d0 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
149e0 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
149f0 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
14a00 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
14a10 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
14a20 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20   WHERE t2.x>0.  
14a30 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  **.  ** But the 
14a40 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c  t2.x>0 test will
14a50 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20   always fail on 
14a60 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32  a NULL row of t2
14a70 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66  , which.  ** eff
14a80 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74  ectively convert
14a90 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e  s the OUTER JOIN
14aa0 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a   into an INNER J
14ab0 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  OIN..  */.  if( 
14ac0 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74  (pSubitem->joint
14ad0 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
14ae0 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65  =0 && pSub->pWhe
14af0 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  re!=0 ){.    ret
14b00 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
14b10 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
14b20 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
14b30 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  s flattening is 
14b40 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68  permitted for th
14b50 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20  e.  ** iFrom-th 
14b60 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
14b70 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
14b80 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
14b90 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c  /..  /* Move all
14ba0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
14bb0 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
14bc0 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
14bd0 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
14be0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
14bf0 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
14c00 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
14c10 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
14c20 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
14c30 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
14c40 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
14c50 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
14c60 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
14c70 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
14c80 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
14c90 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
14ca0 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
14cb0 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
14cc0 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
14cd0 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
14ce0 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
14cf0 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
14d00 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
14d10 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
14d20 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
14d30 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
14d40 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
14d50 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65  in..  */.  iPare
14d60 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
14d70 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20  Cursor;.  {.    
14d80 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53  int nSubSrc = pS
14d90 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20  ubSrc->nSrc;.   
14da0 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
14db0 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
14dc0 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  pe;..    sqlite3
14dd0 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53 75 62  DeleteTable(pSub
14de0 69 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  item->pTab);.   
14df0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
14e00 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
14e10 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
14e20 66 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a  free(pSubitem->z
14e30 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
14e40 65 33 5f 66 72 65 65 28 70 53 75 62 69 74 65 6d  e3_free(pSubitem
14e50 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70  ->zAlias);.    p
14e60 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20  Subitem->pTab = 
14e70 30 3b 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d  0;.    pSubitem-
14e80 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a  >zDatabase = 0;.
14e90 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e      pSubitem->zN
14ea0 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ame = 0;.    pSu
14eb0 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  bitem->zAlias = 
14ec0 30 3b 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53  0;.    if( nSubS
14ed0 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  rc>1 ){.      in
14ee0 74 20 65 78 74 72 61 20 3d 20 6e 53 75 62 53 72  t extra = nSubSr
14ef0 63 20 2d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  c - 1;.      for
14f00 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b  (i=1; i<nSubSrc;
14f10 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
14f20 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
14f30 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70  ListAppend(db, p
14f40 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Src, 0, 0);.    
14f50 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20      if( pSrc==0 
14f60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
14f70 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  pSrc = 0;.      
14f80 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
14f90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14fa0 20 20 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20        p->pSrc = 
14fb0 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28  pSrc;.      for(
14fc0 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i=pSrc->nSrc-1; 
14fd0 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20  i-extra>=iFrom; 
14fe0 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 53  i--){.        pS
14ff0 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d  rc->a[i] = pSrc-
15000 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20  >a[i-extra];.   
15010 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
15020 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
15030 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  c; i++){.      p
15040 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
15050 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
15060 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
15070 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c  SubSrc->a[i], 0,
15080 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d   sizeof(pSubSrc-
15090 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  >a[i]));.    }. 
150a0 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d     pSrc->a[iFrom
150b0 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  ].jointype = joi
150c0 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ntype;.  }..  /*
150d0 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
150e0 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
150f0 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
15100 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a  essions for .  *
15110 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
15120 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74  the iParent in t
15130 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
15140 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70    ** .  ** Examp
15150 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
15160 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30  SELECT a+5, b*10
15170 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a   FROM (SELECT x*
15180 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20  3 AS a, y+10 AS 
15190 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  b FROM t1) WHERE
151a0 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20   a>b;.  **   \  
151b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151c0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
151d0 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
151e0 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
151f0 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f  /.  **    \_____
15200 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15210 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
15220 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15230 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a  ___________/.  *
15240 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61  *.  ** We look a
15250 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  t every expressi
15260 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  on in the outer 
15270 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20  query and every 
15280 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 2a  place we see.  *
15290 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
152a0 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
152b0 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
152c0 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
152d0 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a  te "y+10"..  */.
152e0 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c    pList = p->pEL
152f0 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ist;.  for(i=0; 
15300 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
15310 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
15320 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
15330 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
15340 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d 20  ==0 && (pExpr = 
15350 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
15360 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b  r)->span.z!=0 ){
15370 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  .      pList->a[
15380 69 5d 2e 7a 4e 61 6d 65 20 3d 20 0a 20 20 20 20  i].zName = .    
15390 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
153a0 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
153b0 68 61 72 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e  har*)pExpr->span
153c0 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e  .z, pExpr->span.
153d0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
153e0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
153f0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61  , p->pEList, iPa
15400 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
15410 73 74 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67  st);.  if( isAgg
15420 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70   ){.    substExp
15430 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72  rList(db, p->pGr
15440 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  oupBy, iParent, 
15450 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
15460 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
15470 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61   p->pHaving, iPa
15480 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
15490 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  st);.  }.  if( p
154a0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
154b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
154c0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
154d0 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
154e0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b   pSub->pOrderBy;
154f0 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65  .    pSub->pOrde
15500 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rBy = 0;.  }else
15510 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
15520 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70   ){.    substExp
15530 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72  rList(db, p->pOr
15540 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  derBy, iParent, 
15550 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
15560 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70   }.  if( pSub->p
15570 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57 68  Where ){.    pWh
15580 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
15590 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
155a0 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  Where);.  }else{
155b0 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b  .    pWhere = 0;
155c0 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71 75  .  }.  if( subqu
155d0 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
155e0 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76 69  assert( p->pHavi
155f0 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  ng==0 );.    p->
15600 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68  pHaving = p->pWh
15610 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  ere;.    p->pWhe
15620 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
15630 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
15640 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
15650 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
15660 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  );.    p->pHavin
15670 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  g = sqlite3ExprA
15680 6e 64 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  nd(db, p->pHavin
15690 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
156a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
156c0 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61  up(db, pSub->pHa
156d0 76 69 6e 67 29 29 3b 0a 20 20 20 20 61 73 73 65  ving));.    asse
156e0 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  rt( p->pGroupBy=
156f0 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72  =0 );.    p->pGr
15700 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
15710 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
15720 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  Sub->pGroupBy);.
15730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62    }else{.    sub
15740 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57  stExpr(db, p->pW
15750 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70  here, iParent, p
15760 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
15770 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71    p->pWhere = sq
15780 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
15790 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65   p->pWhere, pWhe
157a0 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  re);.  }..  /* T
157b0 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
157c0 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69  ry is distinct i
157d0 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e  f either the inn
157e0 65 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f  er or the.  ** o
157f0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
15800 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20  stinct. .  */.  
15810 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  p->isDistinct = 
15820 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c  p->isDistinct ||
15830 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63   pSub->isDistinc
15840 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45  t;..  /*.  ** SE
15850 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53  LECT ... FROM (S
15860 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20  ELECT ... LIMIT 
15870 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49  a OFFSET b) LIMI
15880 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20  T x OFFSET y;.  
15890 2a 2a 0a 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74  **.  ** One is t
158a0 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f  empted to try to
158b0 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20   add a and b to 
158c0 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69  combine the limi
158d0 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20  ts.  But this.  
158e0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ** does not work
158f0 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74   if either limit
15900 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20   is negative..  
15910 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
15920 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
15930 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
15940 4c 69 6d 69 74 3b 0a 20 20 20 20 70 53 75 62 2d  Limit;.    pSub-
15950 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d  >pLimit = 0;.  }
15960 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c  ..  /* Finially,
15970 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20   delete what is 
15980 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71  left of the subq
15990 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a  uery and return.
159a0 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20    ** success..  
159b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  */.  sqlite3Sele
159c0 63 74 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a  ctDelete(pSub);.
159d0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
159e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
159f0 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a  MIT_VIEW */../*.
15a00 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53  ** Analyze the S
15a10 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
15a20 70 61 73 73 65 64 20 69 6e 20 61 73 20 61 6e 20  passed in as an 
15a30 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20  argument to see 
15a40 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 73 69  if it.** is a si
15a50 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mple min() or ma
15a60 78 28 29 20 71 75 65 72 79 2e 20 20 49 66 20 69  x() query.  If i
15a70 74 20 69 73 20 61 6e 64 20 74 68 69 73 20 71 75  t is and this qu
15a80 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61  ery can be.** sa
15a90 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 61 20  tisfied using a 
15aa0 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20 74  single seek to t
15ab0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20  he beginning or 
15ac0 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c  end of an index,
15ad0 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72 61 74  .** then generat
15ae0 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74  e the code for t
15af0 68 69 73 20 53 45 4c 45 43 54 20 61 6e 64 20 72  his SELECT and r
15b00 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74 68 69  eturn 1.  If thi
15b10 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73  s is not a .** s
15b20 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d  imple min() or m
15b30 61 78 28 29 20 71 75 65 72 79 2c 20 74 68 65 6e  ax() query, then
15b40 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a   return 0;.**.**
15b50 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20   A simply min() 
15b60 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 20 6c  or max() query l
15b70 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ooks like this:.
15b80 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
15b90 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61 62 6c  min(a) FROM tabl
15ba0 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  e;.**    SELECT 
15bb0 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61 62 6c  max(a) FROM tabl
15bc0 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65  e;.**.** The que
15bd0 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79  ry may have only
15be0 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
15bf0 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72 67 75  in its FROM argu
15c00 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ment.  There.** 
15c10 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50 20  can be no GROUP 
15c20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f 72 20  BY or HAVING or 
15c30 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 20  WHERE clauses.  
15c40 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d  The result set m
15c50 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69  ust.** be the mi
15c60 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f 66 20  n() or max() of 
15c70 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
15c80 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  of the table.  T
15c90 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20  he column.** in 
15ca0 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
15cb0 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
15cc0 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a   be indexed..**.
15cd0 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  ** The parameter
15ce0 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  s to this routin
15cf0 65 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  e are the same a
15d00 73 20 66 6f 72 20 73 71 6c 69 74 65 33 53 65 6c  s for sqlite3Sel
15d10 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68  ect()..** See th
15d20 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
15d30 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65   on that routine
15d40 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
15d50 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
15d60 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d 70 6c  static int simpl
15d70 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72  eMinMaxQuery(Par
15d80 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
15d90 63 74 20 2a 70 2c 20 53 65 6c 65 63 74 44 65 73  ct *p, SelectDes
15da0 74 20 2a 70 44 65 73 74 29 7b 0a 20 20 45 78 70  t *pDest){.  Exp
15db0 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74 20  r *pExpr;.  int 
15dc0 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iCol;.  Table *p
15dd0 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
15de0 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a  dx;.  int base;.
15df0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
15e00 20 73 65 65 6b 4f 70 3b 0a 20 20 45 78 70 72 4c   seekOp;.  ExprL
15e10 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 2a 70 4c  ist *pEList, *pL
15e20 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20 20 73 74  ist, eList;.  st
15e30 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
15e40 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20  em eListItem;.  
15e50 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
15e60 20 69 6e 74 20 62 72 6b 3b 0a 20 20 69 6e 74 20   int brk;.  int 
15e70 69 44 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  iDb;..  /* Check
15e80 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
15e90 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c  query is a simpl
15ea0 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
15eb0 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a   query.  Return.
15ec0 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20    ** zero if it 
15ed0 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  is  not..  */.  
15ee0 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
15ef0 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c  || p->pHaving ||
15f00 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
15f10 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
15f20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70  p->pSrc;.  if( p
15f30 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
15f40 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73  eturn 0;.  pELis
15f50 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
15f60 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
15f70 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
15f80 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69  ;.  pExpr = pELi
15f90 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
15fa0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
15fb0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
15fc0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
15fd0 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
15fe0 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  ist;.  if( pList
15ff0 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45  ==0 || pList->nE
16000 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
16010 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
16020 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74  token.n!=3 ) ret
16030 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  urn 0;.  if( sql
16040 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
16050 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
16060 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29  .z,"min",3)==0 )
16070 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f  {.    seekOp = O
16080 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73  P_Rewind;.  }els
16090 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
160a0 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78  NICmp((char*)pEx
160b0 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78  pr->token.z,"max
160c0 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ",3)==0 ){.    s
160d0 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b  eekOp = OP_Last;
160e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
160f0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45  turn 0;.  }.  pE
16100 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30  xpr = pList->a[0
16110 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
16120 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
16130 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
16140 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e    iCol = pExpr->
16150 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20  iColumn;.  pTab 
16160 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  = pSrc->a[0].pTa
16170 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6f 70  b;..  /* This op
16180 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f  timization canno
16190 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 76  t be used with v
161a0 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 2a  irtual tables. *
161b0 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
161c0 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
161d0 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   0;..  /* If we 
161e0 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20  get to here, it 
161f0 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79 20  means the query 
16200 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63  is of the correc
16210 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65  t form..  ** Che
16220 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
16230 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78  we have an index
16240 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70   and make pIdx p
16250 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  oint to the.  **
16260 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
16270 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28  ex.  If the min(
16280 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
16290 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
162a0 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c  ARY.  ** key col
162b0 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73  umn, no index is
162c0 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73 65   necessary so se
162d0 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20  t pIdx to NULL. 
162e0 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62   If no.  ** usab
162f0 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e  le index is foun
16300 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  d, return 0..  *
16310 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29  /.  if( iCol<0 )
16320 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a  {.    pIdx = 0;.
16330 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f 6c    }else{.    Col
16340 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
16350 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
16360 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
16370 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d  .    if( pColl==
16380 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
16390 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
163a0 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
163b0 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
163c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
163d0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31  pIdx->nColumn>=1
163e0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
163f0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
16400 3d 69 43 6f 6c 20 26 26 20 0a 20 20 20 20 20 20  =iCol && .      
16410 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74      0==sqlite3St
16420 72 49 43 6d 70 28 70 49 64 78 2d 3e 61 7a 43 6f  rICmp(pIdx->azCo
16430 6c 6c 5b 30 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  ll[0], pColl->zN
16440 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
16450 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
16460 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64     }.    if( pId
16470 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  x==0 ) return 0;
16480 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  .  }..  /* Ident
16490 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73  ify column types
164a0 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75   if we will be u
164b0 73 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63  sing the callbac
164c0 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74  k.  This.  ** st
164d0 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ep is skipped if
164e0 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67   the output is g
164f0 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20  oing to a table 
16500 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  or a memory cell
16510 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ..  ** The colum
16520 6e 20 6e 61 6d 65 73 20 68 61 76 65 20 61 6c 72  n names have alr
16530 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61  eady been genera
16540 74 65 64 20 69 6e 20 74 68 65 20 63 61 6c 6c 69  ted in the calli
16550 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  ng function..  *
16560 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
16570 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
16580 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
16590 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  urn 0;..  /* If 
165a0 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65  the output is de
165b0 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d  stined for a tem
165c0 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70  porary table, op
165d0 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20  en that table.. 
165e0 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
165f0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  >eDest==SRT_Ephe
16600 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  mTab ){.    sqli
16610 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16620 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
16630 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c  l, pDest->iParm,
16640 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47   1);.  }..  /* G
16650 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74  enerating code t
16660 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f  o find the min o
16670 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61 73 69  r the max.  Basi
16680 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61 76  cally all we hav
16690 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
166a0 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 6f  find the first o
166b0 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  r the last entry
166c0 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e 20 69   in the chosen i
166d0 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74  ndex.  If.  ** t
166e0 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
166f0 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e 54 45  ) is on the INTE
16700 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
16710 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65 20 66   then find the f
16720 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73  irst.  ** or las
16730 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d  t entry in the m
16740 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ain table..  */.
16750 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
16760 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
16770 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
16780 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72  Schema);.  asser
16790 74 28 20 69 44 62 3e 3d 30 20 7c 7c 20 70 54 61  t( iDb>=0 || pTa
167a0 62 2d 3e 69 73 45 70 68 65 6d 20 29 3b 0a 20 20  b->isEphem );.  
167b0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
167c0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
167d0 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 54  iDb);.  sqlite3T
167e0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
167f0 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
16800 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
16810 29 3b 0a 20 20 62 61 73 65 20 3d 20 70 53 72 63  );.  base = pSrc
16820 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a  ->a[0].iCursor;.
16830 20 20 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56    brk = sqlite3V
16840 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
16850 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
16860 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
16870 20 70 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28 20   p, brk);.  if( 
16880 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
16890 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
168a0 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
168b0 61 72 73 65 2c 20 62 61 73 65 2c 20 69 44 62 2c  arse, base, iDb,
168c0 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
168d0 61 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ad);.  }.  if( p
168e0 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Idx==0 ){.    sq
168f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16900 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c  v, seekOp, base,
16910 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
16920 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
16930 20 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64   the cursor used
16940 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 69 6e 64   to open the ind
16950 65 78 20 68 65 72 65 20 69 73 20 63 6c 6f 73 65  ex here is close
16960 64 0a 20 20 20 20 2a 2a 20 61 73 20 73 6f 6f 6e  d.    ** as soon
16970 20 61 73 20 61 20 73 69 6e 67 6c 65 20 76 61 6c   as a single val
16980 75 65 20 68 61 73 20 62 65 65 6e 20 72 65 61 64  ue has been read
16990 20 66 72 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63 61   from it, alloca
169a0 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 75 73 69  te it.    ** usi
169b0 6e 67 20 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  ng (pParse->nTab
169c0 2b 2b 29 20 74 6f 20 70 72 65 76 65 6e 74 20 74  ++) to prevent t
169d0 68 65 20 63 75 72 73 6f 72 20 69 64 20 66 72 6f  he cursor id fro
169e0 6d 20 62 65 69 6e 67 20 0a 20 20 20 20 2a 2a 20  m being .    ** 
169f0 72 65 75 73 65 64 2e 20 54 68 69 73 20 69 73 20  reused. This is 
16a00 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20 73 74  important for st
16a10 61 74 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  atements of the 
16a20 66 6f 72 6d 20 0a 20 20 20 20 2a 2a 20 22 49 4e  form .    ** "IN
16a30 53 45 52 54 20 49 4e 54 4f 20 78 20 53 45 4c 45  SERT INTO x SELE
16a40 43 54 20 6d 61 78 28 29 20 46 52 4f 4d 20 78 22  CT max() FROM x"
16a50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
16a60 20 69 49 64 78 3b 0a 20 20 20 20 4b 65 79 49 6e   iIdx;.    KeyIn
16a70 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  fo *pKey = sqlit
16a80 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
16a90 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
16aa0 20 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d    iIdx = pParse-
16ab0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 61 73 73  >nTab++;.    ass
16ac0 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65  ert( pIdx->pSche
16ad0 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
16ae0 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
16af0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
16b00 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 2c  _OpenRead, iIdx,
16b10 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62   pIdx->tnum, iDb
16b20 2c 0a 20 20 20 20 20 20 20 20 28 63 68 61 72 2a  ,.        (char*
16b30 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46  )pKey, P4_KEYINF
16b40 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
16b50 69 66 28 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52  if( seekOp==OP_R
16b60 65 77 69 6e 64 20 29 7b 0a 20 20 20 20 20 20 73  ewind ){.      s
16b70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16b80 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
16b90 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
16ba0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16bb0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
16bc0 20 30 29 3b 0a 20 20 20 20 20 20 73 65 65 6b 4f   0);.      seekO
16bd0 70 20 3d 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20  p = OP_MoveGt;. 
16be0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64     }.    if( pId
16bf0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  x->aSortOrder[0]
16c00 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  ==SQLITE_SO_DESC
16c10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 69 63   ){.      /* Tic
16c20 6b 65 74 20 23 32 35 31 34 3a 20 69 6e 76 65 72  ket #2514: inver
16c30 74 20 74 68 65 20 73 65 65 6b 20 6f 70 65 72 61  t the seek opera
16c40 74 6f 72 20 69 66 20 77 65 20 61 72 65 20 75 73  tor if we are us
16c50 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 20 64  ing.      ** a d
16c60 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e  escending index.
16c70 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 65   */.      if( se
16c80 65 6b 4f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 7b  ekOp==OP_Last ){
16c90 0a 20 20 20 20 20 20 20 20 73 65 65 6b 4f 70 20  .        seekOp 
16ca0 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20 20 20  = OP_Rewind;.   
16cb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16cc0 20 20 61 73 73 65 72 74 28 20 73 65 65 6b 4f 70    assert( seekOp
16cd0 3d 3d 4f 50 5f 4d 6f 76 65 47 74 20 29 3b 0a 20  ==OP_MoveGt );. 
16ce0 20 20 20 20 20 20 20 73 65 65 6b 4f 70 20 3d 20         seekOp = 
16cf0 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20 20 20 20 20  OP_MoveLt;.     
16d00 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
16d10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16d20 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64 78 2c 20  , seekOp, iIdx, 
16d30 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
16d40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16d50 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 2c 20  IdxRowid, iIdx, 
16d60 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
16d70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16d80 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29 3b  Close, iIdx, 0);
16d90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16da0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f 76  AddOp2(v, OP_Mov
16db0 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  eGe, base, 0);. 
16dc0 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72   }.  eList.nExpr
16dd0 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 1;.  memset(&
16de0 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69  eListItem, 0, si
16df0 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29  zeof(eListItem))
16e00 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65  ;.  eList.a = &e
16e10 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73  ListItem;.  eLis
16e20 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70  t.a[0].pExpr = p
16e30 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e  Expr;.  selectIn
16e40 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
16e50 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c  p, &eList, 0, 0,
16e60 20 30 2c 20 2d 31 2c 20 70 44 65 73 74 2c 20 62   0, -1, pDest, b
16e70 72 6b 2c 20 62 72 6b 2c 20 30 29 3b 0a 20 20 73  rk, brk, 0);.  s
16e80 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16e90 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a  eLabel(v, brk);.
16ea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16eb0 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
16ec0 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 0a 20 20   base, 0);.  .  
16ed0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
16ee0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16ef0 72 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e 61 6d  resolves any nam
16f00 65 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 72  es used in the r
16f10 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
16f20 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 53 45 4c  .** supplied SEL
16f30 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 49  ECT statement. I
16f40 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
16f50 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 73  tement being res
16f60 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20 73 75  olved.** is a su
16f70 62 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 70  b-select, then p
16f80 4f 75 74 65 72 4e 43 20 69 73 20 61 20 70 6f 69  OuterNC is a poi
16f90 6e 74 65 72 20 74 6f 20 74 68 65 20 4e 61 6d 65  nter to the Name
16fa0 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66 20 74  Context .** of t
16fb0 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54  he parent SELECT
16fc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16fd0 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 0a 20  SelectResolve(. 
16fe0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
16ff0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
17000 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
17010 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
17020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17030 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
17040 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
17050 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
17060 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 54 68  *pOuterNC  /* Th
17070 65 20 6f 75 74 65 72 20 6e 61 6d 65 20 63 6f 6e  e outer name con
17080 74 65 78 74 2e 20 4d 61 79 20 62 65 20 4e 55 4c  text. May be NUL
17090 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  L. */.){.  ExprL
170a0 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
170b0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
170c0 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  set. */.  int i;
170d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170e0 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f 70       /* For-loop
170f0 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20 69   variable used i
17100 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
17110 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  s */.  NameConte
17120 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20  xt sNC;         
17130 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65 2d    /* Local name-
17140 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
17150 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
17160 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67          /* The g
17170 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
17180 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
17190 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20  routine has run 
171a0 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 20 69  before, return i
171b0 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  mmediately. */. 
171c0 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c 76   if( p->isResolv
171d0 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
171e0 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a 20  ( !pOuterNC );. 
171f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17200 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 73  _OK;.  }.  p->is
17210 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a 20  Resolved = 1;.. 
17220 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61 76   /* If there hav
17230 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65  e already been e
17240 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69 6e  rrors, do nothin
17250 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  g. */.  if( pPar
17260 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20  se->nErr>0 ){.  
17270 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17280 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
17290 20 50 72 65 70 61 72 65 20 74 68 65 20 73 65 6c   Prepare the sel
172a0 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ect statement. T
172b0 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c  his call will al
172c0 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  locate all curso
172d0 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  rs.  ** required
172e0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 74   to handle the t
172f0 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71 75 65  ables and subque
17300 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
17310 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
17320 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74  if( prepSelectSt
17330 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  mt(pParse, p) ){
17340 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17350 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
17360 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20   /* Resolve the 
17370 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
17380 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
17390 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 65  SET clauses. The
173a0 73 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20  se.  ** are not 
173b0 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72  allowed to refer
173c0 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73   to any names, s
173d0 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20  o pass an empty 
173e0 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 2a  NameContext..  *
173f0 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  /.  memset(&sNC,
17400 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
17410 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
17420 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 73   pParse;.  if( s
17430 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
17440 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
17450 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20  pLimit) ||.     
17460 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
17470 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
17480 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20  ->pOffset) ){.  
17490 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
174a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
174b0 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61   Set up the loca
174c0 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74  l name-context t
174d0 6f 20 70 61 73 73 20 74 6f 20 45 78 70 72 52 65  o pass to ExprRe
174e0 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 74 6f 0a  solveNames() to.
174f0 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 65    ** resolve the
17500 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
17510 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c  ..  */.  sNC.all
17520 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 73 4e 43  owAgg = 1;.  sNC
17530 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70  .pSrcList = p->p
17540 53 72 63 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74  Src;.  sNC.pNext
17550 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 0a 20 20   = pOuterNC;..  
17560 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  /* Resolve names
17570 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
17580 65 74 2e 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  et. */.  pEList 
17590 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
175a0 66 28 20 21 70 45 4c 69 73 74 20 29 20 72 65 74  f( !pEList ) ret
175b0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
175c0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
175d0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
175e0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58  +){.    Expr *pX
175f0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
17600 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73  pExpr;.    if( s
17610 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
17620 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 58 29  eNames(&sNC, pX)
17630 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17640 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
17650 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
17660 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61  f there are no a
17670 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
17680 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
17690 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f  -set, and no GRO
176a0 55 50 20 42 59 20 0a 20 20 2a 2a 20 65 78 70 72  UP BY .  ** expr
176b0 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61  ession, do not a
176c0 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65 73 20  llow aggregates 
176d0 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6f 74  in any of the ot
176e0 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  her expressions.
176f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
17700 21 70 2d 3e 69 73 41 67 67 20 29 3b 0a 20 20 70  !p->isAgg );.  p
17710 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
17720 6f 75 70 42 79 3b 0a 20 20 69 66 28 20 70 47 72  oupBy;.  if( pGr
17730 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61 73  oupBy || sNC.has
17740 41 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73  Agg ){.    p->is
17750 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Agg = 1;.  }else
17760 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41  {.    sNC.allowA
17770 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  gg = 0;.  }..  /
17780 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c  * If a HAVING cl
17790 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c  ause is present,
177a0 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
177b0 20 62 65 20 61 20 47 52 4f 55 50 20 42 59 20 63   be a GROUP BY c
177c0 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  lause..  */.  if
177d0 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20  ( p->pHaving && 
177e0 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  !pGroupBy ){.   
177f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
17800 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55  (pParse, "a GROU
17810 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 72  P BY clause is r
17820 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 48  equired before H
17830 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 72 65 74  AVING");.    ret
17840 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
17850 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
17860 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
17870 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d  ist to the name-
17880 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20 70  context before p
17890 61 72 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  arsing the.  ** 
178a0 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
178b0 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
178c0 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
178d0 69 73 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20  is so that.  ** 
178e0 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
178f0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
17900 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66 65 72  (etc.) can refer
17910 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20   to expressions 
17920 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65 73 20  by.  ** aliases 
17930 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
17940 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69 6e  t..  **.  ** Min
17950 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74 68 69  or point: If thi
17960 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
17970 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
17980 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  on will be.  ** 
17990 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66 6f 72  re-evaluated for
179a0 20 65 61 63 68 20 72 65 66 65 72 65 6e 63 65 20   each reference 
179b0 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e  to it..  */.  sN
179c0 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45  C.pEList = p->pE
179d0 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71 6c 69  List;.  if( sqli
179e0 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
179f0 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68  mes(&sNC, p->pWh
17a00 65 72 65 29 20 7c 7c 0a 20 20 20 20 20 73 71 6c  ere) ||.     sql
17a10 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
17a20 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 48  ames(&sNC, p->pH
17a30 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 72 65  aving) ){.    re
17a40 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
17a50 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  R;.  }.  if( p->
17a60 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
17a70 20 69 66 28 20 70 72 6f 63 65 73 73 4f 72 64 65   if( processOrde
17a80 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
17a90 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c   p, p->pOrderBy,
17aa0 20 31 2c 20 26 73 4e 43 2e 68 61 73 41 67 67 29   1, &sNC.hasAgg)
17ab0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17ac0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
17ad0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
17ae0 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70  rocessOrderGroup
17af0 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 47  By(pParse, p, pG
17b00 72 6f 75 70 42 79 2c 20 30 2c 20 26 73 4e 43 2e  roupBy, 0, &sNC.
17b10 68 61 73 41 67 67 29 20 29 7b 0a 20 20 20 20 72  hasAgg) ){.    r
17b20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
17b30 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  OR;.  }..  if( p
17b40 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
17b50 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
17b60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
17b70 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  EM;.  }..  /* Ma
17b80 6b 65 20 73 75 72 65 20 74 68 65 20 47 52 4f 55  ke sure the GROU
17b90 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73  P BY clause does
17ba0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 67   not contain agg
17bb0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
17bc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 47 72  ..  */.  if( pGr
17bd0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 74 72  oupBy ){.    str
17be0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
17bf0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 20  m *pItem;.  .   
17c00 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
17c10 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70  pGroupBy->a; i<p
17c20 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
17c30 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
17c40 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
17c50 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d 3e  Property(pItem->
17c60 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20 29  pExpr, EP_Agg) )
17c70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17c80 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
17c90 2c 20 22 61 67 67 72 65 67 61 74 65 20 66 75 6e  , "aggregate fun
17ca0 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61  ctions are not a
17cb0 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20  llowed in ".    
17cc0 20 20 20 20 20 20 20 20 22 74 68 65 20 47 52 4f          "the GRO
17cd0 55 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a  UP BY clause");.
17ce0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
17cf0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
17d00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
17d10 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
17d20 6f 6e 65 20 53 45 4c 45 43 54 20 6f 66 20 61 20  one SELECT of a 
17d30 63 6f 6d 70 6f 75 6e 64 2c 20 62 65 20 73 75 72  compound, be sur
17d40 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 6e 61 6d  e to resolve nam
17d50 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  es.  ** in the o
17d60 74 68 65 72 20 53 45 4c 45 43 54 73 2e 0a 20 20  ther SELECTs..  
17d70 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
17d80 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
17d90 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
17da0 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2d  solve(pParse, p-
17db0 3e 70 50 72 69 6f 72 2c 20 70 4f 75 74 65 72 4e  >pPrior, pOuterN
17dc0 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  C);.  }else{.   
17dd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17de0 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
17df0 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
17e00 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
17e10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
17e20 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
17e30 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
17e40 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
17e50 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
17e60 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
17e70 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
17e80 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
17e90 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d  s.** routine sim
17ea0 70 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  ply stores NULLs
17eb0 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
17ec0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a   memory cells..*
17ed0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
17ee0 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
17ef0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
17f00 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
17f10 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
17f20 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
17f30 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
17f40 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
17f50 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e  nc;.  if( pAggIn
17f60 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e  fo->nFunc+pAggIn
17f70 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29  fo->nColumn==0 )
17f80 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
17f90 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
17fa0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
17fb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
17fc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17fd0 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 30 2c 20   OP_MemNull, 0, 
17fe0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69  pAggInfo->aCol[i
17ff0 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66  ].iMem);.  }.  f
18000 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66  or(pFunc=pAggInf
18010 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69  o->aFunc, i=0; i
18020 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
18030 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b  ; i++, pFunc++){
18040 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18050 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 65 6d  AddOp2(v, OP_Mem
18060 4e 75 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d 3e  Null, 0, pFunc->
18070 69 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  iMem);.    if( p
18080 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e  Func->iDistinct>
18090 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
180a0 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45   *pE = pFunc->pE
180b0 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
180c0 45 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  E->pList==0 || p
180d0 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  E->pList->nExpr!
180e0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
180f0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18100 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
18110 69 6e 20 61 67 67 72 65 67 61 74 65 20 6d 75 73  in aggregate mus
18120 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 22 0a  t be followed ".
18130 20 20 20 20 20 20 20 20 20 20 20 22 62 79 20 61             "by a
18140 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a  n expression");.
18150 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69          pFunc->i
18160 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
18170 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18180 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
18190 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
181a0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
181b0 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a  se, pE->pList);.
181c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
181d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
181e0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
181f0 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c  Func->iDistinct,
18200 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
18210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18220 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
18230 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
18240 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20  DOFF);.      }. 
18250 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
18260 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f  * Invoke the OP_
18270 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f  AggFinalize opco
18280 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67  de for every agg
18290 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a  regate function.
182a0 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66  ** in the AggInf
182b0 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  o structure..*/.
182c0 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61  static void fina
182d0 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
182e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
182f0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
18300 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
18310 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
18320 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
18330 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
18340 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  F;.  for(i=0, pF
18350 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
18360 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
18370 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
18380 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
18390 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
183a0 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c  ->pList;.    sql
183b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
183c0 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70  , OP_AggFinal, p
183d0 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f  F->iMem, pList ?
183e0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
183f0 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
18400 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
18410 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  d*)pF->pFunc, P4
18420 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d  _FUNCDEF);.  }.}
18430 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
18440 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d  he accumulator m
18450 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
18460 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73  an aggregate bas
18470 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72  ed on.** the cur
18480 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
18490 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
184a0 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d  void updateAccum
184b0 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
184c0 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
184d0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
184e0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
184f0 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
18500 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
18510 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63  unc *pF;.  struc
18520 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
18530 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e  C;..  pAggInfo->
18540 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
18550 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
18560 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
18570 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
18580 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
18590 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
185a0 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30  int addrNext = 0
185b0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
185c0 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
185d0 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 66  r->pList;.    if
185e0 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
185f0 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e   nArg = pList->n
18600 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
18610 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
18620 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
18630 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
18640 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20       nArg = 0;. 
18650 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
18660 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
18670 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20  .      addrNext 
18680 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
18690 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
186a0 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
186b0 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69   );.      codeDi
186c0 73 74 69 6e 63 74 5f 4f 4c 44 28 76 2c 20 70 46  stinct_OLD(v, pF
186d0 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64  ->iDistinct, add
186e0 72 4e 65 78 74 2c 20 31 29 3b 0a 20 20 20 20 7d  rNext, 1);.    }
186f0 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75  .    if( pF->pFu
18700 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  nc->needCollSeq 
18710 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
18720 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
18730 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
18740 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
18750 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
18760 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
18770 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74  !=0 );  /* pList
18780 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63  !=0 if pF->pFunc
18790 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 69 73  ->needCollSeq is
187a0 20 74 72 75 65 20 2a 2f 0a 20 20 20 20 20 20 66   true */.      f
187b0 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(j=0, pItem=pL
187c0 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26  ist->a; !pColl &
187d0 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70  & j<nArg; j++, p
187e0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
187f0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
18800 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
18810 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
18820 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18830 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
18840 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
18850 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
18860 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
18870 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18880 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
18890 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  Seq, 0, 0, 0, (c
188a0 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
188b0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a  COLLSEQ);.    }.
188c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
188d0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53  ddOp4(v, OP_AggS
188e0 74 65 70 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 6e  tep, pF->iMem, n
188f0 41 72 67 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  Arg, 0, .       
18900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
18910 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
18920 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
18930 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29    if( addrNext )
18940 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
18950 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
18960 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20  v, addrNext);.  
18970 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
18980 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pC=pAggInfo->
18990 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f  aCol; i<pAggInfo
189a0 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20  ->nAccumulator; 
189b0 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20  i++, pC++){.    
189c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
189d0 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70  pParse, pC->pExp
189e0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
189f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18a00 4d 65 6d 53 74 6f 72 65 2c 20 70 43 2d 3e 69 4d  MemStore, pC->iM
18a10 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 70 41  em, 1);.  }.  pA
18a20 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
18a30 64 65 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64  de = 0;.}..#ifnd
18a40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
18a50 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a 20 54 68 69  RIGGER./*.** Thi
18a60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
18a70 65 64 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54  ed when a SELECT
18a80 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 73   statement is us
18a90 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a 2a  ed to create a.*
18aa0 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
18ab0 65 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20  e for iterating 
18ac0 74 68 72 6f 75 67 68 20 77 68 65 6e 20 72 75 6e  through when run
18ad0 6e 69 6e 67 20 61 6e 20 49 4e 53 54 45 41 44 20  ning an INSTEAD 
18ae0 4f 46 0a 2a 2a 20 55 50 44 41 54 45 20 6f 72 20  OF.** UPDATE or 
18af0 49 4e 53 54 45 41 44 20 4f 46 20 44 45 4c 45 54  INSTEAD OF DELET
18b00 45 20 74 72 69 67 67 65 72 2e 20 0a 2a 2a 0a 2a  E trigger. .**.*
18b10 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  * If possible, t
18b20 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
18b30 65 6e 74 20 69 73 20 6d 6f 64 69 66 69 65 64 20  ent is modified 
18b40 73 6f 20 74 68 61 74 20 4e 55 4c 4c 20 76 61 6c  so that NULL val
18b50 75 65 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  ues.** are store
18b60 64 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  d in the tempora
18b70 72 79 20 74 61 62 6c 65 20 66 6f 72 20 61 6c 6c  ry table for all
18b80 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69   columns for whi
18b90 63 68 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65  ch the .** corre
18ba0 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20  sponding bit in 
18bb0 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73  argument mask is
18bc0 20 6e 6f 74 20 73 65 74 2e 20 49 66 20 6d 61 73   not set. If mas
18bd0 6b 20 74 61 6b 65 73 20 74 68 65 0a 2a 2a 20 73  k takes the.** s
18be0 70 65 63 69 61 6c 20 76 61 6c 75 65 20 30 78 66  pecial value 0xf
18bf0 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 61 6c  fffffff, then al
18c00 6c 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 6f  l columns are po
18c10 70 75 6c 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  pulated..*/.int 
18c20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4d 61 73  sqlite3SelectMas
18c30 6b 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  k(Parse *pParse,
18c40 20 53 65 6c 65 63 74 20 2a 70 2c 20 75 33 32 20   Select *p, u32 
18c50 6d 61 73 6b 29 7b 0a 20 20 69 66 28 20 21 70 2d  mask){.  if( !p-
18c60 3e 70 50 72 69 6f 72 20 26 26 20 21 70 2d 3e 69  >pPrior && !p->i
18c70 73 44 69 73 74 69 6e 63 74 20 26 26 20 6d 61 73  sDistinct && mas
18c80 6b 21 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  k!=0xffffffff ){
18c90 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
18ca0 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69  EList;.    int i
18cb0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
18cc0 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70  3SelectResolve(p
18cd0 50 61 72 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a  Parse, p, 0) ){.
18ce0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18cf0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
18d00 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  .    pEList = p-
18d10 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72  >pEList;.    for
18d20 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
18d30 6e 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69  nExpr && i<32; i
18d40 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
18d50 28 6d 61 73 6b 26 28 28 75 33 32 29 31 3c 3c 69  (mask&((u32)1<<i
18d60 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  )) ){.        sq
18d70 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
18d80 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
18d90 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45 4c  pr);.        pEL
18da0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  ist->a[i].pExpr 
18db0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 70 50  = sqlite3Expr(pP
18dc0 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 4e 55 4c  arse->db, TK_NUL
18dd0 4c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  L, 0, 0, 0);.   
18de0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
18df0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18e00 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
18e10 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
18e20 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
18e30 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
18e40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
18e50 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
18e60 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
18e70 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
18e80 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
18e90 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44 65 73  of the SelectDes
18ea0 74 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  t structure poin
18eb0 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d 65  ted to by argume
18ec0 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20 66  nt pDest.** as f
18ed0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
18ee0 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 20    pDest->eDest  
18ef0 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20    Result.**     
18f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
18f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
18f40 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20     SRT_Callback 
18f50 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61     Invoke the ca
18f60 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20  llback for each 
18f70 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
18f80 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  t..**.**     SRT
18f90 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f  _Mem         Sto
18fa0 72 65 20 66 69 72 73 74 20 72 65 73 75 6c 74 20  re first result 
18fb0 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70  in memory cell p
18fc0 44 65 73 74 2d 3e 69 50 61 72 6d 0a 2a 2a 0a 2a  Dest->iParm.**.*
18fd0 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20 20  *     SRT_Set   
18fe0 20 20 20 20 20 20 53 74 6f 72 65 20 6e 6f 6e 2d        Store non-
18ff0 6e 75 6c 6c 20 72 65 73 75 6c 74 73 20 61 73 20  null results as 
19000 6b 65 79 73 20 6f 66 20 74 61 62 6c 65 20 70 44  keys of table pD
19010 65 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20  est->iParm. .** 
19020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19030 20 20 20 20 41 70 70 6c 79 20 74 68 65 20 61 66      Apply the af
19040 66 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66  finity pDest->af
19050 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20 73 74  finity before st
19060 6f 72 69 6e 67 20 74 68 65 6d 2e 0a 2a 2a 0a 2a  oring them..**.*
19070 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20  *     SRT_Union 
19080 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
19090 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20  lts as a key in 
190a0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
190b0 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a  e pDest->iParm..
190c0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
190d0 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65  cept      Remove
190e0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68   results from th
190f0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
19100 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a  e pDest->iParm..
19110 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61  **.**     SRT_Ta
19120 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20  ble       Store 
19130 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f  results in tempo
19140 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
19150 2d 3e 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  ->iParm.**.**   
19160 20 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 20    SRT_EphemTab  
19170 20 20 43 72 65 61 74 65 20 61 6e 20 74 65 6d 70    Create an temp
19180 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73  orary table pDes
19190 74 2d 3e 69 50 61 72 6d 20 61 6e 64 20 73 74 6f  t->iParm and sto
191a0 72 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  re.**           
191b0 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65            the re
191c0 73 75 6c 74 20 74 68 65 72 65 2e 20 54 68 65 20  sult there. The 
191d0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 6f  cursor is left o
191e0 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20 20 20  pen after.**    
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19200 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
19210 2a 20 20 20 20 20 53 52 54 5f 53 75 62 72 6f 75  *     SRT_Subrou
19220 74 69 6e 65 20 20 46 6f 72 20 65 61 63 68 20 72  tine  For each r
19230 6f 77 20 72 65 74 75 72 6e 65 64 2c 20 70 75 73  ow returned, pus
19240 68 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 6e  h the results on
19250 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
19260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 64                vd
19270 62 65 20 73 74 61 63 6b 20 61 6e 64 20 63 61 6c  be stack and cal
19280 6c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  l the subroutine
19290 20 28 76 69 61 20 4f 50 5f 47 6f 73 75 62 29 0a   (via OP_Gosub).
192a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
192b0 20 20 20 20 20 20 20 61 74 20 61 64 64 72 65 73         at addres
192c0 73 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a  s pDest->iParm..
192d0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
192e0 69 73 74 73 20 20 20 20 20 20 53 74 6f 72 65 20  ists      Store 
192f0 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  a 1 in memory ce
19300 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20  ll pDest->iParm 
19310 69 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  if the result.**
19320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19330 20 20 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20       set is not 
19340 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  empty..**.**    
19350 20 53 52 54 5f 44 69 73 63 61 72 64 20 20 20 20   SRT_Discard    
19360 20 54 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c   Throw the resul
19370 74 73 20 61 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53  ts away..**.** S
19380 65 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e  ee the selectInn
19390 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f  erLoop() functio
193a0 6e 20 66 6f 72 20 61 20 63 61 6e 6f 6e 69 63 61  n for a canonica
193b0 6c 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65  l listing of the
193c0 20 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 76 61 6c   .** allowed val
193d0 75 65 73 20 6f 66 20 65 44 65 73 74 20 61 6e 64  ues of eDest and
193e0 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e   their meanings.
193f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
19400 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
19410 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
19420 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73  .  If any errors
19430 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65   are.** encounte
19440 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70  red, then an app
19450 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d  ropriate error m
19460 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
19470 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72  n.** pParse->zEr
19480 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rMsg..**.** This
19490 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f   routine does NO
194a0 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63  T free the Selec
194b0 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
194c0 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63  ed in.  The.** c
194d0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
194e0 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74  needs to do that
194f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72  ..**.** The pPar
19500 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20  ent, parentTab, 
19510 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67 67 20  and *pParentAgg 
19520 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65  fields are fille
19530 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  d in if this.** 
19540 53 45 4c 45 43 54 20 69 73 20 61 20 73 75 62 71  SELECT is a subq
19550 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74  uery.  This rout
19560 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f 20 63  ine may try to c
19570 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45 4c 45  ombine this SELE
19580 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 70  CT.** with its p
19590 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20  arent to form a 
195a0 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75 65 72  single flat quer
195b0 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c  y.  In so doing,
195c0 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61   it might.** cha
195d0 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74 20 71  nge the parent q
195e0 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d  uery from a non-
195f0 61 67 67 72 65 67 61 74 65 20 74 6f 20 61 6e 20  aggregate to an 
19600 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
19610 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61  .** For that rea
19620 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65 6e 74  son, the pParent
19630 41 67 67 20 66 6c 61 67 20 69 73 20 70 61 73 73  Agg flag is pass
19640 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2c  ed as a pointer,
19650 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65   so it.** can be
19660 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20   changed..**.** 
19670 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54 68 65  Example 1:   The
19680 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
19690 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65  pParent paramete
196a0 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  r..**.**    SELE
196b0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49  CT * FROM t1 JOI
196c0 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63 6f 75  N (SELECT x, cou
196d0 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a  nt(*) FROM t2) J
196e0 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20  OIN t3;.**    \ 
196f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19700 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75       \_______ su
19710 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20  bquery _______/ 
19720 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20         /.**     
19730 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
19740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19760 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20         /.**     
19770 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
19780 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
19790 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
197a0 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68  ______/.**.** Th
197b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
197c0 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f 75 74  lled for the out
197d0 65 72 20 71 75 65 72 79 20 66 69 72 73 74 2e 20  er query first. 
197e0 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c    For that call,
197f0 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69 6c 6c  .** pParent will
19800 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e   be NULL.  Durin
19810 67 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  g the processing
19820 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
19830 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f  ery, this .** ro
19840 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
19850 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20 68  recursively to h
19860 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71 75 65  andle the subque
19870 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72 65 63  ry.  For the rec
19880 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20  ursive.** call, 
19890 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69  pParent will poi
198a0 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  nt to the outer 
198b0 71 75 65 72 79 2e 20 20 42 65 63 61 75 73 65 20  query.  Because 
198c0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a  the subquery is.
198d0 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c  ** the second el
198e0 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72 65 65  ement in a three
198f0 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70  -way join, the p
19900 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d 65 74  arentTab paramet
19910 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20  er will.** be 1 
19920 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65 20 6f  (the 2nd value o
19930 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20 61 72  f a 0-indexed ar
19940 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ray.).*/.int sql
19950 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61  ite3Select(.  Pa
19960 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
19970 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
19980 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
19990 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
199a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
199b0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
199c0 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
199d0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
199e0 73 74 2c 20 20 20 20 20 2f 2a 20 57 68 61 74 20  st,     /* What 
199f0 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71  to do with the q
19a00 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
19a10 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
19a20 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  t,       /* Anot
19a30 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77  her SELECT for w
19a40 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73  hich this is a s
19a50 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ub-query */.  in
19a60 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20  t parentTab,    
19a70 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
19a80 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f   pParent->pSrc o
19a90 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  f this query */.
19aa0 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67    int *pParentAg
19ab0 67 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  g,       /* True
19ac0 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73   if pParent uses
19ad0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
19ae0 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ions */.  char *
19af0 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  aff             
19b00 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20   /* If eDest is 
19b10 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61  SRT_Union, the a
19b20 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
19b30 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
19b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19b50 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
19b60 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
19b70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
19b80 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
19b90 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
19ba0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
19bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19bc0 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
19bd0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
19be0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
19bf0 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
19c00 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
19c10 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
19c20 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
19c30 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
19c40 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
19c50 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
19c60 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
19c70 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
19c80 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
19c90 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
19ca0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
19cb0 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
19cc0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
19cd0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
19ce0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
19cf0 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68  rderBy;    /* Th
19d00 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
19d10 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
19d20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
19d30 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
19d40 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
19d50 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
19d60 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
19d70 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
19d80 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
19d90 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
19da0 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69  */.  int isDisti
19db0 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nct;        /* T
19dc0 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
19dd0 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
19de0 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
19df0 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  distinct;       
19e00 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75     /* Table to u
19e10 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
19e20 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  nct set */.  int
19e30 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20   rc = 1;        
19e40 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
19e50 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73  return from this
19e60 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
19e70 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  nt addrSortIndex
19e80 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
19e90 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70   of an OP_OpenEp
19ea0 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
19eb0 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f  ion */.  AggInfo
19ec0 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20   sAggInfo;      
19ed0 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  /* Information u
19ee0 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65  sed by aggregate
19ef0 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e   queries */.  in
19f00 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t iEnd;         
19f10 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
19f20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  of the end of th
19f30 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
19f40 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
19f50 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
19f60 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
19f70 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  /..  db = pParse
19f80 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ->db;.  if( p==0
19f90 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
19fa0 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
19fb0 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75  nErr ){.    retu
19fc0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
19fd0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
19fe0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
19ff0 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
1a000 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
1a010 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c  emset(&sAggInfo,
1a020 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49   0, sizeof(sAggI
1a030 6e 66 6f 29 29 3b 0a 0a 20 20 70 4f 72 64 65 72  nfo));..  pOrder
1a040 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
1a050 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ;.  if( Ignorabl
1a060 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
1a070 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  ){.    p->pOrder
1a080 42 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  By = 0;..    /* 
1a090 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 74  In these cases t
1a0a0 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70 65 72  he DISTINCT oper
1a0b0 61 74 6f 72 20 6d 61 6b 65 73 20 6e 6f 20 64 69  ator makes no di
1a0c0 66 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  fference to the.
1a0d0 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 2c 20      ** results, 
1a0e0 73 6f 20 72 65 6d 6f 76 65 20 69 74 20 69 66 20  so remove it if 
1a0f0 69 74 20 77 65 72 65 20 73 70 65 63 69 66 69 65  it were specifie
1a100 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  d..    */.    as
1a110 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73  sert(pDest->eDes
1a120 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c  t==SRT_Exists ||
1a130 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1a140 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20  RT_Union || .   
1a150 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
1a160 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74  Dest==SRT_Except
1a170 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
1a180 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 29 3b 0a  ==SRT_Discard);.
1a190 20 20 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63      p->isDistinc
1a1a0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
1a1b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
1a1c0 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2c  solve(pParse, p,
1a1d0 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   0) ){.    goto 
1a1e0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
1a1f0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1a200 70 4f 72 64 65 72 42 79 3b 0a 0a 23 69 66 6e 64  pOrderBy;..#ifnd
1a210 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
1a220 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
1a230 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
1a240 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f  are a sequence o
1a250 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68  f queries, do th
1a260 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66  e earlier ones f
1a270 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  irst..  */.  if(
1a280 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
1a290 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d    if( p->pRightm
1a2a0 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ost==0 ){.      
1a2b0 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a  Select *pLoop, *
1a2c0 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20  pRight = 0;.    
1a2d0 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
1a2e0 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70       for(pLoop=p
1a2f0 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
1a300 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e  Loop->pPrior, cn
1a310 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t++){.        pL
1a320 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  oop->pRightmost 
1a330 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  = p;.        pLo
1a340 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69 67  op->pNext = pRig
1a350 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69 67  ht;.        pRig
1a360 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20  ht = pLoop;.    
1a370 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 53 51    }.      if( SQ
1a380 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
1a390 44 5f 53 45 4c 45 43 54 3e 30 20 26 26 20 63 6e  D_SELECT>0 && cn
1a3a0 74 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  t>SQLITE_MAX_COM
1a3b0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 29 7b 0a  POUND_SELECT ){.
1a3c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a3d0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1a3e0 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20  "too many terms 
1a3f0 69 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  in compound SELE
1a400 43 54 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  CT");.        re
1a410 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
1a420 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1a430 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61   multiSelect(pPa
1a440 72 73 65 2c 20 70 2c 20 70 44 65 73 74 2c 20 61  rse, p, pDest, a
1a450 66 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ff);.  }.#endif.
1a460 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c  .  /* Make local
1a470 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
1a480 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68  arameters for th
1a490 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  is query..  */. 
1a4a0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
1a4b0 53 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20  Src;.  pWhere = 
1a4c0 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
1a4d0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
1a4e0 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
1a4f0 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69   p->pHaving;.  i
1a500 73 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b  sAgg = p->isAgg;
1a510 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20  .  isDistinct = 
1a520 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20  p->isDistinct;. 
1a530 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
1a540 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ist;.  if( pELis
1a550 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  t==0 ) goto sele
1a560 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20  ct_end;..  /* . 
1a570 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20   ** Do not even 
1a580 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72  attempt to gener
1a590 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20  ate any code if 
1a5a0 77 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  we have already 
1a5b0 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73  seen.  ** errors
1a5c0 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
1a5d0 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a  tine starts..  *
1a5e0 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
1a5f0 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65  nErr>0 ) goto se
1a600 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
1a610 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65  If writing to me
1a620 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69  mory or generati
1a630 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e  ng a set.  ** on
1a640 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  ly a single colu
1a650 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74  mn may be output
1a660 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
1a670 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1a680 45 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46  ERY.  if( checkF
1a690 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c  orMultiColumnSel
1a6a0 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
1a6b0 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e   pDest, pEList->
1a6c0 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f  nExpr) ){.    go
1a6d0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
1a6e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1a6f0 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f  ORDER BY is igno
1a700 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73  red for some des
1a710 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  tinations..  */.
1a720 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f    if( IgnorableO
1a730 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
1a740 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20  .    pOrderBy = 
1a750 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  0;.  }..  /* Beg
1a760 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  in generating co
1a770 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  de..  */.  v = s
1a780 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1a790 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
1a7a0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
1a7b0 65 6e 64 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  end;..  /* Gener
1a7c0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
1a7d0 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
1a7e0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
1a7f0 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
1a800 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1a810 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1a820 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1a830 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b  VIEW).  for(i=0;
1a840 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1a850 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  c; i++){.    con
1a860 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41  st char *zSavedA
1a870 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a  uthContext = 0;.
1a880 20 20 20 20 69 6e 74 20 6e 65 65 64 52 65 73 74      int needRest
1a890 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  oreContext;.    
1a8a0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1a8b0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
1a8c0 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  abList->a[i];.  
1a8d0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
1a8e0 74 20 3d 20 7b 53 52 54 5f 45 70 68 65 6d 54 61  t = {SRT_EphemTa
1a8f0 62 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 20 20 69  b, 0, 0};..    i
1a900 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
1a910 74 3d 3d 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69  t==0 || pItem->i
1a920 73 50 6f 70 75 6c 61 74 65 64 20 29 20 63 6f 6e  sPopulated ) con
1a930 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
1a940 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29  Item->zName!=0 )
1a950 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64 41 75  {.      zSavedAu
1a960 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
1a970 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
1a980 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1a990 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
1a9a0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Item->zName;.   
1a9b0 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f     needRestoreCo
1a9c0 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d  ntext = 1;.    }
1a9d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65 65 64  else{.      need
1a9e0 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d  RestoreContext =
1a9f0 20 30 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64 65   0;.    }.#if de
1aa00 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1aa10 54 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  T) || SQLITE_MAX
1aa20 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20  _EXPR_DEPTH>0.  
1aa30 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50    /* Increment P
1aa40 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20  arse.nHeight by 
1aa50 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
1aa60 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73  e largest expres
1aa70 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65  sion.    ** tree
1aa80 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 74   refered to by t
1aa90 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20  his, the parent 
1aaa0 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c  select. The chil
1aab0 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20  d select.    ** 
1aac0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72  may contain expr
1aad0 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20  ession trees of 
1aae0 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28  at most.    ** (
1aaf0 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
1ab00 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69  DEPTH-Parse.nHei
1ab10 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69  ght) height. Thi
1ab20 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a  s is a bit.    *
1ab30 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74  * more conservat
1ab40 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ive than necessa
1ab50 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73  ry, but much eas
1ab60 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69  ier than enforci
1ab70 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61  ng.    ** an exa
1ab80 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f  ct limit..    */
1ab90 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
1aba0 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  ight += sqlite3S
1abb0 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
1abc0 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64  p);.#endif.    d
1abd0 65 73 74 2e 69 50 61 72 6d 20 3d 20 70 49 74 65  est.iParm = pIte
1abe0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
1abf0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
1ac00 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65  arse, pItem->pSe
1ac10 6c 65 63 74 2c 20 26 64 65 73 74 2c 20 70 2c 20  lect, &dest, p, 
1ac20 69 2c 20 26 69 73 41 67 67 2c 20 30 29 3b 0a 20  i, &isAgg, 0);. 
1ac30 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
1ac40 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
1ac50 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1ac60 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69  ;.    }.#if defi
1ac70 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1ac80 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45   || SQLITE_MAX_E
1ac90 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20  XPR_DEPTH>0.    
1aca0 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
1acb0 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  -= sqlite3Select
1acc0 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 23  ExprHeight(p);.#
1acd0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6e 65  endif.    if( ne
1ace0 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
1acf0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
1ad00 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
1ad10 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
1ad20 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  xt;.    }.    pT
1ad30 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
1ad40 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70  ;.    pWhere = p
1ad50 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 69 66  ->pWhere;.    if
1ad60 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  ( !IgnorableOrde
1ad70 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
1ad80 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70      pOrderBy = p
1ad90 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
1ada0 7d 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d  }.    pGroupBy =
1adb0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
1adc0 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
1add0 48 61 76 69 6e 67 3b 0a 20 20 20 20 69 73 44 69  Having;.    isDi
1ade0 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69  stinct = p->isDi
1adf0 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 23 65 6e 64  stinct;.  }.#end
1ae00 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  if..  /* Check f
1ae10 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  or the special c
1ae20 61 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f  ase of a min() o
1ae30 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e  r max() function
1ae40 20 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20   by itself.  ** 
1ae50 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
1ae60 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69  t..  */.  if( si
1ae70 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28  mpleMinMaxQuery(
1ae80 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
1ae90 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  ) ){.    rc = 0;
1aea0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
1aeb0 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
1aec0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1aed0 74 68 69 73 20 69 73 20 61 20 73 75 62 71 75 65  this is a subque
1aee0 72 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 22  ry that can be "
1aef0 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20  flattened" into 
1af00 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a  its parent..  **
1af10 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
1af20 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20  s a possiblity, 
1af30 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e  do so and return
1af40 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a   immediately.  .
1af50 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1af60 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
1af70 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20 70  if( pParent && p
1af80 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20  ParentAgg &&.   
1af90 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65     flattenSubque
1afa0 72 79 28 64 62 2c 20 70 50 61 72 65 6e 74 2c 20  ry(db, pParent, 
1afb0 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72  parentTab, *pPar
1afc0 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20 29  entAgg, isAgg) )
1afd0 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  {.    if( isAgg 
1afe0 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20  ) *pParentAgg = 
1aff0 31 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  1;.    goto sele
1b000 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
1b010 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73  if..  /* If poss
1b020 69 62 6c 65 2c 20 72 65 77 72 69 74 65 20 74 68  ible, rewrite th
1b030 65 20 71 75 65 72 79 20 74 6f 20 75 73 65 20 47  e query to use G
1b040 52 4f 55 50 20 42 59 20 69 6e 73 74 65 61 64 20  ROUP BY instead 
1b050 6f 66 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a  of DISTINCT..  *
1b060 2a 20 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75  * GROUP BY may u
1b070 73 65 20 61 6e 20 69 6e 64 65 78 2c 20 44 49 53  se an index, DIS
1b080 54 49 4e 43 54 20 6e 65 76 65 72 20 64 6f 65 73  TINCT never does
1b090 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
1b0a0 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 21 70  isDistinct && !p
1b0b0 2d 3e 69 73 41 67 67 20 26 26 20 21 70 2d 3e 70  ->isAgg && !p->p
1b0c0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 70  GroupBy ){.    p
1b0d0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
1b0e0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1b0f0 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
1b100 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
1b110 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
1b120 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  p->isDistinct = 
1b130 30 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63  0;.    isDistinc
1b140 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t = 0;.  }..  /*
1b150 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
1b160 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
1b170 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69   then this sorti
1b180 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69  ng.  ** index mi
1b190 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ght end up being
1b1a0 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64   unused if the d
1b1b0 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a  ata can be .  **
1b1c0 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72   extracted in pr
1b1d0 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20  e-sorted order. 
1b1e0 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
1b1f0 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  case, then the. 
1b200 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   ** OP_OpenEphem
1b210 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
1b220 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
1b230 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f   to an OP_Noop o
1b240 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75  nce.  ** we figu
1b250 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  re out that the 
1b260 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73  sorting index is
1b270 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68   not needed.  Th
1b280 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a  e addrSortIndex.
1b290 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73    ** variable is
1b2a0 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
1b2b0 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e  ate that change.
1b2c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
1b2d0 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
1b2e0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
1b2f0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
1b300 45 72 72 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Err ){.      got
1b310 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1b320 20 20 7d 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f    }.    pKeyInfo
1b330 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
1b340 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1b350 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f  OrderBy);.    pO
1b360 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
1b370 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1b380 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  +;.    p->addrOp
1b390 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72  enEphm[2] = addr
1b3a0 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20  SortIndex =.    
1b3b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b3c0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
1b3d0 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
1b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3f0 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45      pOrderBy->iE
1b400 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79  Cursor, pOrderBy
1b410 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20  ->nExpr+2, 0,.  
1b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b430 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
1b440 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
1b450 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
1b460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
1b470 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a  SortIndex = -1;.
1b480 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1b490 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
1b4a0 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
1b4b0 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
1b4c0 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
1b4d0 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
1b4e0 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
1b4f0 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
1b500 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b510 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
1b520 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 70 45  pDest->iParm, pE
1b530 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
1b540 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
1b550 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  limiter..  */.  
1b560 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  iEnd = sqlite3Vd
1b570 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1b580 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
1b590 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
1b5a0 70 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  p, iEnd);..  /* 
1b5b0 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69  Open a virtual i
1b5c0 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
1b5d0 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74  the distinct set
1b5e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44  ..  */.  if( isD
1b5f0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b  istinct ){.    K
1b600 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1b610 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
1b620 41 67 67 20 7c 7c 20 70 47 72 6f 75 70 42 79 20  Agg || pGroupBy 
1b630 29 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  );.    distinct 
1b640 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1b650 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
1b660 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
1b670 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  List(pParse, p->
1b680 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
1b690 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1b6a0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
1b6b0 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 2c  al, distinct, 0,
1b6c0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
1b6e0 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
1b6f0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
1b700 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
1b710 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
1b720 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61 74  }..  /* Aggregat
1b730 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67  e and non-aggreg
1b740 61 74 65 20 71 75 65 72 69 65 73 20 61 72 65 20  ate queries are 
1b750 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
1b760 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  tly */.  if( !is
1b770 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d  Agg && pGroupBy=
1b780 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
1b790 73 20 63 61 73 65 20 69 73 20 66 6f 72 20 6e 6f  s case is for no
1b7a0 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n-aggregate quer
1b7b0 69 65 73 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e  ies.    ** Begin
1b7c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1b7d0 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 57  an.    */.    pW
1b7e0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
1b7f0 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
1b800 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
1b810 65 2c 20 26 70 4f 72 64 65 72 42 79 29 3b 0a 20  e, &pOrderBy);. 
1b820 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
1b830 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
1b840 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73  nd;..    /* If s
1b850 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
1b860 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  t was created by
1b870 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e   a prior OP_Open
1b880 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a  Ephemeral .    *
1b890 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e  * instruction en
1b8a0 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67  ded up not being
1b8b0 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68   needed, then ch
1b8c0 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
1b8d0 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a  Ephemeral.    **
1b8e0 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
1b8f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b900 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d   addrSortIndex>=
1b910 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30  0 && pOrderBy==0
1b920 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1b930 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
1b940 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64  p(v, addrSortInd
1b950 65 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d  ex, 1);.      p-
1b960 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
1b970 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20   = -1;.    }..  
1b980 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
1b990 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
1b9a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1b9b0 72 74 28 21 69 73 44 69 73 74 69 6e 63 74 29 3b  rt(!isDistinct);
1b9c0 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49  .    if( selectI
1b9d0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
1b9e0 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
1b9f0 2c 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20  , pOrderBy, -1, 
1ba00 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
1ba10 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
1ba20 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57  o->iContinue, pW
1ba30 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 61 66  Info->iBreak, af
1ba40 66 29 20 29 7b 0a 20 20 20 20 20 20 20 67 6f 74  f) ){.       got
1ba50 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1ba60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20    }..    /* End 
1ba70 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
1ba80 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
1ba90 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
1baa0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
1bab0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
1bac0 20 69 73 20 74 68 65 20 70 72 6f 63 65 73 73 69   is the processi
1bad0 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
1bae0 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20 20   queries */.    
1baf0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
1bb00 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
1bb10 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ext for processi
1bb20 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66  ng aggregate inf
1bb30 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
1bb40 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20  int iAMem;      
1bb50 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
1bb60 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f   address for sto
1bb70 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f  ring current GRO
1bb80 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
1bb90 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iBMem;         
1bba0 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
1bbb0 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f  dress for previo
1bbc0 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  us GROUP BY */. 
1bbd0 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b     int iUseFlag;
1bbe0 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64         /* Mem ad
1bbf0 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c  dress holding fl
1bc00 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  ag indicating th
1bc10 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20  at at least.    
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc30 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f      ** one row o
1bc40 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74  f the input to t
1bc50 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61  he aggregator ha
1bc60 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20  s been.         
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1bc80 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  * processed */. 
1bc90 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61     int iAbortFla
1bca0 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64  g;     /* Mem ad
1bcb0 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73  dress which caus
1bcc0 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69  es query abort i
1bcd0 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20  f positive */.  
1bce0 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72    int groupBySor
1bcf0 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f  t;    /* Rows co
1bd00 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69  me from source i
1bd10 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
1bd20 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 20 54 68 65   */...    /* The
1bd30 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
1bd40 62 6c 65 73 20 68 6f 6c 64 20 61 64 64 72 65 73  bles hold addres
1bd50 73 65 73 20 6f 72 20 6c 61 62 65 6c 73 20 66 6f  ses or labels fo
1bd60 72 20 70 61 72 74 73 20 6f 66 20 74 68 65 0a 20  r parts of the. 
1bd70 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61     ** virtual ma
1bd80 63 68 69 6e 65 20 70 72 6f 67 72 61 6d 20 77 65  chine program we
1bd90 20 61 72 65 20 70 75 74 74 69 6e 67 20 74 6f 67   are putting tog
1bda0 65 74 68 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ether */.    int
1bdb0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20   addrOutputRow; 
1bdc0 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
1bdd0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
1bde0 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c   outputs a resul
1bdf0 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  t row */.    int
1be00 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20   addrSetAbort;  
1be10 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
1be20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72  abort flag and r
1be30 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  eturn */.    int
1be40 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c   addrInitializeL
1be50 6f 6f 70 3b 20 2f 2a 20 53 74 61 72 74 20 6f 66  oop; /* Start of
1be60 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69   code that initi
1be70 61 6c 69 7a 65 73 20 74 68 65 20 69 6e 70 75 74  alizes the input
1be80 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74   loop */.    int
1be90 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20   addrTopOfLoop; 
1bea0 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
1beb0 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
1bec0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47 72 6f  .    int addrGro
1bed0 75 70 42 79 43 68 61 6e 67 65 3b 20 20 2f 2a 20  upByChange;  /* 
1bee0 43 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77  Code that runs w
1bef0 68 65 6e 20 61 6e 79 20 47 52 4f 55 50 20 42 59  hen any GROUP BY
1bf00 20 74 65 72 6d 20 63 68 61 6e 67 65 73 20 2a 2f   term changes */
1bf10 0a 20 20 20 20 69 6e 74 20 61 64 64 72 50 72 6f  .    int addrPro
1bf20 63 65 73 73 52 6f 77 3b 20 20 20 20 20 2f 2a 20  cessRow;     /* 
1bf30 43 6f 64 65 20 74 6f 20 70 72 6f 63 65 73 73 20  Code to process 
1bf40 61 20 73 69 6e 67 6c 65 20 69 6e 70 75 74 20 72  a single input r
1bf50 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  ow */.    int ad
1bf60 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  drEnd;          
1bf70 20 20 2f 2a 20 45 6e 64 20 6f 66 20 61 6c 6c 20    /* End of all 
1bf80 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20  processing */.  
1bf90 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e    int addrSortin
1bfa0 67 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65  gIdx;     /* The
1bfb0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1bfc0 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e  l for the sortin
1bfd0 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  g index */.    i
1bfe0 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20  nt addrReset;   
1bff0 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75         /* Subrou
1c000 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69  tine for resetti
1c010 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
1c020 6f 72 20 2a 2f 0a 0a 20 20 20 20 61 64 64 72 45  or */..    addrE
1c030 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
1c040 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
1c050 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b     /* Convert TK
1c060 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e  _COLUMN nodes in
1c070 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
1c080 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65   and make entrie
1c090 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67  s in.    ** sAgg
1c0a0 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f  Info for all TK_
1c0b0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64  AGG_FUNCTION nod
1c0c0 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  es in expression
1c0d0 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
1c0e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1c0f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d  ..    */.    mem
1c100 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
1c110 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73  eof(sNC));.    s
1c120 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
1c130 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  se;.    sNC.pSrc
1c140 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
1c150 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66  .    sNC.pAggInf
1c160 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20  o = &sAggInfo;. 
1c170 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72     sAggInfo.nSor
1c180 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72  tingColumn = pGr
1c190 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79  oupBy ? pGroupBy
1c1a0 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20  ->nExpr+1 : 0;. 
1c1b0 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f     sAggInfo.pGro
1c1c0 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b  upBy = pGroupBy;
1c1d0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1c1e0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
1c1f0 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29  st(&sNC, pEList)
1c200 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
1c210 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
1c220 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1c230 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
1c240 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42  st(&sNC, pOrderB
1c250 79 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  y) ){.      goto
1c260 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
1c270 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76 69   }.    if( pHavi
1c280 6e 67 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  ng && sqlite3Exp
1c290 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
1c2a0 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67  es(&sNC, pHaving
1c2b0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1c2c0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
1c2d0 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  }.    sAggInfo.n
1c2e0 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41  Accumulator = sA
1c2f0 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a  ggInfo.nColumn;.
1c300 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
1c310 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69  AggInfo.nFunc; i
1c320 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
1c330 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
1c340 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
1c350 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d  AggInfo.aFunc[i]
1c360 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 20 29  .pExpr->pList) )
1c370 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
1c380 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
1c390 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1c3a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1c3b0 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
1c3c0 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  end;..    /* Pro
1c3d0 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
1c3e0 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
1c3f0 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
1c400 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
1c410 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
1c420 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61  lex than aggrega
1c430 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52  tes without a GR
1c440 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20  OUP BY..    */. 
1c450 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
1c460 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
1c470 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20   *pKeyInfo;  /* 
1c480 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  Keying informati
1c490 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70  on for the group
1c4a0 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20   by clause */.. 
1c4b0 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6c       /* Create l
1c4c0 61 62 65 6c 73 20 74 68 61 74 20 77 65 20 77 69  abels that we wi
1c4d0 6c 6c 20 62 65 20 6e 65 65 64 69 6e 67 0a 20 20  ll be needing.  
1c4e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20      */.     .   
1c4f0 20 20 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a     addrInitializ
1c500 65 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  eLoop = sqlite3V
1c510 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1c520 0a 20 20 20 20 20 20 61 64 64 72 47 72 6f 75 70  .      addrGroup
1c530 42 79 43 68 61 6e 67 65 20 3d 20 73 71 6c 69 74  ByChange = sqlit
1c540 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1c550 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72 50 72  v);.      addrPr
1c560 6f 63 65 73 73 52 6f 77 20 3d 20 73 71 6c 69 74  ocessRow = sqlit
1c570 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1c580 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  v);..      /* If
1c590 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55   there is a GROU
1c5a0 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d  P BY clause we m
1c5b0 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74  ight need a sort
1c5c0 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20  ing index to.   
1c5d0 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20     ** implement 
1c5e0 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68  it.  Allocate th
1c5f0 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  at sorting index
1c600 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72   now.  If it tur
1c610 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20  ns out.      ** 
1c620 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e  that we do not n
1c630 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c  eed it after all
1c640 2c 20 74 68 65 20 4f 70 65 6e 45 70 68 65 6d 65  , the OpenEpheme
1c650 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  ral instruction.
1c660 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
1c670 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
1c680 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20  a Noop.  .      
1c690 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66  */.      sAggInf
1c6a0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70  o.sortingIdx = p
1c6b0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
1c6c0 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
1c6d0 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
1c6e0 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
1c6f0 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64  upBy);.      add
1c700 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 0a 20 20  rSortingIdx =.  
1c710 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1c720 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1c730 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 73  OpenEphemeral, s
1c740 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
1c750 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dx,.            
1c760 20 20 20 20 20 20 20 20 20 20 20 20 20 73 41 67               sAg
1c770 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
1c780 6c 75 6d 6e 2c 20 30 2c 0a 20 20 20 20 20 20 20  lumn, 0,.       
1c790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7a0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
1c7b0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
1c7c0 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f  NDOFF);..      /
1c7d0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d  * Initialize mem
1c7e0 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73  ory locations us
1c7f0 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61  ed by GROUP BY a
1c800 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73  ggregate process
1c810 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ing.      */.   
1c820 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 70 50     iUseFlag = pP
1c830 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
1c840 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d      iAbortFlag =
1c850 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
1c860 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70  .      iAMem = p
1c870 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1c880 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
1c890 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
1c8a0 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20  pr;.      iBMem 
1c8b0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
1c8c0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
1c8d0 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
1c8e0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
1c8f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1c900 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20  , OP_MemInt, 0, 
1c910 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
1c920 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1c930 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20  v, "clear abort 
1c940 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
1c950 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1c960 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30  (v, OP_MemInt, 0
1c970 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
1c980 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1c990 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63  v, "indicate acc
1c9a0 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29  umulator empty")
1c9b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c9c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1c9d0 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 49 6e  _Goto, 0, addrIn
1c9e0 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 0a  itializeLoop);..
1c9f0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
1ca00 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
1ca10 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69  hat outputs a si
1ca20 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
1ca30 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
1ca40 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f  set.  This subro
1ca50 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b  utine first look
1ca60 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61  s at the iUseFla
1ca70 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a  g.  If iUseFlag.
1ca80 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73        ** is less
1ca90 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1caa0 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72  o zero, the subr
1cab0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1cac0 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20  p.  If.      ** 
1cad0 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  the processing c
1cae0 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65  alls for the que
1caf0 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69  ry to abort, thi
1cb00 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  s subroutine.   
1cb10 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73     ** increments
1cb20 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20   the iAbortFlag 
1cb30 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
1cb40 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1cb50 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64   in.      ** ord
1cb60 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65  er to signal the
1cb70 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74   caller to abort
1cb80 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1cb90 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20   addrSetAbort = 
1cba0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1cbb0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
1cbc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cbd0 70 32 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c  p2(v, OP_MemInt,
1cbe0 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   1, iAbortFlag);
1cbf0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1cc00 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72  nt((v, "set abor
1cc10 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
1cc20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cc30 70 32 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p2(v, OP_Return,
1cc40 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64   0, 0);.      ad
1cc50 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71  drOutputRow = sq
1cc60 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1cc70 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
1cc80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1cc90 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c  (v, OP_IfMemPos,
1cca0 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f   iUseFlag, addrO
1ccb0 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20  utputRow+2);.   
1ccc0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1ccd0 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75  v, "Groupby resu
1cce0 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74  lt generator ent
1ccf0 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20  ry point"));.   
1cd00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cd10 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp2(v, OP_Retur
1cd20 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
1cd30 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
1cd40 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
1cd50 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69  ggInfo);.      i
1cd60 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
1cd70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1cd80 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1cd90 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75   pHaving, addrOu
1cda0 74 70 75 74 52 6f 77 2b 31 2c 20 31 29 3b 0a 20  tputRow+1, 1);. 
1cdb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1cdc0 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  = selectInnerLoo
1cdd0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
1cde0 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
1cdf0 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce10 20 20 20 64 69 73 74 69 6e 63 74 2c 20 70 44 65     distinct, pDe
1ce20 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
1ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ce40 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20  ddrOutputRow+1, 
1ce50 61 64 64 72 53 65 74 41 62 6f 72 74 2c 20 61 66  addrSetAbort, af
1ce60 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  f);.      if( rc
1ce70 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
1ce80 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
1ce90 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1cea0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ceb0 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29  OP_Return, 0, 0)
1cec0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1ced0 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f  ent((v, "end gro
1cee0 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
1cef0 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  rator"));..     
1cf00 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1cf10 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
1cf20 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72  ill reset the gr
1cf30 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74  oup-by accumulat
1cf40 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  or.      */.    
1cf50 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71    addrReset = sq
1cf60 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1cf70 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 72  Addr(v);.      r
1cf80 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
1cf90 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
1cfa0 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
1cfb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1cfc0 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b  P_Return, 0, 0);
1cfd0 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  ..      /* Begin
1cfe0 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
1cff0 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f  l extract all so
1d000 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f  urce rows in GRO
1d010 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20  UP BY order..   
1d020 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
1d030 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70   involve two sep
1d040 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68  arate loops with
1d050 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62   an OP_Sort in b
1d060 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20  etween, or.     
1d070 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
1d080 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68  a single loop th
1d090 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  at uses an index
1d0a0 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f   to extract info
1d0b0 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  rmation.      **
1d0c0 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72   in the right or
1d0d0 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74  der to begin wit
1d0e0 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
1d0f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1d100 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
1d110 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29  rInitializeLoop)
1d120 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1d130 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d140 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 52 65  Gosub, 0, addrRe
1d150 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  set);.      pWIn
1d160 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
1d170 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
1d180 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
1d190 20 26 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20   &pGroupBy);.   
1d1a0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
1d1b0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
1d1c0 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 47  nd;.      if( pG
1d1d0 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20  roupBy==0 ){.   
1d1e0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69       /* The opti
1d1f0 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f  mizer is able to
1d200 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
1d210 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20   group by order 
1d220 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  so.        ** we
1d230 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
1d240 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70  sort.  The OP_Op
1d250 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  enEphemeral tabl
1d260 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  e will be.      
1d270 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c    ** cancelled l
1d280 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20  ater because we 
1d290 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73  still need to us
1d2a0 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20  e the pKeyInfo. 
1d2b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1d2c0 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
1d2d0 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
1d2e0 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
1d2f0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
1d300 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
1d310 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69  are coming out i
1d320 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f  n undetermined o
1d330 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74  rder.  We have t
1d340 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a  o push.        *
1d350 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20  * each row into 
1d360 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c  a sorting index,
1d370 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66   terminate the f
1d380 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20  irst loop,.     
1d390 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20     ** then loop 
1d3a0 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67  over the sorting
1d3b0 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20   index in order 
1d3c0 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75  to get the outpu
1d3d0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
1d3e0 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20  sorted order.   
1d3f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1d400 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b  groupBySort = 1;
1d410 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d420 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
1d430 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
1d440 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  y);.        sqli
1d450 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d460 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41   OP_Sequence, sA
1d470 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1d480 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a  x, 0);.        j
1d490 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   = pGroupBy->nEx
1d4a0 70 72 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f  pr+1;.        fo
1d4b0 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
1d4c0 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
1d4d0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
1d4e0 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
1d4f0 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e  Col = &sAggInfo.
1d500 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  aCol[i];.       
1d510 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
1d520 72 74 65 72 43 6f 6c 75 6d 6e 3c 6a 20 29 20 63  rterColumn<j ) c
1d530 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1d540 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1d550 64 65 47 65 74 43 6f 6c 75 6d 6e 28 76 2c 20 70  deGetColumn(v, p
1d560 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d  Col->pTab, pCol-
1d570 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e  >iColumn, pCol->
1d580 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  iTable);.       
1d590 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
1d5a0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
1d5b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d5c0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6a 2c  P_MakeRecord, j,
1d5d0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
1d5e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d5f0 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
1d600 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
1d610 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Idx, 0);.       
1d620 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1d630 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
1d640 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d650 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
1d660 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
1d670 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  Idx, addrEnd);. 
1d680 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
1d690 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59  nt((v, "GROUP BY
1d6a0 20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20   sort"));.      
1d6b0 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f    sAggInfo.useSo
1d6c0 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20  rtingIdx = 1;.  
1d6d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1d6e0 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72  Evaluate the cur
1d6f0 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
1d700 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  rms and store in
1d710 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20   b0, b1, b2.... 
1d720 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d       ** (b0 is m
1d730 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69  emory location i
1d740 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42  BMem+0, b1 is iB
1d750 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f  Mem+1, and so fo
1d760 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68  rth).      ** Th
1d770 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63  en compare the c
1d780 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
1d790 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68  terms against th
1d7a0 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  e GROUP BY terms
1d7b0 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  .      ** from t
1d7c0 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
1d7d0 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
1d7e0 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e   in a0, a1, a2..
1d7f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1d800 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d   addrTopOfLoop =
1d810 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1d820 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1d830 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72    for(j=0; j<pGr
1d840 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b  oupBy->nExpr; j+
1d850 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1d860 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
1d870 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d880 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d890 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e 66  _Column, sAggInf
1d8a0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a 29  o.sortingIdx, j)
1d8b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1d8c0 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
1d8d0 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d  nfo.directMode =
1d8e0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   1;.          sq
1d8f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1d900 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
1d910 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[j].pExpr);.   
1d920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1d930 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d940 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
1d950 20 69 42 4d 65 6d 2b 6a 2c 20 6a 3c 70 47 72 6f   iBMem+j, j<pGro
1d960 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  upBy->nExpr-1);.
1d970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
1d980 72 28 6a 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  r(j=pGroupBy->nE
1d990 78 70 72 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  xpr-1; j>=0; j--
1d9a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  ){.        if( j
1d9b0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
1d9c0 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
1d9d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d9e0 32 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  2(v, OP_MemLoad,
1d9f0 20 69 42 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20   iBMem+j, 0);.  
1da00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1da10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1da20 32 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  2(v, OP_MemLoad,
1da30 20 69 41 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20   iAMem+j, 0);.  
1da40 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29        if( j==0 )
1da50 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1da60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1da70 20 4f 50 5f 45 71 2c 20 30 78 32 30 30 2c 20 61   OP_Eq, 0x200, a
1da80 64 64 72 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a  ddrProcessRow);.
1da90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1daa0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1dab0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1dac0 5f 4e 65 2c 20 30 78 32 30 30 2c 20 61 64 64 72  _Ne, 0x200, addr
1dad0 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29 3b 0a  GroupByChange);.
1dae0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1daf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1db00 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 76 6f  ngeP4(v, -1, (vo
1db10 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  id*)pKeyInfo->aC
1db20 6f 6c 6c 5b 6a 5d 2c 20 50 34 5f 43 4f 4c 4c 53  oll[j], P4_COLLS
1db30 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  EQ);.      }..  
1db40 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
1db50 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77  code that runs w
1db60 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55  henever the GROU
1db70 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20  P BY changes..  
1db80 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 20 69 6e      ** Change in
1db90 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72   the GROUP BY ar
1dba0 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68  e detected by th
1dbb0 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a  e previous code.
1dbc0 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20        ** block. 
1dbd0 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e   If there were n
1dbe0 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20  o changes, this 
1dbf0 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64  block is skipped
1dc00 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1dc10 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f   ** This code co
1dc20 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f  pies current gro
1dc30 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62  up by terms in b
1dc40 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20  0,b1,b2,....    
1dc50 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c    ** over to a0,
1dc60 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20  a1,a2.  It then 
1dc70 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74  calls the output
1dc80 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
1dc90 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20    ** and resets 
1dca0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
1dcb0 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
1dcc0 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69  ers in preparati
1dcd0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  on.      ** for 
1dce0 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42  the next GROUP B
1dcf0 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a  Y batch..      *
1dd00 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
1dd10 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1dd20 76 2c 20 61 64 64 72 47 72 6f 75 70 42 79 43 68  v, addrGroupByCh
1dd30 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  ange);.      for
1dd40 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79  (j=0; j<pGroupBy
1dd50 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
1dd60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1dd70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
1dd80 65 6d 4d 6f 76 65 2c 20 69 41 4d 65 6d 2b 6a 2c  emMove, iAMem+j,
1dd90 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
1dda0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1ddb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ddc0 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 4f  _Gosub, 0, addrO
1ddd0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
1dde0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1ddf0 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77   "output one row
1de00 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1de10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1de20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 41 62  OP_IfMemPos, iAb
1de30 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64  ortFlag, addrEnd
1de40 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1de50 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20  ment((v, "check 
1de60 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
1de70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1de80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1de90 75 62 2c 20 30 2c 20 61 64 64 72 52 65 73 65 74  ub, 0, addrReset
1dea0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1deb0 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20  ment((v, "reset 
1dec0 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
1ded0 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
1dee0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
1def0 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65  ccumulators base
1df00 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d on the content
1df10 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
1df20 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20   current row.   
1df30 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
1df40 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1df50 62 65 6c 28 76 2c 20 61 64 64 72 50 72 6f 63 65  bel(v, addrProce
1df60 73 73 52 6f 77 29 3b 0a 20 20 20 20 20 20 75 70  ssRow);.      up
1df70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
1df80 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
1df90 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
1dfa0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1dfb0 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 69 55 73  P_MemInt, 1, iUs
1dfc0 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
1dfd0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
1dfe0 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20  ndicate data in 
1dff0 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
1e000 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  .      /* End of
1e010 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20   the loop.      
1e020 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  */.      if( gro
1e030 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
1e040 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e050 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
1e060 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
1e070 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66  ngIdx, addrTopOf
1e080 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Loop);.      }el
1e090 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1e0a0 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
1e0b0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  fo);.        sql
1e0c0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
1e0d0 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
1e0e0 69 6e 67 49 64 78 2c 20 31 29 3b 0a 20 20 20 20  ingIdx, 1);.    
1e0f0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75    }..      /* Ou
1e100 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72  tput the final r
1e110 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20  ow of result.   
1e120 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
1e130 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e140 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64   OP_Gosub, 0, ad
1e150 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
1e160 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1e170 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61  (v, "output fina
1e180 6c 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20  l row"));.      
1e190 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20  .    } /* endif 
1e1a0 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20 20 20 20  pGroupBy */.    
1e1b0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20  else {.      /* 
1e1c0 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69  This case runs i
1e1d0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
1e1e0 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  has no GROUP BY 
1e1f0 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20  clause.  The.   
1e200 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
1e210 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72   is much simpler
1e220 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
1e230 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f  only a single ro
1e240 77 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75  w.      ** of ou
1e250 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tput..      */. 
1e260 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
1e270 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
1e280 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
1e290 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
1e2a0 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
1e2b0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
1e2c0 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ere, 0);.      i
1e2d0 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
1e2e0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
1e2f0 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
1e300 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
1e310 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
1e320 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
1e330 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
1e340 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
1e350 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
1e360 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
1e370 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1e380 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
1e390 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e3a0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1e3b0 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
1e3c0 64 64 72 45 6e 64 2c 20 31 29 3b 0a 20 20 20 20  ddrEnd, 1);.    
1e3d0 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74    }.      select
1e3e0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
1e3f0 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
1e400 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20  0, 0, 0, -1, .  
1e410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e420 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45      pDest, addrE
1e430 6e 64 2c 20 61 64 64 72 45 6e 64 2c 20 61 66 66  nd, addrEnd, aff
1e440 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1e450 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1e460 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29  abel(v, addrEnd)
1e470 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e  ;.    .  } /* en
1e480 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75  dif aggregate qu
1e490 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ery */..  /* If 
1e4a0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
1e4b0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
1e4c0 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72  n we need to sor
1e4d0 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  t the results.  
1e4e0 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d  ** and send them
1e4f0 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
1e500 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a   one by one..  *
1e510 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
1e520 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
1e530 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c  SortTail(pParse,
1e540 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e   p, v, pEList->n
1e550 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20  Expr, pDest);.  
1e560 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1e570 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1e580 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
1e590 20 61 20 73 75 62 71 75 65 72 79 2c 20 77 65 20   a subquery, we 
1e5a0 68 61 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74  have now convert
1e5b0 65 64 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ed the subquery 
1e5c0 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70  into a.  ** temp
1e5d0 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 53 6f  orary table.  So
1e5e0 20 73 65 74 20 74 68 65 20 53 72 63 4c 69 73 74   set the SrcList
1e5f0 5f 69 74 65 6d 2e 69 73 50 6f 70 75 6c 61 74 65  _item.isPopulate
1e600 64 20 66 6c 61 67 20 74 6f 20 70 72 65 76 65 6e  d flag to preven
1e610 74 0a 20 20 2a 2a 20 74 68 69 73 20 73 75 62 71  t.  ** this subq
1e620 75 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67 20  uery from being 
1e630 65 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 20  evaluated again 
1e640 61 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68 65  and to force the
1e650 20 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65   use of.  ** the
1e660 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1e670 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
1e680 72 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65  rent ){.    asse
1e690 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  rt( pParent->pSr
1e6a0 63 2d 3e 6e 53 72 63 3e 70 61 72 65 6e 74 54 61  c->nSrc>parentTa
1e6b0 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
1e6c0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e   pParent->pSrc->
1e6d0 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65  a[parentTab].pSe
1e6e0 6c 65 63 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70  lect==p );.    p
1e6f0 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b  Parent->pSrc->a[
1e700 70 61 72 65 6e 74 54 61 62 5d 2e 69 73 50 6f 70  parentTab].isPop
1e710 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  ulated = 1;.  }.
1e720 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4a 75 6d  #endif..  /* Jum
1e730 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
1e740 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20  his query.  */. 
1e750 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1e760 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64  lveLabel(v, iEnd
1e770 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c  );..  /* The SEL
1e780 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66  ECT was successf
1e790 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65  ully coded.   Se
1e7a0 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
1e7b0 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69  e to 0.  ** to i
1e7c0 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72  ndicate no error
1e7d0 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30  s..  */.  rc = 0
1e7e0 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20  ;..  /* Control 
1e7f0 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66  jumps to here if
1e800 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
1e810 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20  ountered above, 
1e820 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63  or upon.  ** suc
1e830 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f  cessful coding o
1e840 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20  f the SELECT..  
1e850 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 0a  */.select_end:..
1e860 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f    /* Identify co
1e870 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65  lumn names if we
1e880 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74   will be using t
1e890 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61 63  hem in a callbac
1e8a0 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74  k.  This.  ** st
1e8b0 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ep is skipped if
1e8c0 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67   the output is g
1e8d0 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68  oing to some oth
1e8e0 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  er destination..
1e8f0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
1e900 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73  QLITE_OK && pDes
1e910 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  t->eDest==SRT_Ca
1e920 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65  llback ){.    ge
1e930 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
1e940 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
1e950 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st, pEList);.  }
1e960 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
1e970 28 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b  (sAggInfo.aCol);
1e980 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1e990 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b  sAggInfo.aFunc);
1e9a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e9b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1e9c0 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
1e9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e9f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ea00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ea10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1ea20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
1ea30 6f 64 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ode is used for 
1ea40 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
1ea50 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65  gging only.  The
1ea60 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20 66 6f   code.** that fo
1ea70 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61  llows does not a
1ea80 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c 20  ppear in normal 
1ea90 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  builds..**.** Th
1eaa0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
1eab0 20 75 73 65 64 20 74 6f 20 70 72 69 6e 74 20 6f   used to print o
1eac0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ut the content o
1ead0 66 20 61 6c 6c 20 6f 72 20 70 61 72 74 20 6f 66  f all or part of
1eae0 20 61 20 0a 2a 2a 20 70 61 72 73 65 20 73 74 72   a .** parse str
1eaf0 75 63 74 75 72 65 73 20 73 75 63 68 20 61 73 20  uctures such as 
1eb00 53 65 6c 65 63 74 20 6f 72 20 45 78 70 72 2e 20  Select or Expr. 
1eb10 20 53 75 63 68 20 70 72 69 6e 74 6f 75 74 73 20   Such printouts 
1eb20 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f  are useful.** fo
1eb30 72 20 68 65 6c 70 69 6e 67 20 74 6f 20 75 6e 64  r helping to und
1eb40 65 72 73 74 61 6e 64 20 77 68 61 74 20 69 73 20  erstand what is 
1eb50 68 61 70 70 65 6e 69 6e 67 20 69 6e 73 69 64 65  happening inside
1eb60 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
1eb70 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68  tor.** during th
1eb80 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63  e execution of c
1eb90 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54 20 73 74  omplex SELECT st
1eba0 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
1ebb0 54 68 65 73 65 20 72 6f 75 74 69 6e 65 20 61 72  These routine ar
1ebc0 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 6e 79  e not called any
1ebd0 77 68 65 72 65 20 66 72 6f 6d 20 77 69 74 68 69  where from withi
1ebe0 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20  n the normal.** 
1ebf0 63 6f 64 65 20 62 61 73 65 2e 20 20 54 68 65 6e  code base.  Then
1ec00 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 74 6f   are intended to
1ec10 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
1ec20 77 69 74 68 69 6e 20 74 68 65 20 64 65 62 75 67  within the debug
1ec30 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20 74  ger.** or from t
1ec40 65 6d 70 6f 72 61 72 79 20 22 70 72 69 6e 74 66  emporary "printf
1ec50 22 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73  " statements ins
1ec60 65 72 74 65 64 20 66 6f 72 20 64 65 62 75 67 67  erted for debugg
1ec70 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ing..*/.void sql
1ec80 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 45 78  ite3PrintExpr(Ex
1ec90 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  pr *p){.  if( p-
1eca0 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 2d 3e 74  >token.z && p->t
1ecb0 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a 20 20 20 20  oken.n>0 ){.    
1ecc0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1ecd0 74 66 28 22 28 25 2e 2a 73 22 2c 20 70 2d 3e 74  tf("(%.*s", p->t
1ece0 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74 6f 6b 65 6e  oken.n, p->token
1ecf0 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  .z);.  }else{.  
1ed00 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1ed10 69 6e 74 66 28 22 28 25 64 22 2c 20 70 2d 3e 6f  intf("(%d", p->o
1ed20 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  p);.  }.  if( p-
1ed30 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 73 71  >pLeft ){.    sq
1ed40 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1ed50 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  (" ");.    sqlit
1ed60 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70  e3PrintExpr(p->p
1ed70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Left);.  }.  if(
1ed80 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20   p->pRight ){.  
1ed90 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1eda0 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73  intf(" ");.    s
1edb0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
1edc0 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  p->pRight);.  }.
1edd0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1ede0 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76 6f 69  intf(")");.}.voi
1edf0 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78  d sqlite3PrintEx
1ee00 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
1ee10 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1ee20 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1ee30 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1ee40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  ){.    sqlite3Pr
1ee50 69 6e 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61  intExpr(pList->a
1ee60 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
1ee70 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  if( i<pList->nEx
1ee80 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  pr-1 ){.      sq
1ee90 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1eea0 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20  (", ");.    }.  
1eeb0 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
1eec0 50 72 69 6e 74 53 65 6c 65 63 74 28 53 65 6c 65  PrintSelect(Sele
1eed0 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65 6e  ct *p, int inden
1eee0 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  t){.  sqlite3Deb
1eef0 75 67 50 72 69 6e 74 66 28 22 25 2a 73 53 45 4c  ugPrintf("%*sSEL
1ef00 45 43 54 28 25 70 29 20 22 2c 20 69 6e 64 65 6e  ECT(%p) ", inden
1ef10 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73 71 6c  t, "", p);.  sql
1ef20 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
1ef30 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  t(p->pEList);.  
1ef40 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1ef50 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66 28 20  tf("\n");.  if( 
1ef60 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 63  p->pSrc ){.    c
1ef70 68 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a 20 20  har *zPrefix;.  
1ef80 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a 50 72    int i;.    zPr
1ef90 65 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b 0a 20  efix = "FROM";. 
1efa0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
1efb0 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  >pSrc->nSrc; i++
1efc0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1efd0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1efe0 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e  tem = &p->pSrc->
1eff0 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[i];.      sqli
1f000 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1f010 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b 36 2c  %*s ", indent+6,
1f020 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20   zPrefix);.     
1f030 20 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a 20   zPrefix = "";. 
1f040 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1f050 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
1f060 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1f070 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a 20 20  rintf("(\n");.  
1f080 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 69        sqlite3Pri
1f090 6e 74 53 65 6c 65 63 74 28 70 49 74 65 6d 2d 3e  ntSelect(pItem->
1f0a0 70 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e 74 2b  pSelect, indent+
1f0b0 31 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  10);.        sql
1f0c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1f0d0 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74 2b 38  "%*s)", indent+8
1f0e0 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , "");.      }el
1f0f0 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e  se if( pItem->zN
1f100 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
1f110 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1f120 66 28 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  f("%s", pItem->z
1f130 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
1f140 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1f150 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
1f160 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1f170 74 66 28 22 28 74 61 62 6c 65 3a 20 25 73 29 22  tf("(table: %s)"
1f180 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
1f190 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
1f1a0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1f1b0 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
1f1c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1f1d0 69 6e 74 66 28 22 20 41 53 20 25 73 22 2c 20 70  intf(" AS %s", p
1f1e0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
1f1f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f200 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
1f210 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  -1 ){.        sq
1f220 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1f230 28 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (",");.      }. 
1f240 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
1f250 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
1f260 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
1f270 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
1f280 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1f290 74 66 28 22 25 2a 73 20 57 48 45 52 45 20 22 2c  tf("%*s WHERE ",
1f2a0 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
1f2b0 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
1f2c0 70 72 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  pr(p->pWhere);. 
1f2d0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1f2e0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
1f2f0 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70  .  if( p->pGroup
1f300 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
1f310 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
1f320 73 20 47 52 4f 55 50 20 42 59 20 22 2c 20 69 6e  s GROUP BY ", in
1f330 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
1f340 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
1f350 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 29  ist(p->pGroupBy)
1f360 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
1f370 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
1f380 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61    }.  if( p->pHa
1f390 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  ving ){.    sqli
1f3a0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1f3b0 25 2a 73 20 48 41 56 49 4e 47 20 22 2c 20 69 6e  %*s HAVING ", in
1f3c0 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
1f3d0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
1f3e0 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  p->pHaving);.   
1f3f0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1f400 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
1f410 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
1f420 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1f430 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
1f440 4f 52 44 45 52 20 42 59 20 22 2c 20 69 6e 64 65  ORDER BY ", inde
1f450 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
1f460 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
1f470 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  t(p->pOrderBy);.
1f480 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1f490 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
1f4a0 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68  }.}./* End of th
1f4b0 65 20 73 74 72 75 63 74 75 72 65 20 64 65 62 75  e structure debu
1f4c0 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a  g printing code.
1f4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23  *************/.#
1f520 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
1f530 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
1f540 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1f550 44 45 42 55 47 29 20 2a 2f 0a                    DEBUG) */.