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

Artifact 98c367bce3f38c5adfcc97de9ab5c79b0e5dc2b2:


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 35 36  select.c,v 1.356
0200: 20 32 30 30 37 2f 30 38 2f 31 36 20 31 30 3a 30   2007/08/16 10:0
0210: 39 3a 30 33 20 64 61 6e 69 65 6c 6b 31 39 37 37  9:03 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 54 4b 5f 41 4c 4c 2c 30 2c 30 2c  Expr(TK_ALL,0,0,
0820: 30 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 4e  0), 0);.  }.  pN
0830: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  ew->pEList = pEL
0840: 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  ist;.  pNew->pSr
0850: 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e 65 77  c = pSrc;.  pNew
0860: 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
0870: 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  e;.  pNew->pGrou
0880: 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
0890: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
08a0: 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70 4e 65  = pHaving;.  pNe
08b0: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  w->pOrderBy = pO
08c0: 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  rderBy;.  pNew->
08d0: 69 73 44 69 73 74 69 6e 63 74 20 3d 20 69 73 44  isDistinct = isD
08e0: 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d  istinct;.  pNew-
08f0: 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  >op = TK_SELECT;
0900: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 66 66 73  .  assert( pOffs
0910: 65 74 3d 3d 30 20 7c 7c 20 70 4c 69 6d 69 74 21  et==0 || pLimit!
0920: 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  =0 );.  pNew->pL
0930: 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
0940: 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
0950: 20 70 4f 66 66 73 65 74 3b 0a 20 20 70 4e 65 77   pOffset;.  pNew
0960: 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ->iLimit = -1;. 
0970: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
0980: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
0990: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d  rOpenEphm[0] = -
09a0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
09b0: 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b  penEphm[1] = -1;
09c0: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
09d0: 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20  nEphm[2] = -1;. 
09e0: 20 69 66 28 20 70 4e 65 77 3d 3d 26 73 74 61 6e   if( pNew==&stan
09f0: 64 69 6e 29 20 7b 0a 20 20 20 20 63 6c 65 61 72  din) {.    clear
0a00: 53 65 6c 65 63 74 28 70 4e 65 77 29 3b 0a 20 20  Select(pNew);.  
0a10: 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 0a    pNew = 0;.  }.
0a20: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
0a30: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
0a40: 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20  he given Select 
0a50: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
0a60: 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75  l of its substru
0a70: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
0a80: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
0a90: 65 74 65 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ete(Select *p){.
0aa0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
0ab0: 6c 65 61 72 53 65 6c 65 63 74 28 70 29 3b 0a 20  learSelect(p);. 
0ac0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
0ad0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
0ae0: 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64   Given 1 to 3 id
0af0: 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 65  entifiers precee
0b00: 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65  ding the JOIN ke
0b10: 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65  yword, determine
0b20: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20   the.** type of 
0b30: 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  join.  Return an
0b40: 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   integer constan
0b50: 74 20 74 68 61 74 20 65 78 70 72 65 73 73 65 73  t that expresses
0b60: 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e   that type.** in
0b70: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
0b80: 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75  llowing bit valu
0b90: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54  es:.**.**     JT
0ba0: 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54  _INNER.**     JT
0bb0: 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54  _CROSS.**     JT
0bc0: 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54  _OUTER.**     JT
0bd0: 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20  _NATURAL.**     
0be0: 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a  JT_LEFT.**     J
0bf0: 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20  T_RIGHT.**.** A 
0c00: 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20  full outer join 
0c10: 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69  is the combinati
0c20: 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e  on of JT_LEFT an
0c30: 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a  d JT_RIGHT..**.*
0c40: 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20  * If an illegal 
0c50: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
0c60: 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e  oin type is seen
0c70: 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74  , then still ret
0c80: 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79  urn.** a join ty
0c90: 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65  pe, but put an e
0ca0: 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72  rror in the pPar
0cb0: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
0cc0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e  .int sqlite3Join
0cd0: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
0ce0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54  se, Token *pA, T
0cf0: 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20  oken *pB, Token 
0d00: 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e  *pC){.  int join
0d10: 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65  type = 0;.  Toke
0d20: 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54  n *apAll[3];.  T
0d30: 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73 74 61 74 69  oken *p;.  stati
0d40: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
0d50: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
0d60: 7a 4b 65 79 77 6f 72 64 5b 38 5d 3b 0a 20 20 20  zKeyword[8];.   
0d70: 20 75 38 20 6e 43 68 61 72 3b 0a 20 20 20 20 75   u8 nChar;.    u
0d80: 38 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79 77  8 code;.  } keyw
0d90: 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  ords[] = {.    {
0da0: 20 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20 4a   "natural", 7, J
0db0: 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20 20  T_NATURAL },.   
0dc0: 20 7b 20 22 6c 65 66 74 22 2c 20 20 20 20 34 2c   { "left",    4,
0dd0: 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45   JT_LEFT|JT_OUTE
0de0: 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67 68  R },.    { "righ
0df0: 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47 48  t",   5, JT_RIGH
0e00: 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20  T|JT_OUTER },.  
0e10: 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20 34    { "full",    4
0e20: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47  , JT_LEFT|JT_RIG
0e30: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
0e40: 20 20 20 7b 20 22 6f 75 74 65 72 22 2c 20 20 20     { "outer",   
0e50: 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  5, JT_OUTER },. 
0e60: 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20 20     { "inner",   
0e70: 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20  5, JT_INNER },. 
0e80: 20 20 20 7b 20 22 63 72 6f 73 73 22 2c 20 20 20     { "cross",   
0e90: 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43  5, JT_INNER|JT_C
0ea0: 52 4f 53 53 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69  ROSS },.  };.  i
0eb0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c  nt i, j;.  apAll
0ec0: 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c  [0] = pA;.  apAl
0ed0: 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41  l[1] = pB;.  apA
0ee0: 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f  ll[2] = pC;.  fo
0ef0: 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70  r(i=0; i<3 && ap
0f00: 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  All[i]; i++){.  
0f10: 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a    p = apAll[i];.
0f20: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
0f30: 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f  izeof(keywords)/
0f40: 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b  sizeof(keywords[
0f50: 30 5d 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  0]); j++){.     
0f60: 20 69 66 28 20 70 2d 3e 6e 3d 3d 6b 65 79 77 6f   if( p->n==keywo
0f70: 72 64 73 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20  rds[j].nChar .  
0f80: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
0f90: 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
0fa0: 2a 29 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64 73  *)p->z, keywords
0fb0: 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20 70 2d  [j].zKeyword, p-
0fc0: 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >n)==0 ){.      
0fd0: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 6b 65    jointype |= ke
0fe0: 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b 0a  ywords[j].code;.
0ff0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1000: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1010: 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66 28 6b   if( j>=sizeof(k
1020: 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28  eywords)/sizeof(
1030: 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20 29 7b 0a  keywords[0]) ){.
1040: 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c        jointype |
1050: 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20  = JT_ERROR;.    
1060: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1070: 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a   }.  if(.     (j
1080: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e  ointype & (JT_IN
1090: 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d  NER|JT_OUTER))==
10a0: 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54  (JT_INNER|JT_OUT
10b0: 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69  ER) ||.     (joi
10c0: 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52  ntype & JT_ERROR
10d0: 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f  )!=0.  ){.    co
10e0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 31 20 3d  nst char *zSp1 =
10f0: 20 22 20 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20   " ";.    const 
1100: 63 68 61 72 20 2a 7a 53 70 32 20 3d 20 22 20 22  char *zSp2 = " "
1110: 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d 30 20  ;.    if( pB==0 
1120: 29 7b 20 7a 53 70 31 2b 2b 3b 20 7d 0a 20 20 20  ){ zSp1++; }.   
1130: 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53   if( pC==0 ){ zS
1140: 70 32 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69  p2++; }.    sqli
1150: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1160: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20  se, "unknown or 
1170: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1180: 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20   type: ".       
1190: 22 25 54 25 73 25 54 25 73 25 54 22 2c 20 70 41  "%T%s%T%s%T", pA
11a0: 2c 20 7a 53 70 31 2c 20 70 42 2c 20 7a 53 70 32  , zSp1, pB, zSp2
11b0: 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  , pC);.    joint
11c0: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
11d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69 6e    }else if( join
11e0: 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54 20  type & JT_RIGHT 
11f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1200: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
1210: 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64        "RIGHT and
1220: 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e   FULL OUTER JOIN
1230: 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e  s are not curren
1240: 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b  tly supported");
1250: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
1260: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20  JT_INNER;.  }.  
1270: 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b  return jointype;
1280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1290: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
12a0: 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c  column in a tabl
12b0: 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  e.  Return -1 if
12c0: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   the column.** i
12d0: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
12e0: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  in the table..*/
12f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75  .static int colu
1300: 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70  mnIndex(Table *p
1310: 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Tab, const char 
1320: 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  *zCol){.  int i;
1330: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
1340: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
1350: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1360: 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f  trICmp(pTab->aCo
1370: 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  l[i].zName, zCol
1380: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
1390: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
13a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
13b0: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 74 6f  he value of a to
13c0: 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30 30 27 2d  ken to a '\000'-
13d0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
13e0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
13f0: 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b 65 6e  d setToken(Token
1400: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1410: 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 28 75  *z){.  p->z = (u
1420: 38 2a 29 7a 3b 0a 20 20 70 2d 3e 6e 20 3d 20 7a  8*)z;.  p->n = z
1430: 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20 30   ? strlen(z) : 0
1440: 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a  ;.  p->dyn = 0;.
1450: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1460: 20 74 6f 6b 65 6e 20 74 6f 20 74 68 65 20 64 6f   token to the do
1470: 75 62 6c 65 2d 71 75 6f 74 65 64 20 61 6e 64 20  uble-quoted and 
1480: 65 73 63 61 70 65 64 20 76 65 72 73 69 6f 6e 20  escaped version 
1490: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 70 6f  of the string po
14a0: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
14b0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3b 0a 2a  . For example;.*
14c0: 2a 0a 2a 2a 20 20 20 20 7b 61 22 62 63 7d 20 20  *.**    {a"bc}  
14d0: 2d 3e 20 20 7b 22 61 22 22 62 63 22 7d 0a 2a 2f  ->  {"a""bc"}.*/
14e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
14f0: 51 75 6f 74 65 64 54 6f 6b 65 6e 28 50 61 72 73  QuotedToken(Pars
1500: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
1510: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1520: 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 28 75  *z){.  p->z = (u
1530: 38 20 2a 29 73 71 6c 69 74 65 33 4d 50 72 69 6e  8 *)sqlite3MPrin
1540: 74 66 28 30 2c 20 22 5c 22 25 77 5c 22 22 2c 20  tf(0, "\"%w\"", 
1550: 7a 29 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d 20 31  z);.  p->dyn = 1
1560: 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 7b 0a  ;.  if( p->z ){.
1570: 20 20 20 20 70 2d 3e 6e 20 3d 20 73 74 72 6c 65      p->n = strle
1580: 6e 28 28 63 68 61 72 20 2a 29 70 2d 3e 7a 29 3b  n((char *)p->z);
1590: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
15a0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
15b0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
15c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
15d0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  an expression no
15e0: 64 65 20 66 6f 72 20 61 6e 20 69 64 65 6e 74 69  de for an identi
15f0: 66 69 65 72 20 77 69 74 68 20 74 68 65 20 6e 61  fier with the na
1600: 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a 45  me of zName.*/.E
1610: 78 70 72 20 2a 73 71 6c 69 74 65 33 43 72 65 61  xpr *sqlite3Crea
1620: 74 65 49 64 45 78 70 72 28 50 61 72 73 65 20 2a  teIdExpr(Parse *
1630: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
1640: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54 6f  ar *zName){.  To
1650: 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 73 65 74  ken dummy;.  set
1660: 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 4e  Token(&dummy, zN
1670: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  ame);.  return s
1680: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1690: 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  se, TK_ID, 0, 0,
16a0: 20 26 64 75 6d 6d 79 29 3b 0a 7d 0a 0a 0a 2f 2a   &dummy);.}.../*
16b0: 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74  .** Add a term t
16c0: 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70 72  o the WHERE expr
16d0: 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70  ession in *ppExp
16e0: 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  r that requires 
16f0: 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75  the.** zCol colu
1700: 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69  mn to be equal i
1710: 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  n the two tables
1720: 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62 32   pTab1 and pTab2
1730: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1740: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20   addWhereTerm(. 
1750: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
1770: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1780: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1790: 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ol,        /* Na
17a0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
17b0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c   */.  const Tabl
17c0: 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f  e *pTab1,      /
17d0: 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f  * First table */
17e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17f0: 41 6c 69 61 73 31 2c 20 20 20 20 20 2f 2a 20 41  Alias1,     /* A
1800: 6c 69 61 73 20 66 6f 72 20 66 69 72 73 74 20 74  lias for first t
1810: 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  able.  May be NU
1820: 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61  LL */.  const Ta
1830: 62 6c 65 20 2a 70 54 61 62 32 2c 20 20 20 20 20  ble *pTab2,     
1840: 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c 65   /* Second table
1850: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1860: 20 2a 7a 41 6c 69 61 73 32 2c 20 20 20 20 20 2f   *zAlias2,     /
1870: 2a 20 41 6c 69 61 73 20 66 6f 72 20 73 65 63 6f  * Alias for seco
1880: 6e 64 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62  nd table.  May b
1890: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
18a0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 2c  iRightJoinTable,
18b0: 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
18c0: 73 6f 72 20 66 6f 72 20 74 68 65 20 72 69 67 68  sor for the righ
18d0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  t table */.  Exp
18e0: 72 20 2a 2a 70 70 45 78 70 72 20 20 20 20 20 20  r **ppExpr      
18f0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
1900: 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 74   equality term t
1910: 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  o this expressio
1920: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
1930: 70 45 31 61 2c 20 2a 70 45 31 62 2c 20 2a 70 45  pE1a, *pE1b, *pE
1940: 31 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 61  1c;.  Expr *pE2a
1950: 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32 63 3b 0a  , *pE2b, *pE2c;.
1960: 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a 20 20 70    Expr *pE;..  p
1970: 45 31 61 20 3d 20 73 71 6c 69 74 65 33 43 72 65  E1a = sqlite3Cre
1980: 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65  ateIdExpr(pParse
1990: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 70 45 32 61 20  , zCol);.  pE2a 
19a0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49  = sqlite3CreateI
19b0: 64 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a 43  dExpr(pParse, zC
19c0: 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61  ol);.  if( zAlia
19d0: 73 31 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c  s1==0 ){.    zAl
19e0: 69 61 73 31 20 3d 20 70 54 61 62 31 2d 3e 7a 4e  ias1 = pTab1->zN
19f0: 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45 31 62 20  ame;.  }.  pE1b 
1a00: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49  = sqlite3CreateI
1a10: 64 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a 41  dExpr(pParse, zA
1a20: 6c 69 61 73 31 29 3b 0a 20 20 69 66 28 20 7a 41  lias1);.  if( zA
1a30: 6c 69 61 73 32 3d 3d 30 20 29 7b 0a 20 20 20 20  lias2==0 ){.    
1a40: 7a 41 6c 69 61 73 32 20 3d 20 70 54 61 62 32 2d  zAlias2 = pTab2-
1a50: 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45  >zName;.  }.  pE
1a60: 32 62 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  2b = sqlite3Crea
1a70: 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65 2c  teIdExpr(pParse,
1a80: 20 7a 41 6c 69 61 73 32 29 3b 0a 20 20 70 45 31   zAlias2);.  pE1
1a90: 63 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  c = sqlite3PExpr
1aa0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
1ab0: 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b   pE1b, pE1a, 0);
1ac0: 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65  .  pE2c = sqlite
1ad0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
1ae0: 4b 5f 44 4f 54 2c 20 70 45 32 62 2c 20 70 45 32  K_DOT, pE2b, pE2
1af0: 61 2c 20 30 29 3b 0a 20 20 70 45 20 3d 20 73 71  a, 0);.  pE = sq
1b00: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1b10: 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20  e, TK_EQ, pE1c, 
1b20: 70 45 32 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  pE2c, 0);.  if( 
1b30: 70 45 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65  pE ){.    ExprSe
1b40: 74 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  tProperty(pE, EP
1b50: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
1b60: 70 45 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pE->iRightJoinTa
1b70: 62 6c 65 20 3d 20 69 52 69 67 68 74 4a 6f 69 6e  ble = iRightJoin
1b80: 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 45 20  Table;.  }.  pE 
1b90: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
1ba0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 2a 70 70 45  (pParse->db,*ppE
1bb0: 78 70 72 2c 20 70 45 29 3b 0a 20 20 69 66 28 20  xpr, pE);.  if( 
1bc0: 70 45 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70  pE ){.    *ppExp
1bd0: 72 20 3d 20 70 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f  r = pE;.  }.}../
1be0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f  *.** Set the EP_
1bf0: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
1c00: 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  y on all terms o
1c10: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
1c20: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73  ession..** And s
1c30: 65 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67  et the Expr.iRig
1c40: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69  htJoinTable to i
1c50: 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20  Table for every 
1c60: 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65  term in the.** e
1c70: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
1c80: 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   The EP_FromJoin
1c90: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
1ca0: 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e  d on terms of an
1cb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74   expression to t
1cc0: 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20  ell.** the LEFT 
1cd0: 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65  OUTER JOIN proce
1ce0: 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74  ssing logic that
1cf0: 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61   this term is pa
1d00: 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69  rt of the.** joi
1d10: 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70  n restriction sp
1d20: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f  ecified in the O
1d30: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
1d40: 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74  e and not a part
1d50: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  .** of the more 
1d60: 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c  general WHERE cl
1d70: 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72  ause.  These ter
1d80: 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65  ms are moved ove
1d90: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  r to the.** WHER
1da0: 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20  E clause during 
1db0: 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  join processing 
1dc0: 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72  but we need to r
1dd0: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65  emember that the
1de0: 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20  y.** originated 
1df0: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
1e00: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  NG clause..**.**
1e10: 20 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   The Expr.iRight
1e20: 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20  JoinTable tells 
1e30: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1e40: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74   processing that
1e50: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
1e60: 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61  on depends on ta
1e70: 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61  ble iRightJoinTa
1e80: 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74  ble even if that
1e90: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a   table is not.**
1ea0: 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74   explicitly ment
1eb0: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70  ioned in the exp
1ec0: 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69  ression.  That i
1ed0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65  nformation is ne
1ee0: 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65  eded.** for case
1ef0: 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
1f00: 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
1f10: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
1f20: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62   t2 ON t1.a=t2.b
1f30: 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a   AND t1.x=5.**.*
1f40: 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75  * The where clau
1f50: 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65  se needs to defe
1f60: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
1f70: 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20  f the t1.x=5.** 
1f80: 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72  term until after
1f90: 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20   the t2 loop of 
1fa0: 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68  the join.  In th
1fb0: 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c  at way, a.** NUL
1fc0: 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65  L t2 row will be
1fd0: 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76   inserted whenev
1fe0: 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20  er t1.x!=5.  If 
1ff0: 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66  we do not.** def
2000: 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20  er the handling 
2010: 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69  of t1.x=5, it wi
2020: 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  ll be processed 
2030: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61  immediately.** a
2040: 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70  fter the t1 loop
2050: 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74   and rows with t
2060: 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65  1.x!=5 will neve
2070: 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74  r appear in.** t
2080: 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68  he output, which
2090: 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a   is incorrect..*
20a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
20b0: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
20c0: 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  p, int iTable){.
20d0: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
20e0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
20f0: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
2100: 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74  );.    p->iRight
2110: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 69 54 61 62  JoinTable = iTab
2120: 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45  le;.    setJoinE
2130: 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54  xpr(p->pLeft, iT
2140: 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70  able);.    p = p
2150: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d  ->pRight;.  } .}
2160: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2170: 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74  tine processes t
2180: 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74  he join informat
2190: 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54  ion for a SELECT
21a0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f   statement..** O
21b0: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
21c0: 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65  ses are converte
21d0: 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72  d into extra ter
21e0: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
21f0: 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52  clause..** NATUR
2200: 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72  AL joins also cr
2210: 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45  eate extra WHERE
2220: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a   clause terms..*
2230: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f  *.** The terms o
2240: 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  f a FROM clause 
2250: 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  are contained in
2260: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63   the Select.pSrc
2270: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54   structure..** T
2280: 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62  he left most tab
2290: 6c 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20  le is the first 
22a0: 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e  entry in Select.
22b0: 70 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74  pSrc.  The right
22c0: 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69  -most.** table i
22d0: 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  s the last entry
22e0: 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72  .  The join oper
22f0: 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20  ator is held in 
2300: 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20  the entry to.** 
2310: 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20  the left.  Thus 
2320: 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73  entry 0 contains
2330: 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   the join operat
2340: 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20  or for the join 
2350: 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69  between.** entri
2360: 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79  es 0 and 1.  Any
2370: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2380: 75 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  uses associated 
2390: 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72  with the join ar
23a0: 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68  e.** also attach
23b0: 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65  ed to the left e
23c0: 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ntry..**.** This
23d0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
23e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
23f0: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
2400: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2410: 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
2420: 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  in(Parse *pParse
2430: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
2440: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e  /* All tables in
2470: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2480: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
24b0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75  unters */.  stru
24c0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
24d0: 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c  *pLeft;     /* L
24e0: 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  eft table being 
24f0: 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  joined */.  stru
2500: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2510: 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52  *pRight;    /* R
2520: 69 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67  ight table being
2530: 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53   joined */..  pS
2540: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
2550: 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61  pLeft = &pSrc->a
2560: 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20  [0];.  pRight = 
2570: 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72  &pLeft[1];.  for
2580: 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
2590: 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68  rc-1; i++, pRigh
25a0: 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20  t++, pLeft++){. 
25b0: 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54     Table *pLeftT
25c0: 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62  ab = pLeft->pTab
25d0: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69  ;.    Table *pRi
25e0: 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d  ghtTab = pRight-
25f0: 3e 70 54 61 62 3b 0a 0a 20 20 20 20 69 66 28 20  >pTab;..    if( 
2600: 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70  pLeftTab==0 || p
2610: 52 69 67 68 74 54 61 62 3d 3d 30 20 29 20 63 6f  RightTab==0 ) co
2620: 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
2630: 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c  When the NATURAL
2640: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
2650: 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20 63  ent, add WHERE c
2660: 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a  lause terms for.
2670: 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c      ** every col
2680: 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f  umn that the two
2690: 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20   tables have in 
26a0: 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  common..    */. 
26b0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6a     if( pRight->j
26c0: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
26d0: 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  URAL ){.      if
26e0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c  ( pRight->pOn ||
26f0: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
2700: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2710: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2720: 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f  e, "a NATURAL jo
2730: 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  in may not have 
2740: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e  ".           "an
2750: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2760: 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  use", 0);.      
2770: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2780: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
2790: 30 3b 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e  0; j<pLeftTab->n
27a0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
27b0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
27c0: 20 70 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b   pLeftTab->aCol[
27d0: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
27e0: 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65    if( columnInde
27f0: 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61  x(pRightTab, zNa
2800: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
2810: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
2820: 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20  (pParse, zName, 
2830: 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d  pLeftTab, pLeft-
2840: 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20  >zAlias, .      
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2860: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61          pRightTa
2870: 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61  b, pRight->zAlia
2880: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
28b0: 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , &p->pWhere);. 
28c0: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
28d0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
28e0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c  }..    /* Disall
28f0: 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ow both ON and U
2900: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20  SING clauses in 
2910: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20  the same join.  
2920: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
2930: 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67  ght->pOn && pRig
2940: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
2950: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2960: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
2970: 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e  not have both ON
2980: 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20   and USING ".   
2990: 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e       "clauses in
29a0: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29   the same join")
29b0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
29c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
29d0: 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  Add the ON claus
29e0: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
29f0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2a00: 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  , connected by. 
2a10: 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65     ** an AND ope
2a20: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
2a30: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
2a40: 6e 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f  n ){.      setJo
2a50: 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70  inExpr(pRight->p
2a60: 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72  On, pRight->iCur
2a70: 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  sor);.      p->p
2a80: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
2a90: 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
2aa0: 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52  b, p->pWhere, pR
2ab0: 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  ight->pOn);.    
2ac0: 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20    pRight->pOn = 
2ad0: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
2ae0: 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65   Create extra te
2af0: 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45  rms on the WHERE
2b00: 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68   clause for each
2b10: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20   column named.  
2b20: 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e    ** in the USIN
2b30: 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70  G clause.  Examp
2b40: 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74  le: If the two t
2b50: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
2b60: 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41  ed are .    ** A
2b70: 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55   and B and the U
2b80: 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65  SING clause name
2b90: 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74  s X, Y, and Z, t
2ba0: 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20  hen add this.   
2bb0: 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45   ** to the WHERE
2bc0: 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d   clause:    A.X=
2bd0: 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20  B.X AND A.Y=B.Y 
2be0: 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20  AND A.Z=B.Z.    
2bf0: 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  ** Report an err
2c00: 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  or if any column
2c10: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
2c20: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69  e USING clause i
2c30: 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e  s.    ** not con
2c40: 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74  tained in both t
2c50: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
2c60: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
2c70: 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e  f( pRight->pUsin
2c80: 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73  g ){.      IdLis
2c90: 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68  t *pList = pRigh
2ca0: 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20  t->pUsing;.     
2cb0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73   for(j=0; j<pLis
2cc0: 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20  t->nId; j++){.  
2cd0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
2ce0: 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  e = pList->a[j].
2cf0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
2d00: 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  f( columnIndex(p
2d10: 4c 65 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c  LeftTab, zName)<
2d20: 30 20 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  0 || columnIndex
2d30: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
2d40: 65 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e)<0 ){.        
2d50: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2d60: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
2d70: 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c  t join using col
2d80: 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20  umn %s - column 
2d90: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ".            "n
2da0: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f  ot present in bo
2db0: 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d  th tables", zNam
2dc0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
2dd0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
2de0: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65  }.        addWhe
2df0: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 7a  reTerm(pParse, z
2e00: 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20  Name, pLeftTab, 
2e10: 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a  pLeft->zAlias, .
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
2e40: 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a  htTab, pRight->z
2e50: 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20  Alias,.         
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e70: 20 20 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73     pRight->iCurs
2e80: 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b  or, &p->pWhere);
2e90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ea0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2eb0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63  ../*.** Insert c
2ec0: 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61  ode into "v" tha
2ed0: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
2ee0: 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f  record on the to
2ef0: 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63  p of the.** stac
2f00: 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  k into the sorte
2f10: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
2f20: 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  d pushOntoSorter
2f30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2f40: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
2f50: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
2f60: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
2f70: 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  erBy,    /* The 
2f80: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2f90: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
2fa0: 6c 65 63 74 20 20 20 20 20 20 20 20 2f 2a 20 54  lect        /* T
2fb0: 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20  he whole SELECT 
2fc0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  statement */.){.
2fd0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
2fe0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c  se->pVdbe;.  sql
2ff0: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
3000: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72  List(pParse, pOr
3010: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
3020: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3030: 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64 65  _Sequence, pOrde
3040: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30  rBy->iECursor, 0
3050: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3060: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
3070: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
3080: 72 20 2b 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c  r + 1, 0);.  sql
3090: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
30a0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
30b0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
30c0: 2b 20 32 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  + 2, 0);.  sqlit
30d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
30e0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4f 72  P_IdxInsert, pOr
30f0: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
3100: 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65   0);.  if( pSele
3110: 63 74 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b  ct->iLimit>=0 ){
3120: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20  .    int addr1, 
3130: 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64 72 31  addr2;.    addr1
3140: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
3150: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a  dOp(v, OP_IfMemZ
3160: 65 72 6f 2c 20 70 53 65 6c 65 63 74 2d 3e 69 4c  ero, pSelect->iL
3170: 69 6d 69 74 2b 31 2c 20 30 29 3b 0a 20 20 20 20  imit+1, 0);.    
3180: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3190: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20  (v, OP_MemIncr, 
31a0: 2d 31 2c 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69  -1, pSelect->iLi
31b0: 6d 69 74 2b 31 29 3b 0a 20 20 20 20 61 64 64 72  mit+1);.    addr
31c0: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
31d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
31e0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
31f0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
3200: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73  v, addr1);.    s
3210: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3220: 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64  v, OP_Last, pOrd
3230: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
3240: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
3250: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
3260: 65 6c 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d  elete, pOrderBy-
3270: 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20  >iECursor, 0);. 
3280: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
3290: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29  mpHere(v, addr2)
32a0: 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69  ;.    pSelect->i
32b0: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a  Limit = -1;.  }.
32c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
32d0: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
32e0: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
32f0: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
3300: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
3310: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
3320: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
3330: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65  his VM */.  Sele
3340: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a  ct *p,        /*
3350: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
3360: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
3370: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  d */.  int iCont
3380: 69 6e 75 65 2c 20 20 20 20 2f 2a 20 4a 75 6d 70  inue,    /* Jump
3390: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
33a0: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
33b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 70 20 20   */.  int nPop  
33c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
33d0: 72 20 6f 66 20 74 69 6d 65 73 20 74 6f 20 70 6f  r of times to po
33e0: 70 20 73 74 61 63 6b 20 77 68 65 6e 20 6a 75 6d  p stack when jum
33f0: 70 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ping */.){.  if(
3400: 20 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 26   p->iOffset>=0 &
3410: 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29  & iContinue!=0 )
3420: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
3430: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3440: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
3450: 63 72 2c 20 2d 31 2c 20 70 2d 3e 69 4f 66 66 73  cr, -1, p->iOffs
3460: 65 74 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  et);.    addr = 
3470: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3480: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 4e 65 67 2c  (v, OP_IfMemNeg,
3490: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 30 29 3b   p->iOffset, 0);
34a0: 0a 20 20 20 20 69 66 28 20 6e 50 6f 70 3e 30 20  .    if( nPop>0 
34b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
34c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
34d0: 50 6f 70 2c 20 6e 50 6f 70 2c 20 30 29 3b 0a 20  Pop, nPop, 0);. 
34e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
34f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3500: 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e  Goto, 0, iContin
3510: 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  ue);.    VdbeCom
3520: 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 6b 69 70  ment((v, "# skip
3530: 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73 22   OFFSET records"
3540: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
3550: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
3560: 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ddr);.  }.}../*.
3570: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
3580: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
3590: 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 6f 70  ake sure the top
35a0: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74   N elements of t
35b0: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 61 72 65 20  he.** stack are 
35c0: 64 69 73 74 69 6e 63 74 2e 20 20 69 54 61 62 20  distinct.  iTab 
35d0: 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  is a sorting ind
35e0: 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72  ex that holds pr
35f0: 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e  eviously.** seen
3600: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
3610: 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20   the N values.  
3620: 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d  A new entry is m
3630: 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69  ade in iTab.** i
3640: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20  f the current N 
3650: 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a  values are new..
3660: 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20  **.** A jump to 
3670: 61 64 64 72 52 65 70 65 61 74 20 69 73 20 6d 61  addrRepeat is ma
3680: 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76  de and the N+1 v
3690: 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65 64  alues are popped
36a0: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61   from the.** sta
36b0: 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20  ck if the top N 
36c0: 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74  elements are not
36d0: 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74   distinct..*/.st
36e0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69  atic void codeDi
36f0: 73 74 69 6e 63 74 28 0a 20 20 56 64 62 65 20 2a  stinct(.  Vdbe *
3700: 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v,           /* 
3710: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
3720: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
3730: 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20  int iTab,       
3740: 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20     /* A sorting 
3750: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65  index used to te
3760: 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e  st for distinctn
3770: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ess */.  int add
3780: 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a  rRepeat,    /* J
3790: 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e  ump to here if n
37a0: 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  ot distinct */. 
37b0: 20 69 6e 74 20 4e 20 20 20 20 20 20 20 20 20 20   int N          
37c0: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 70 20 4e      /* The top N
37d0: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
37e0: 20 73 74 61 63 6b 20 6d 75 73 74 20 62 65 20 64   stack must be d
37f0: 69 73 74 69 6e 63 74 20 2a 2f 0a 29 7b 0a 20 20  istinct */.){.  
3800: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3810: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
3820: 64 2c 20 2d 4e 2c 20 30 29 3b 0a 20 20 73 71 6c  d, -N, 0);.  sql
3830: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3840: 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20 69 54   OP_Distinct, iT
3850: 61 62 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  ab, sqlite3VdbeC
3860: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
3870: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3880: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
3890: 4e 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  N+1, 0);.  sqlit
38a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
38b0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 52  P_Goto, 0, addrR
38c0: 65 70 65 61 74 29 3b 0a 20 20 56 64 62 65 43 6f  epeat);.  VdbeCo
38d0: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 6b 69  mment((v, "# ski
38e0: 70 20 69 6e 64 69 73 74 69 6e 63 74 20 72 65 63  p indistinct rec
38f0: 6f 72 64 73 22 29 29 3b 0a 20 20 73 71 6c 69 74  ords"));.  sqlit
3900: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3910: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61  P_IdxInsert, iTa
3920: 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, 0);.}../*.** 
3930: 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f  Generate an erro
3940: 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20 61  r message when a
3950: 20 53 45 4c 45 43 54 20 69 73 20 75 73 65 64 20   SELECT is used 
3960: 77 69 74 68 69 6e 20 61 20 73 75 62 65 78 70 72  within a subexpr
3970: 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70  ession.** (examp
3980: 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45 4c 45  le:  "a IN (SELE
3990: 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29  CT * FROM table)
39a0: 22 29 20 62 75 74 20 69 74 20 68 61 73 20 6d 6f  ") but it has mo
39b0: 72 65 20 74 68 61 6e 20 31 20 72 65 73 75 6c 74  re than 1 result
39c0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20  .** column.  We 
39d0: 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75 62  do this in a sub
39e0: 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73 65 20  routine because 
39f0: 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73  the error occurs
3a00: 20 69 6e 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20   in multiple.** 
3a10: 70 6c 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  places..*/.stati
3a20: 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75  c int checkForMu
3a30: 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
3a40: 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  rror(Parse *pPar
3a50: 73 65 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  se, int eDest, i
3a60: 6e 74 20 6e 45 78 70 72 29 7b 0a 20 20 69 66 28  nt nExpr){.  if(
3a70: 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65   nExpr>1 && (eDe
3a80: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
3a90: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29  Dest==SRT_Set) )
3aa0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
3ab0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
3ac0: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
3ad0: 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
3ae0: 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
3af0: 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
3b00: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
3b10: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ");.    return 1
3b20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
3b30: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
3b40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3b50: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
3b60: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
3b70: 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  side of the inne
3b80: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53  r loop.** of a S
3b90: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ELECT..**.** If 
3ba0: 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75  srcTab and nColu
3bb0: 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f  mn are both zero
3bc0: 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73  , then the pELis
3bd0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
3be0: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
3bf0: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
3c00: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
3c10: 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d   row.  If nColum
3c20: 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61  n>0.** then data
3c30: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20   is pulled from 
3c40: 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73  srcTab and pELis
3c50: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74  t is used only t
3c60: 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74  o get the.** dat
3c70: 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68 20  atypes for each 
3c80: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
3c90: 63 20 69 6e 74 20 73 65 6c 65 63 74 49 6e 6e 65  c int selectInne
3ca0: 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a  rLoop(.  Parse *
3cb0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3cc0: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
3cd0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
3ce0: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
3cf0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
3d00: 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  ete select state
3d10: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
3d20: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3d30: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
3d40: 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   List of values 
3d50: 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20  being extracted 
3d60: 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c  */.  int srcTab,
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3d80: 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74  Pull data from t
3d90: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  his table */.  i
3da0: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
3db0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3dc0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
3dd0: 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20  he source table 
3de0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3df0: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
3e00: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72  If not NULL, sor
3e10: 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20  t results using 
3e20: 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  this key */.  in
3e30: 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20  t distinct,     
3e40: 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c        /* If >=0,
3e50: 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c   make sure resul
3e60: 74 73 20 61 72 65 20 64 69 73 74 69 6e 63 74 20  ts are distinct 
3e70: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3e90: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
3ea0: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  f the results */
3eb0: 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20  .  int iParm,   
3ec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
3ed0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
3ee0: 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64   disposal method
3ef0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
3f00: 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nue,          /*
3f10: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
3f20: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
3f30: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42   row */.  int iB
3f40: 72 65 61 6b 2c 20 20 20 20 20 20 20 20 20 20 20  reak,           
3f50: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
3f60: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
3f70: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  he inner loop */
3f80: 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20  .  char *aff    
3f90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 66             /* af
3fa0: 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69 66  finity string if
3fb0: 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e   eDest is SRT_Un
3fc0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ion */.){.  Vdbe
3fd0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
3fe0: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
3ff0: 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b  int hasDistinct;
4000: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
4010: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
4020: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
4030: 6e 74 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d  nt */..  if( v==
4040: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4050: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
4060: 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  0 );..  /* If th
4070: 65 72 65 20 77 61 73 20 61 20 4c 49 4d 49 54 20  ere was a LIMIT 
4080: 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 53 45  clause on the SE
4090: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
40a0: 74 68 65 6e 20 64 6f 20 74 68 65 20 63 68 65 63  then do the chec
40b0: 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66  k.  ** to see if
40c0: 20 74 68 69 73 20 72 6f 77 20 73 68 6f 75 6c 64   this row should
40d0: 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
40e0: 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d  .  hasDistinct =
40f0: 20 64 69 73 74 69 6e 63 74 3e 3d 30 20 26 26 20   distinct>=0 && 
4100: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 3b  pEList->nExpr>0;
4110: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d  .  if( pOrderBy=
4120: 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e  =0 && !hasDistin
4130: 63 74 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66  ct ){.    codeOf
4140: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
4150: 69 6e 75 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  inue, 0);.  }.. 
4160: 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71   /* Pull the req
4170: 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a  uested columns..
4180: 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75    */.  if( nColu
4190: 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  mn>0 ){.    for(
41a0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
41b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
41c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
41d0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
41e0: 62 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  b, i);.    }.  }
41f0: 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d  else{.    nColum
4200: 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  n = pEList->nExp
4210: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  r;.    sqlite3Ex
4220: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
4230: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Parse, pEList);.
4240: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
4250: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
4260: 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e  d was present on
4270: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
4280: 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74  ement.  ** and t
4290: 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e  his row has been
42a0: 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68   seen before, th
42b0: 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74  en do not make t
42c0: 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72  his row.  ** par
42d0: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  t of the result.
42e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44  .  */.  if( hasD
42f0: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61  istinct ){.    a
4300: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
4310: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
4320: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e  pEList->nExpr==n
4330: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f  Column );.    co
4340: 64 65 44 69 73 74 69 6e 63 74 28 76 2c 20 64 69  deDistinct(v, di
4350: 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75  stinct, iContinu
4360: 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  e, nColumn);.   
4370: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
4380: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
4390: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
43a0: 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  inue, nColumn);.
43b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
43c0: 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
43d0: 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
43e0: 70 50 61 72 73 65 2c 20 65 44 65 73 74 2c 20 70  pParse, eDest, p
43f0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
4400: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4410: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44   }..  switch( eD
4420: 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  est ){.    /* In
4430: 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74   this mode, writ
4440: 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73  e each query res
4450: 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f  ult to the key o
4460: 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  f the temporary.
4470: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61      ** table iPa
4480: 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  rm..    */.#ifnd
4490: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
44a0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
44b0: 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f     case SRT_Unio
44c0: 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  n: {.      sqlit
44d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
44e0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
44f0: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
4500: 20 69 66 28 20 61 66 66 20 29 7b 0a 20 20 20 20   if( aff ){.    
4510: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
4520: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 61  hangeP3(v, -1, a
4530: 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  ff, P3_STATIC);.
4540: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
4550: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4560: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
4570: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
4580: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
4590: 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20     /* Construct 
45a0: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  a record from th
45b0: 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20  e query result, 
45c0: 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20  but instead of. 
45d0: 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61     ** saving tha
45e0: 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74  t record, use it
45f0: 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c   as a key to del
4600: 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f  ete elements fro
4610: 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d  m.    ** the tem
4620: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
4630: 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rm..    */.    c
4640: 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20  ase SRT_Except: 
4650: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
4660: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
4670: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4680: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4690: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
46a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
46b0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
46c0: 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  aff, P3_STATIC);
46d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
46e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
46f0: 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20 61  tFound, iParm, a
4700: 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  ddr+3);.      sq
4710: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4720: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61  , OP_Delete, iPa
4730: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  rm, 0);.      br
4740: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
4750: 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  f..    /* Store 
4760: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
4770: 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
4780: 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
4790: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
47a0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
47b0: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
47c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
47d0: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
47e0: 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  rd, nColumn, 0);
47f0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
4800: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rBy ){.        p
4810: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
4820: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
4830: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  p);.      }else{
4840: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4850: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4860: 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c  NewRowid, iParm,
4870: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
4880: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4890: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
48a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
48b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
48c0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 4f  Insert, iParm, O
48d0: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
48e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
48f0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
4900: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
4910: 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
4920: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
4930: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
4940: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
4950: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
4960: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
4970: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
4980: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
4990: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
49a0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
49b0: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
49c0: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
49d0: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
49e0: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
49f0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 20        int addr1 
4a00: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
4a10: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
4a20: 20 20 20 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20     int addr2;.. 
4a30: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
4a40: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
4a50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4a60: 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  p(v, OP_NotNull,
4a70: 20 2d 31 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20   -1, addr1+3);. 
4a80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4a90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
4aa0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64   1, 0);.      ad
4ab0: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
4ac0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
4ad0: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  o, 0, 0);.      
4ae0: 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  p->affinity = sq
4af0: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
4b00: 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30  nity(pEList->a[0
4b10: 5d 2e 70 45 78 70 72 2c 28 69 50 61 72 6d 3e 3e  ].pExpr,(iParm>>
4b20: 31 36 29 26 30 78 66 66 29 3b 0a 20 20 20 20 20  16)&0xff);.     
4b30: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
4b40: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66  .        /* At f
4b50: 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20  irst glance you 
4b60: 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63  would think we c
4b70: 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75  ould optimize ou
4b80: 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  t the.        **
4b90: 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68 69   ORDER BY in thi
4ba0: 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68 65  s case since the
4bb0: 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65   order of entrie
4bc0: 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20  s in the set.   
4bd0: 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74       ** does not
4be0: 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74 68   matter.  But th
4bf0: 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c  ere might be a L
4c00: 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20  IMIT clause, in 
4c10: 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a  which.        **
4c20: 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72 20   case the order 
4c30: 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20  does matter */. 
4c40: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
4c50: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
4c60: 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20  rderBy, p);.    
4c70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4c80: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
4c90: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4ca0: 2c 20 31 2c 20 30 2c 20 26 70 2d 3e 61 66 66 69  , 1, 0, &p->affi
4cb0: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
4cc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4cd0: 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  Op(v, OP_IdxInse
4ce0: 72 74 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30  rt, (iParm&0x000
4cf0: 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20  0FFFF), 0);.    
4d00: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
4d10: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
4d20: 20 61 64 64 72 32 29 3b 0a 20 20 20 20 20 20 62   addr2);.      b
4d30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
4d40: 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65   /* If any row e
4d50: 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75  xist in the resu
4d60: 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74  lt set, record t
4d70: 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f  hat fact and abo
4d80: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rt..    */.    c
4d90: 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20  ase SRT_Exists: 
4da0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
4db0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
4dc0: 65 6d 49 6e 74 2c 20 31 2c 20 69 50 61 72 6d 29  emInt, 1, iParm)
4dd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4de0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4df0: 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  op, nColumn, 0);
4e00: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
4e10: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
4e20: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
4e30: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
4e40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4e50: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
4e60: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
4e70: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
4e80: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
4e90: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
4ea0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
4eb0: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
4ec0: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
4ed0: 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
4ee0: 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
4ef0: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
4f00: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
4f10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
4f20: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
4f30: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
4f40: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
4f50: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
4f60: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a  , pOrderBy, p);.
4f70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4f80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4f90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
4fa0: 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b  tore, iParm, 1);
4fb0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
4fc0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
4fd0: 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
4fe0: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
4ff0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5000: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
5010: 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
5020: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
5030: 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  RY */..    /* Se
5040: 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  nd the data to t
5050: 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  he callback func
5060: 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62  tion or to a sub
5070: 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65  routine.  In the
5080: 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20  .    ** case of 
5090: 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68  a subroutine, th
50a0: 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73  e subroutine its
50b0: 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62  elf is responsib
50c0: 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f  le for.    ** po
50d0: 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 20 66  pping the data f
50e0: 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20  rom the stack.. 
50f0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5100: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 0a 20  RT_Subroutine:. 
5110: 20 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c     case SRT_Call
5120: 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 69 66  back: {.      if
5130: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
5140: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5150: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
5160: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
5170: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75  , 0);.        pu
5180: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
5190: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
51a0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
51b0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75  f( eDest==SRT_Su
51c0: 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  broutine ){.    
51d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
51e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62  ddOp(v, OP_Gosub
51f0: 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 0, iParm);.   
5200: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5210: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5220: 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63  Op(v, OP_Callbac
5230: 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  k, nColumn, 0);.
5240: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5250: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
5260: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5270: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
5280: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
5290: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
52a0: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
52b0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
52c0: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
52d0: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
52e0: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
52f0: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
5300: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
5310: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
5320: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
5330: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
5340: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
5350: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
5360: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
5370: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
5380: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
5390: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
53a0: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
53b0: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
53c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
53d0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c  (v, OP_Pop, nCol
53e0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  umn, 0);.      b
53f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
5400: 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  if.  }..  /* Jum
5410: 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
5420: 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
5430: 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
5440: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
5450: 69 4c 69 6d 69 74 3e 3d 30 20 26 26 20 70 4f 72  iLimit>=0 && pOr
5460: 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
5470: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5480: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20  (v, OP_MemIncr, 
5490: 2d 31 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a  -1, p->iLimit);.
54a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
54b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  ddOp(v, OP_IfMem
54c0: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
54d0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 20 20   iBreak);.  }.  
54e0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
54f0: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
5500: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e  ession list, gen
5510: 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  erate a KeyInfo 
5520: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
5530: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f  ecords.** the co
5540: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
5550: 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   for each expres
5560: 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70  sion in that exp
5570: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
5580: 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c  .** If the ExprL
5590: 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ist is an ORDER 
55a0: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
55b0: 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72  lause then the r
55c0: 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49  esulting.** KeyI
55d0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
55e0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
55f0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
5600: 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
5610: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  .** implement th
5620: 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74  at clause.  If t
5630: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74  he ExprList is t
5640: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
5650: 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65   a SELECT.** the
5660: 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  n the KeyInfo st
5670: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
5680: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
5690: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
56a0: 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d  l.** index to im
56b0: 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e  plement a DISTIN
56c0: 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53  CT test..**.** S
56d0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
56e0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
56f0: 72 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f  re is obtain fro
5700: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
5710: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
5720: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
5730: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
5740: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
5750: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
5760: 2a 20 66 72 65 65 64 2e 20 20 41 64 64 20 74 68  * freed.  Add th
5770: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
5780: 75 72 65 20 74 6f 20 74 68 65 20 50 33 20 66 69  ure to the P3 fi
5790: 65 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65  eld of an opcode
57a0: 20 75 73 69 6e 67 0a 2a 2a 20 50 33 5f 4b 45 59   using.** P3_KEY
57b0: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20  INFO_HANDOFF is 
57c0: 74 68 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66  the usual way of
57d0: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68   dealing with th
57e0: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65  is..*/.static Ke
57f0: 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72  yInfo *keyInfoFr
5800: 6f 6d 45 78 70 72 4c 69 73 74 28 50 61 72 73 65  omExprList(Parse
5810: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
5820: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71  st *pList){.  sq
5830: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5840: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45  se->db;.  int nE
5850: 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  xpr;.  KeyInfo *
5860: 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  pInfo;.  struct 
5870: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
5880: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Item;.  int i;..
5890: 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d    nExpr = pList-
58a0: 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20  >nExpr;.  pInfo 
58b0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
58c0: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
58d0: 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72  (*pInfo) + nExpr
58e0: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
58f0: 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70  *)+1) );.  if( p
5900: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66  Info ){.    pInf
5910: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  o->aSortOrder = 
5920: 28 75 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f  (u8*)&pInfo->aCo
5930: 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70  ll[nExpr];.    p
5940: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  Info->nField = n
5950: 45 78 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  Expr;.    pInfo-
5960: 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a  >enc = ENC(db);.
5970: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
5980: 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e  em=pList->a; i<n
5990: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
59a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  ++){.      CollS
59b0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
59c0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
59d0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
59e0: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
59f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43  );.      if( !pC
5a00: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
5a10: 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
5a20: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
5a30: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c      pInfo->aColl
5a40: 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  [i] = pColl;.   
5a50: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
5a60: 72 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d  rder[i] = pItem-
5a70: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
5a80: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
5a90: 49 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Info;.}.../*.** 
5aa0: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
5ab0: 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  p was generated 
5ac0: 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c  using a non-null
5ad0: 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65   pOrderBy argume
5ae0: 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  nt,.** then the 
5af0: 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61  results were pla
5b00: 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e  ced in a sorter.
5b10: 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70    After the loop
5b20: 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a   is terminated.*
5b30: 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e  * we need to run
5b40: 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20   the sorter and 
5b50: 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c  output the resul
5b60: 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ts.  The followi
5b70: 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  ng.** routine ge
5b80: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
5b90: 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68   needed to do th
5ba0: 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  at..*/.static vo
5bb0: 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54  id generateSortT
5bc0: 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ail(.  Parse *pP
5bd0: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
5be0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
5bf0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
5c00: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
5c10: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64  tatement */.  Vd
5c20: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 2f  be *v,         /
5c30: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
5c40: 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  into this VDBE *
5c50: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
5c60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5c70: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
5c80: 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  a */.  int eDest
5c90: 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ,       /* Write
5ca0: 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75   the sorted resu
5cb0: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  lts here */.  in
5cc0: 74 20 69 50 61 72 6d 20 20 20 20 20 20 20 20 2f  t iParm        /
5cd0: 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d  * Optional param
5ce0: 65 74 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  eter associated 
5cf0: 77 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b  with eDest */.){
5d00: 0a 20 20 69 6e 74 20 62 72 6b 20 3d 20 73 71 6c  .  int brk = sql
5d10: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
5d20: 6c 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f 6e 74  l(v);.  int cont
5d30: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
5d40: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e  keLabel(v);.  in
5d50: 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54  t addr;.  int iT
5d60: 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f  ab;.  int pseudo
5d70: 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c  Tab = 0;.  ExprL
5d80: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
5d90: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20  p->pOrderBy;..  
5da0: 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d  iTab = pOrderBy-
5db0: 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  >iECursor;.  if(
5dc0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
5dd0: 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53  back || eDest==S
5de0: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b  RT_Subroutine ){
5df0: 0a 20 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d  .    pseudoTab =
5e00: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
5e10: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5e20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
5e30: 50 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61  Pseudo, pseudoTa
5e40: 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
5e50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5e60: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
5e70: 20 70 73 65 75 64 6f 54 61 62 2c 20 6e 43 6f 6c   pseudoTab, nCol
5e80: 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72  umn);.  }.  addr
5e90: 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
5ea0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
5eb0: 72 74 2c 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a  rt, iTab, brk);.
5ec0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
5ed0: 70 2c 20 63 6f 6e 74 2c 20 30 29 3b 0a 20 20 69  p, cont, 0);.  i
5ee0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
5ef0: 6c 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d  llback || eDest=
5f00: 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20  =SRT_Subroutine 
5f10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
5f20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
5f30: 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20  teger, 1, 0);.  
5f40: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
5f50: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
5f60: 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72 42  n, iTab, pOrderB
5f70: 79 2d 3e 6e 45 78 70 72 20 2b 20 31 29 3b 0a 20  y->nExpr + 1);. 
5f80: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
5f90: 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  {.    case SRT_T
5fa0: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
5fb0: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
5fc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5fd0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52  AddOp(v, OP_NewR
5fe0: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 30 29 3b  owid, iParm, 0);
5ff0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6000: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
6010: 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 1, 0);.     
6020: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6030: 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  p(v, OP_Insert, 
6040: 69 50 61 72 6d 2c 20 4f 50 46 4c 41 47 5f 41 50  iParm, OPFLAG_AP
6050: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65  PEND);.      bre
6060: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
6070: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
6080: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
6090: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
60a0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
60b0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
60c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
60d0: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c   OP_NotNull, -1,
60e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
60f0: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
6100: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6110: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
6120: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
6130: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6140: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71  , OP_Goto, 0, sq
6150: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
6160: 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20  Addr(v)+3);.    
6170: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
6180: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6190: 64 2c 20 31 2c 20 30 2c 20 26 70 2d 3e 61 66 66  d, 1, 0, &p->aff
61a0: 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
61b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
61c0: 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  p(v, OP_IdxInser
61d0: 74 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30 30  t, (iParm&0x0000
61e0: 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20 20  FFFF), 0);.     
61f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6200: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
6210: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
6220: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
6230: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6240: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
6250: 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ore, iParm, 1);.
6260: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
6270: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
6280: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
6290: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
62a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
62b0: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 53  endif.    case S
62c0: 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20  RT_Callback:.   
62d0: 20 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75   case SRT_Subrou
62e0: 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  tine: {.      in
62f0: 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t i;.      sqlit
6300: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6310: 50 5f 49 6e 73 65 72 74 2c 20 70 73 65 75 64 6f  P_Insert, pseudo
6320: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  Tab, 0);.      f
6330: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
6340: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
6350: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6360: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
6370: 70 73 65 75 64 6f 54 61 62 2c 20 69 29 3b 0a 20  pseudoTab, i);. 
6380: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6390: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
63a0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
63b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
63c0: 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c  (v, OP_Callback,
63d0: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
63e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
63f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6400: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
6410: 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20   0, iParm);.    
6420: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6430: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
6440: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  lt: {.      /* D
6450: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
6460: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6470: 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
6480: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
6490: 20 6c 6f 6f 70 20 77 68 65 6e 20 74 68 65 20 4c   loop when the L
64a0: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 0a  IMIT is reached.
64b0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
64c0: 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73  imit>=0 ){.    s
64d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
64e0: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d  v, OP_MemIncr, -
64f0: 31 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20  1, p->iLimit);. 
6500: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6510: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a  dOp(v, OP_IfMemZ
6520: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
6530: 62 72 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  brk);.  }..  /* 
6540: 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  The bottom of th
6550: 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
6560: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
6570: 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a  Label(v, cont);.
6580: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6590: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  Op(v, OP_Next, i
65a0: 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 73 71  Tab, addr);.  sq
65b0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
65c0: 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20  Label(v, brk);. 
65d0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
65e0: 43 61 6c 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73  Callback || eDes
65f0: 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e  t==SRT_Subroutin
6600: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
6610: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6620: 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62  Close, pseudoTab
6630: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a  , 0);.  }..}../*
6640: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
6650: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
6660: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6670: 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70  'declaration typ
6680: 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  e' of the.** exp
6690: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54  ression pExpr. T
66a0: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
66b0: 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74   treated as stat
66c0: 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ic by the caller
66d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c  ..**.** The decl
66e0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  aration type is 
66f0: 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79  the exact dataty
6700: 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78  pe definition ex
6710: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
6720: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45  .** original CRE
6730: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
6740: 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ent if the expre
6750: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
6760: 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72  n. The.** declar
6770: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
6780: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
6790: 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79  INTEGER. Exactly
67a0: 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73   when an express
67b0: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  ion.** is consid
67c0: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61  ered a column ca
67d0: 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20  n be complex in 
67e0: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
67f0: 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a  subqueries. The.
6800: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  ** result-set ex
6810: 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20  pression in all 
6820: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
6830: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6840: 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64  ts is .** consid
6850: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79  ered a column by
6860: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
6870: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
6880: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
6890: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
68a0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
68b0: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
68c0: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29  CT col FROM tbl)
68d0: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62  ;.**   SELECT ab
68e0: 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63  c FROM (SELECT c
68f0: 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74  ol AS abc FROM t
6900: 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  bl);.** .** The 
6910: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
6920: 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73   for any express
6930: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ion other than a
6940: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e   column is NULL.
6950: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
6960: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
6970: 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  e(.  NameContext
6980: 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a   *pNC, .  Expr *
6990: 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63  pExpr,.  const c
69a0: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44 62  har **pzOriginDb
69b0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
69c0: 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20 20  *pzOriginTab,.  
69d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
69e0: 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68  riginCol.){.  ch
69f0: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20  ar const *zType 
6a00: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
6a10: 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20 30  t *zOriginDb = 0
6a20: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
6a30: 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30 3b 0a  zOriginTab = 0;.
6a40: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
6a50: 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  riginCol = 0;.  
6a60: 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70 45 78  int j;.  if( pEx
6a70: 70 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70 53  pr==0 || pNC->pS
6a80: 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75  rcList==0 ) retu
6a90: 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63 68 28  rn 0;..  switch(
6aa0: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
6ab0: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
6ac0: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
6ad0: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
6ae0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
6af0: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
6b00: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
6b10: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  e the column is 
6b20: 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65  being.      ** e
6b30: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e  xtracted from in
6b40: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72   NameContext.pSr
6b50: 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c  cList. This tabl
6b60: 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20  e may be real.  
6b70: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
6b80: 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75  table or a subqu
6b90: 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ery..      */.  
6ba0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
6bb0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
6bc0: 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  /* Table structu
6bd0: 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  re column is ext
6be0: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
6bf0: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
6c00: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
6c10: 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63   /* Select the c
6c20: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
6c30: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
6c40: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
6c50: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20  r->iColumn;  /* 
6c60: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
6c70: 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20  in pTab */.     
6c80: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21   while( pNC && !
6c90: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
6ca0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
6cb0: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
6cc0: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  t;.        for(j
6cd0: 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  =0;j<pTabList->n
6ce0: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
6cf0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
6d00: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b  Expr->iTable;j++
6d10: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
6d20: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
6d30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
6d40: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
6d50: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  j].pTab;.       
6d60: 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74     pS = pTabList
6d70: 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[j].pSelect;.
6d80: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
6d90: 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70           pNC = p
6da0: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  NC->pNext;.     
6db0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
6dc0: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
6dd0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 49  ){.        /* FI
6de0: 58 20 4d 45 3a 0a 20 20 20 20 20 20 20 20 2a 2a  X ME:.        **
6df0: 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72 73   This can occurs
6e00: 20 69 66 20 79 6f 75 20 68 61 76 65 20 73 6f 6d   if you have som
6e10: 65 74 68 69 6e 67 20 6c 69 6b 65 20 22 53 45 4c  ething like "SEL
6e20: 45 43 54 20 6e 65 77 2e 78 3b 22 20 69 6e 73 69  ECT new.x;" insi
6e30: 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  de.        ** a 
6e40: 74 72 69 67 67 65 72 2e 20 20 49 6e 20 6f 74 68  trigger.  In oth
6e50: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 79 6f 75  er words, if you
6e60: 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
6e70: 70 65 63 69 61 6c 20 22 6e 65 77 22 0a 20 20 20  pecial "new".   
6e80: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 6e       ** table in
6e90: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
6ea0: 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 57 65  of a select.  We
6eb0: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 67   do not have a g
6ec0: 6f 6f 64 20 77 61 79 0a 20 20 20 20 20 20 20 20  ood way.        
6ed0: 2a 2a 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61  ** to find the a
6ee0: 63 74 75 61 6c 20 74 61 62 6c 65 20 74 79 70 65  ctual table type
6ef0: 2c 20 73 6f 20 63 61 6c 6c 20 69 74 20 22 54 45  , so call it "TE
6f00: 58 54 22 2e 20 20 54 68 69 73 20 69 73 20 72 65  XT".  This is re
6f10: 61 6c 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  ally.        ** 
6f20: 73 6f 6d 65 74 68 69 6e 67 20 6f 66 20 61 20 62  something of a b
6f30: 75 67 2c 20 62 75 74 20 49 20 64 6f 20 6e 6f 74  ug, but I do not
6f40: 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 66 69 78   know how to fix
6f50: 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a   it..        **.
6f60: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
6f70: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 72  code does not pr
6f80: 6f 64 75 63 65 20 74 68 65 20 63 6f 72 72 65 63  oduce the correc
6f90: 74 20 61 6e 73 77 65 72 20 2d 20 69 74 20 6a 75  t answer - it ju
6fa0: 73 74 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20  st prevents.    
6fb0: 20 20 20 20 2a 2a 20 61 20 73 65 67 66 61 75 6c      ** a segfaul
6fc0: 74 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  t.  See ticket #
6fd0: 31 32 32 39 2e 0a 20 20 20 20 20 20 20 20 2a 2f  1229..        */
6fe0: 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  .        zType =
6ff0: 20 22 54 45 58 54 22 3b 0a 20 20 20 20 20 20 20   "TEXT";.       
7000: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
7010: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7020: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Tab );.      if(
7030: 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   pS ){.        /
7040: 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73  * The "table" is
7050: 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d   actually a sub-
7060: 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77  select or a view
7070: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
7080: 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  use.        ** o
7090: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
70a0: 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74  tement. Return t
70b0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
70c0: 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20  ype and origin. 
70d0: 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66         ** data f
70e0: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  or the result-se
70f0: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
7100: 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20  sub-select..    
7110: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
7120: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  f( iCol>=0 && iC
7130: 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<pS->pEList->n
7140: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
7150: 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20    /* If iCol is 
7160: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
7170: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
7180: 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65  ion requests the
7190: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  .          ** ro
71a0: 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73  wid of the sub-s
71b0: 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54  elect or view. T
71c0: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
71d0: 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20  s legal (see .  
71e0: 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20          ** test 
71f0: 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20  case misc2.2.2) 
7200: 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c  - it always eval
7210: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20  uates to NULL.. 
7220: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
7230: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
7240: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  t sNC;.         
7250: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
7260: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
7270: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
7280: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
7290: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20  S->pSrc;.       
72a0: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30     sNC.pNext = 0
72b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
72c0: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
72d0: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
72e0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
72f0: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
7300: 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e  iginDb, &zOrigin
7310: 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c  Tab, &zOriginCol
7320: 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ); .        }.  
7330: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
7340: 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  ab->pSchema ){. 
7350: 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c         /* A real
7360: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
7370: 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b    assert( !pS );
7380: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
7390: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
73a0: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
73b0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
73c0: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
73d0: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
73e0: 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  l) );.        if
73f0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
7400: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
7410: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
7420: 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20     zOriginCol = 
7430: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20  "rowid";.       
7440: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7450: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
7460: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
7470: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
7480: 67 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61  ginCol = pTab->a
7490: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
74a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
74b0: 20 20 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20     zOriginTab = 
74c0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
74d0: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
74e0: 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  arse ){.        
74f0: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
7500: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
7510: 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62  (pNC->pParse->db
7520: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
7530: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
7540: 67 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61  ginDb = pNC->pPa
7550: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
7560: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
7570: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
7580: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
7590: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
75a0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
75b0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
75c0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
75d0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75  pression is a su
75e0: 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e  b-select. Return
75f0: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
7600: 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20   type and.      
7610: 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66  ** origin info f
7620: 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f  or the single co
7630: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
7640: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
7650: 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74  LECT.      ** st
7660: 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  atement..      *
7670: 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74  /.      NameCont
7680: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53  ext sNC;.      S
7690: 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70  elect *pS = pExp
76a0: 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  r->pSelect;.    
76b0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
76c0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
76d0: 70 72 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53  pr;.      sNC.pS
76e0: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
76f0: 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65  c;.      sNC.pNe
7700: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
7710: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
7720: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
7730: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
7740: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
7750: 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e  iginDb, &zOrigin
7760: 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c  Tab, &zOriginCol
7770: 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
7780: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
7790: 7d 0a 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69  }.  .  if( pzOri
77a0: 67 69 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73  ginDb ){.    ass
77b0: 65 72 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62  ert( pzOriginTab
77c0: 20 26 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20   && pzOriginCol 
77d0: 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e  );.    *pzOrigin
77e0: 44 62 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a  Db = zOriginDb;.
77f0: 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62      *pzOriginTab
7800: 20 3d 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20   = zOriginTab;. 
7810: 20 20 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20     *pzOriginCol 
7820: 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20  = zOriginCol;.  
7830: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65  }.  return zType
7840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
7850: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
7860: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
7870: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
7880: 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   types of column
7890: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
78a0: 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  lt set..*/.stati
78b0: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
78c0: 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61  olumnTypes(.  Pa
78d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
78e0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
78f0: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
7900: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
7910: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
7920: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
7930: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
7940: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
7950: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
7960: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
7970: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
7980: 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
7990: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e  ontext sNC;.  sN
79a0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
79b0: 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61  bList;.  sNC.pPa
79c0: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
79d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
79e0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
79f0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45      Expr *p = pE
7a00: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
7a10: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
7a20: 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20   *zOrigDb = 0;. 
7a30: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
7a40: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20  OrigTab = 0;.   
7a50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
7a60: 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 63  igCol = 0;.    c
7a70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
7a80: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
7a90: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c  NC, p, &zOrigDb,
7aa0: 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72   &zOrigTab, &zOr
7ab0: 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20  igCol);..    /* 
7ac0: 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61  The vdbe must ma
7ad0: 6b 65 20 69 74 27 73 20 6f 77 6e 20 63 6f 70 79  ke it's own copy
7ae0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74   of the column-t
7af0: 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20  ype and other . 
7b00: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65     ** column spe
7b10: 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69  cific strings, i
7b20: 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d  n case the schem
7b30: 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  a is reset befor
7b40: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69  e this.    ** vi
7b50: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
7b60: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
7b70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7b80: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
7b90: 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50   COLNAME_DECLTYP
7ba0: 45 2c 20 7a 54 79 70 65 2c 20 50 33 5f 54 52 41  E, zType, P3_TRA
7bb0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
7bc0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
7bd0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
7be0: 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67  _DATABASE, zOrig
7bf0: 44 62 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e 54  Db, P3_TRANSIENT
7c00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7c10: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
7c20: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45  i, COLNAME_TABLE
7c30: 2c 20 7a 4f 72 69 67 54 61 62 2c 20 50 33 5f 54  , zOrigTab, P3_T
7c40: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
7c50: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
7c60: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
7c70: 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67  ME_COLUMN, zOrig
7c80: 43 6f 6c 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e  Col, P3_TRANSIEN
7c90: 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  T);.  }.}../*.**
7ca0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
7cb0: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
7cc0: 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73  e VDBE the names
7cd0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
7ce0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
7cf0: 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
7d00: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
7d10: 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a  rovide the.** az
7d20: 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20  Col[] values in 
7d30: 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  the callback..*/
7d40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
7d50: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
7d60: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
7d70: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
7d80: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
7d90: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
7da0: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
7db0: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
7dc0: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
7dd0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
7de0: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
7df0: 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   set */.){.  Vdb
7e00: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
7e10: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Vdbe;.  int i, j
7e20: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
7e30: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
7e40: 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73  int fullNames, s
7e50: 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e  hortNames;..#ifn
7e60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7e70: 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20  EXPLAIN.  /* If 
7e80: 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41  this is an EXPLA
7e90: 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74  IN, skip this st
7ea0: 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  ep */.  if( pPar
7eb0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
7ec0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
7ed0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
7ee0: 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70   v!=0 );.  if( p
7ef0: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
7f00: 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 64 62  et || v==0 || db
7f10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7f20: 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73   return;.  pPars
7f30: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
7f40: 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20   1;.  fullNames 
7f50: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
7f60: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
7f70: 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e  es)!=0;.  shortN
7f80: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
7f90: 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
7fa0: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
7fb0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
7fc0: 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d  mCols(v, pEList-
7fd0: 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69  >nExpr);.  for(i
7fe0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
7ff0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
8000: 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  xpr *p;.    p = 
8010: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
8020: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  pr;.    if( p==0
8030: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8040: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
8050: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
8060: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
8070: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
8080: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
8090: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
80a0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
80b0: 45 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  E, zName, strlen
80c0: 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  (zName));.      
80d0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
80e0: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
80f0: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62  K_COLUMN && pTab
8100: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61  List ){.      Ta
8110: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
8120: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
8130: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
8140: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
8150: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c  for(j=0; j<pTabL
8160: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
8170: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
8180: 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20  sor!=p->iTable; 
8190: 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73  j++){}.      ass
81a0: 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d  ert( j<pTabList-
81b0: 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70  >nSrc );.      p
81c0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
81d0: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
81e0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
81f0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
8200: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8210: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
8220: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
8230: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
8240: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
8250: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
8260: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
8270: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
8280: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
8290: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
82a0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73    }.      if( !s
82b0: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75  hortNames && !fu
82c0: 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73 70  llNames && p->sp
82d0: 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e  an.z && p->span.
82e0: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  z[0] ){.        
82f0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8300: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8310: 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68 61 72 2a  AME_NAME, (char*
8320: 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73  )p->span.z, p->s
8330: 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65  pan.n);.      }e
8340: 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65  lse if( fullName
8350: 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65  s || (!shortName
8360: 73 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s && pTabList->n
8370: 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20  Src>1) ){.      
8380: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
8390: 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  0;.        char 
83a0: 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20  *zTab;. .       
83b0: 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   zTab = pTabList
83c0: 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20  ->a[j].zAlias;. 
83d0: 20 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e         if( fullN
83e0: 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20  ames || zTab==0 
83f0: 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a  ) zTab = pTab->z
8400: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Name;.        sq
8410: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
8420: 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22  zName, zTab, "."
8430: 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30  , zCol, (char*)0
8440: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
8450: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8460: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
8470: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 50 33 5f 44  AME, zName, P3_D
8480: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d  YNAMIC);.      }
8490: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
84a0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
84b0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
84c0: 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 73 74  E_NAME, zCol, st
84d0: 72 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20 20  rlen(zCol));.   
84e0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
84f0: 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  f( p->span.z && 
8500: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a  p->span.z[0] ){.
8510: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8520: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8530: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
8540: 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a  (char*)p->span.z
8550: 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20  , p->span.n);.  
8560: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 64      /* sqlite3Vd
8570: 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65 28  beCompressSpace(
8580: 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20 20 20  v, addr); */.   
8590: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
85a0: 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20  ar zName[30];.  
85b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
85c0: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
85d0: 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  pTabList==0 );. 
85e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
85f0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4e 61  rintf(sizeof(zNa
8600: 6d 65 29 2c 20 7a 4e 61 6d 65 2c 20 22 63 6f 6c  me), zName, "col
8610: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20  umn%d", i+1);.  
8620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8630: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8640: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
8650: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ame, 0);.    }. 
8660: 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c   }.  generateCol
8670: 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c  umnTypes(pParse,
8680: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
8690: 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  t);.}..#ifndef S
86a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
86b0: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
86c0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
86d0: 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72  nection operator
86e0: 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72  , used for error
86f0: 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74   messages..*/.st
8700: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
8710: 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e  *selectOpName(in
8720: 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a  t id){.  char *z
8730: 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29  ;.  switch( id )
8740: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
8750: 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e  L:       z = "UN
8760: 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61  ION ALL";   brea
8770: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
8780: 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49  NTERSECT: z = "I
8790: 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65  NTERSECT";   bre
87a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
87b0: 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22  EXCEPT:    z = "
87c0: 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72  EXCEPT";      br
87d0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
87e0: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20  :           z = 
87f0: 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62  "UNION";       b
8800: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
8810: 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn z;.}.#endif /
8820: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
8830: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
8840: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
8850: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
8860: 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 53 65  tatic int prepSe
8870: 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65 2a 2c  lectStmt(Parse*,
8880: 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a   Select*);../*.*
8890: 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54  * Given a SELECT
88a0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65   statement, gene
88b0: 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72  rate a Table str
88c0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
88d0: 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73  ribes.** the res
88e0: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20  ult set of that 
88f0: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65  SELECT..*/.Table
8900: 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53   *sqlite3ResultS
8910: 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65  etOfSelect(Parse
8920: 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 2a   *pParse, char *
8930: 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74  zTabName, Select
8940: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61   *pSelect){.  Ta
8950: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74  ble *pTab;.  int
8960: 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73   i, j;.  ExprLis
8970: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c  t *pEList;.  Col
8980: 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c  umn *aCol, *pCol
8990: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
89a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
89b0: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
89c0: 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63  >pPrior ) pSelec
89d0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
89e0: 69 6f 72 3b 0a 20 20 69 66 28 20 70 72 65 70 53  ior;.  if( prepS
89f0: 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65  electStmt(pParse
8a00: 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  , pSelect) ){.  
8a10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8a20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
8a30: 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
8a40: 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 20 29  e, pSelect, 0) )
8a50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
8a60: 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c    }.  pTab = sql
8a70: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
8a80: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
8a90: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
8aa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
8ab0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  n 0;.  }.  pTab-
8ac0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  >nRef = 1;.  pTa
8ad0: 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e  b->zName = zTabN
8ae0: 61 6d 65 20 3f 20 73 71 6c 69 74 65 33 44 62 53  ame ? sqlite3DbS
8af0: 74 72 44 75 70 28 64 62 2c 20 7a 54 61 62 4e 61  trDup(db, zTabNa
8b00: 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73  me) : 0;.  pELis
8b10: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
8b20: 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f  ist;.  pTab->nCo
8b30: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
8b40: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
8b50: 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70  b->nCol>0 );.  p
8b60: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c  Tab->aCol = aCol
8b70: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8b80: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
8b90: 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29  f(pTab->aCol[0])
8ba0: 2a 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20  *pTab->nCol);.  
8bb0: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
8bc0: 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ol; i<pTab->nCol
8bd0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
8be0: 20 20 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52      Expr *p, *pR
8bf0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
8c00: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  e;.    char *zNa
8c10: 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 61 6d  me;.    int nNam
8c20: 65 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  e;.    CollSeq *
8c30: 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 63  pColl;.    int c
8c40: 6e 74 3b 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74  nt;.    NameCont
8c50: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 0a 20 20  ext sNC;.    .  
8c60: 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72    /* Get an appr
8c70: 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72  opriate name for
8c80: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   the column.    
8c90: 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  */.    p = pELis
8ca0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
8cb0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
8cc0: 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  ight==0 || p->pR
8cd0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  ight->token.z==0
8ce0: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74   || p->pRight->t
8cf0: 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a  oken.z[0]!=0 );.
8d00: 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
8d10: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
8d20: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
8d30: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
8d40: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
8d50: 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
8d60: 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
8d70: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
8d80: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
8d90: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e  3DbStrDup(db, zN
8da0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ame);.    }else 
8db0: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  if( p->op==TK_DO
8dc0: 54 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T .             
8dd0: 20 26 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68   && (pR=p->pRigh
8de0: 74 29 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b  t)!=0 && pR->tok
8df0: 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65  en.z && pR->toke
8e00: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
8e10: 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f  /* For columns o
8e20: 66 20 74 68 65 20 66 72 6f 6d 20 41 2e 42 20 75  f the from A.B u
8e30: 73 65 20 42 20 61 73 20 74 68 65 20 6e 61 6d 65  se B as the name
8e40: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
8e50: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
8e60: 28 64 62 2c 20 22 25 54 22 2c 20 26 70 52 2d 3e  (db, "%T", &pR->
8e70: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  token);.    }els
8e80: 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20  e if( p->span.z 
8e90: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
8ea0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 73 65 20  ){.      /* Use 
8eb0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
8ec0: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
8ed0: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74  expression as it
8ee0: 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  s name */.      
8ef0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
8f00: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 54 22 2c  Printf(db, "%T",
8f10: 20 26 70 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20   &p->span);.    
8f20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
8f30: 49 66 20 61 6c 6c 20 65 6c 73 65 20 66 61 69 6c  If all else fail
8f40: 73 2c 20 6d 61 6b 65 20 75 70 20 61 20 6e 61 6d  s, make up a nam
8f50: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
8f60: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
8f70: 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  f(db, "column%d"
8f80: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  , i+1);.    }.  
8f90: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
8fa0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  (zName);.    if(
8fb0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
8fc0: 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
8fd0: 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
8fe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
8ff0: 65 74 65 54 61 62 6c 65 28 70 54 61 62 29 3b 0a  eteTable(pTab);.
9000: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
9010: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
9020: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
9030: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
9040: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
9050: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
9060: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69     ** append a i
9070: 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
9080: 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
9090: 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
90a0: 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d    */.    nName =
90b0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a   strlen(zName);.
90c0: 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b      for(j=cnt=0;
90d0: 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<i; j++){.    
90e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
90f0: 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  ICmp(aCol[j].zNa
9100: 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  me, zName)==0 ){
9110: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e  .        zName[n
9120: 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20  Name] = 0;.     
9130: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
9140: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
9150: 7a 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b  z:%d", zName, ++
9160: 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 20  cnt);.        j 
9170: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66  = -1;.        if
9180: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ( zName==0 ) bre
9190: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
91a0: 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  }.    pCol->zNam
91b0: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20  e = zName;..    
91c0: 2f 2a 20 47 65 74 20 74 68 65 20 74 79 70 65 6e  /* Get the typen
91d0: 61 6d 65 2c 20 74 79 70 65 20 61 66 66 69 6e 69  ame, type affini
91e0: 74 79 2c 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ty, and collatin
91f0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
9200: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  he.    ** column
9210: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d  ..    */.    mem
9220: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
9230: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73  eof(sNC));.    s
9240: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
9250: 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20  elect->pSrc;.   
9260: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
9270: 44 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c  DbStrDup(db, col
9280: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
9290: 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20   0, 0, 0));.    
92a0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a 54  pCol->zType = zT
92b0: 79 70 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  ype;.    pCol->a
92c0: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
92d0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29  3ExprAffinity(p)
92e0: 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
92f0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
9300: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
9310: 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
9320: 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
9330: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
9340: 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
9350: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
9360: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
9370: 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62  1;.  return pTab
9380: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  ;.}../*.** Prepa
9390: 72 65 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  re a SELECT stat
93a0: 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73  ement for proces
93b0: 73 69 6e 67 20 62 79 20 64 6f 69 6e 67 20 74 68  sing by doing th
93c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  e following.** t
93d0: 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  hings:.**.**    
93e0: 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
93f0: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
9400: 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
9410: 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
9420: 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
9430: 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
9440: 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
9450: 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
9460: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
9470: 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
9480: 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
9490: 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
94a0: 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
94b0: 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
94c0: 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
94d0: 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
94e0: 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
94f0: 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
9500: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
9510: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
9520: 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
9530: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
9540: 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
9550: 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
9560: 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
9570: 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
9580: 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
9590: 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
95a0: 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
95b0: 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
95c0: 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
95d0: 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
95e0: 70 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74  p the presistent
95f0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
9600: 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
9610: 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
9620: 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
9630: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
9640: 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74  use to accomodat
9650: 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  e the NATURAL ke
9660: 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20  yword.**        
9670: 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68   on joins and th
9680: 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
9690: 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a  lause of joins..
96a0: 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63  **.**    (4)  Sc
96b0: 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63  an the list of c
96c0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
96d0: 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74  sult set (pEList
96e0: 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20  ) looking.**    
96f0: 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63       for instanc
9700: 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70  es of the "*" op
9710: 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41  erator or the TA
9720: 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  BLE.* operator..
9730: 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f  **         If fo
9740: 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68  und, expand each
9750: 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79   "*" to be every
9760: 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79   column in every
9770: 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
9780: 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f    and TABLE.* to
9790: 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
97a0: 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a   in TABLE..**.**
97b0: 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63   Return 0 on suc
97c0: 63 65 73 73 2e 20 20 49 66 20 74 68 65 72 65 20  cess.  If there 
97d0: 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65  are problems, le
97e0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
97f0: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
9800: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  e and return non
9810: 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  -zero..*/.static
9820: 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53   int prepSelectS
9830: 74 6d 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  tmt(Parse *pPars
9840: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
9850: 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63   int i, j, k, rc
9860: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
9870: 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
9880: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72  t *pEList;.  str
9890: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
98a0: 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74   *pFrom;.  sqlit
98b0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
98c0: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30  >db;..  if( p==0
98d0: 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20 7c   || p->pSrc==0 |
98e0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
98f0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
9900: 20 31 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69   1;.  }.  pTabLi
9910: 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
9920: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
9930: 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  st;..  /* Make s
9940: 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ure cursor numbe
9950: 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
9960: 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74  igned to all ent
9970: 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65  ries in.  ** the
9980: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
9990: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
99a0: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ment..  */.  sql
99b0: 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
99c0: 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
99d0: 20 70 2d 3e 70 53 72 63 29 3b 0a 0a 20 20 2f 2a   p->pSrc);..  /*
99e0: 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74   Look up every t
99f0: 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  able named in th
9a00: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
9a10: 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66   the select.  If
9a20: 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f  .  ** an entry o
9a30: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
9a40: 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  e is a subquery 
9a50: 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62  instead of a tab
9a60: 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a  le or view,.  **
9a70: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74   then create a t
9a80: 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
9a90: 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63  tructure to desc
9aa0: 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72  ribe the subquer
9ab0: 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
9ac0: 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
9ad0: 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
9ae0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
9af0: 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
9b00: 20 2a 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20   *pTab;.    if( 
9b10: 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29  pFrom->pTab!=0 )
9b20: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
9b30: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c  statement has al
9b40: 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 61  ready been prepa
9b50: 72 65 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e  red.  There is n
9b60: 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20  o need.      ** 
9b70: 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a  to go further. *
9b80: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
9b90: 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65  i==0 );.      re
9ba0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
9bb0: 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61    if( pFrom->zNa
9bc0: 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  me==0 ){.#ifndef
9bd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
9be0: 51 55 45 52 59 0a 20 20 20 20 20 20 2f 2a 20 41  QUERY.      /* A
9bf0: 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
9c00: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
9c10: 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
9c20: 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
9c30: 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ->pSelect!=0 );.
9c40: 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
9c50: 3e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20  >zAlias==0 ){.  
9c60: 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c        pFrom->zAl
9c70: 69 61 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20  ias =.          
9c80: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
9c90: 62 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75  b, "sqlite_subqu
9ca0: 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a  ery_%p_", (void*
9cb0: 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29  )pFrom->pSelect)
9cc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9cd0: 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
9ce0: 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
9cf0: 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
9d00: 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71  ab = .        sq
9d10: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
9d20: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
9d30: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70 46  From->zAlias, pF
9d40: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  rom->pSelect);. 
9d50: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
9d60: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
9d70: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
9d80: 20 20 20 20 2f 2a 20 54 68 65 20 69 73 45 70 68      /* The isEph
9d90: 65 6d 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  em flag indicate
9da0: 73 20 74 68 61 74 20 74 68 65 20 54 61 62 6c 65  s that the Table
9db0: 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20 62   structure has b
9dc0: 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e  een.      ** dyn
9dd0: 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
9de0: 65 64 20 61 6e 64 20 6d 61 79 20 62 65 20 66 72  ed and may be fr
9df0: 65 65 64 20 61 74 20 61 6e 79 20 74 69 6d 65 2e  eed at any time.
9e00: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
9e10: 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54 61 62 20  ,.      ** pTab 
9e20: 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
9e30: 74 6f 20 61 20 70 65 72 73 69 73 74 65 6e 74 20  to a persistent 
9e40: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
9e50: 74 68 61 74 20 64 65 66 69 6e 65 73 0a 20 20 20  that defines.   
9e60: 20 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68     ** part of th
9e70: 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20  e schema. */.   
9e80: 20 20 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d     pTab->isEphem
9e90: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 1;.#endif.   
9ea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
9eb0: 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   An ordinary tab
9ec0: 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
9ed0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
9ee0: 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  se */.      asse
9ef0: 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
9f00: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  =0 );.      pFro
9f10: 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
9f20: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
9f30: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
9f40: 72 73 65 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  rse,pFrom->zName
9f50: 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73  ,pFrom->zDatabas
9f60: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  e);.      if( pT
9f70: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
9f80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
9f90: 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e   }.      pTab->n
9fa0: 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69  Ref++;.#if !defi
9fb0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9fc0: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
9fd0: 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  d (SQLITE_OMIT_V
9fe0: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
9ff0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
a000: 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61  lect || IsVirtua
a010: 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
a020: 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68     /* We reach h
a030: 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ere if the named
a040: 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c   table is a real
a050: 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20  ly a view */.   
a060: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
a070: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
a080: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
a090: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
a0a0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
a0b0: 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  }.        /* If 
a0c0: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d  pFrom->pSelect!=
a0d0: 30 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  0 it means we ar
a0e0: 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
a0f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77  .        ** view
a100: 20 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20   within a view. 
a110: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 72 75   The SELECT stru
a120: 63 74 75 72 65 20 68 61 73 20 61 6c 72 65 61 64  cture has alread
a130: 79 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a  y been.        *
a140: 2a 20 63 6f 70 69 65 64 20 62 79 20 74 68 65 20  * copied by the 
a150: 6f 75 74 65 72 20 76 69 65 77 20 73 6f 20 77 65  outer view so we
a160: 20 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f   can skip the co
a170: 70 79 20 73 74 65 70 20 68 65 72 65 0a 20 20 20  py step here.   
a180: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
a190: 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20  nner view..     
a1a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
a1b0: 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
a1c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
a1d0: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
a1e0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
a1f0: 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65  up(db, pTab->pSe
a200: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  lect);.        }
a210: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
a220: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
a230: 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20  Process NATURAL 
a240: 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e  keywords, and ON
a250: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
a260: 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a  es of joins..  *
a270: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50 72  /.  if( sqlitePr
a280: 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65  ocessJoin(pParse
a290: 2c 20 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , p) ) return 1;
a2a0: 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79  ..  /* For every
a2b0: 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73   "*" that occurs
a2c0: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
a2d0: 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ist, insert the 
a2e0: 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c  names of.  ** al
a2f0: 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
a300: 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f   tables.  And fo
a310: 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20  r every TABLE.* 
a320: 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
a330: 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c  .  ** of all col
a340: 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20  umns in TABLE.  
a350: 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72  The parser inser
a360: 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78  ted a special ex
a370: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69  pression.  ** wi
a380: 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70  th the TK_ALL op
a390: 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
a3a0: 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
a3b0: 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
a3c0: 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66  list..  ** The f
a3d0: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
a3e0: 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
a3f0: 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72   the TK_ALL expr
a400: 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61  essions and expa
a410: 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65  nd.  ** each one
a420: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
a430: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
a440: 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ll tables..  **.
a450: 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c    ** The first l
a460: 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20  oop just checks 
a470: 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
a480: 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72  are any "*" oper
a490: 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20  ators.  ** that 
a4a0: 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a  need expanding..
a4b0: 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
a4c0: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
a4d0: 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   k++){.    Expr 
a4e0: 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  *pE = pEList->a[
a4f0: 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
a500: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ( pE->op==TK_ALL
a510: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
a520: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
a530: 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26   && pE->pRight &
a540: 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
a550: 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20  ==TK_ALL.       
a560: 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26    && pE->pLeft &
a570: 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
a580: 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a  =TK_ID ) break;.
a590: 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20    }.  rc = 0;.  
a5a0: 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
a5b0: 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  xpr ){.    /*.  
a5c0: 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68    ** If we get h
a5d0: 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ere it means the
a5e0: 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74   result set cont
a5f0: 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
a600: 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72   "*".    ** oper
a610: 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ators that need 
a620: 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20  to be expanded. 
a630: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
a640: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  ch expression.  
a650: 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
a660: 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e  lt set and expan
a670: 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e  d them one by on
a680: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
a690: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
a6a0: 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e  em *a = pEList->
a6b0: 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  a;.    ExprList 
a6c0: 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69  *pNew = 0;.    i
a6d0: 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73  nt flags = pPars
a6e0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20  e->db->flags;.  
a6f0: 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20    int longNames 
a700: 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
a710: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
a720: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
a730: 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61              (fla
a740: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
a750: 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a  tColNames)==0;..
a760: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
a770: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
a780: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
a790: 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b  pE = a[k].pExpr;
a7a0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
a7b0: 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20  p!=TK_ALL &&.   
a7c0: 20 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21          (pE->op!
a7d0: 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
a7e0: 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  Right==0 || pE->
a7f0: 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41  pRight->op!=TK_A
a800: 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  LL) ){.        /
a810: 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
a820: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
a830: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
a840: 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
a850: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
a860: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
a870: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
a880: 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  e, pNew, a[k].pE
a890: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
a8a0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
a8b0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
a8c0: 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  New->nExpr-1].zN
a8d0: 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65  ame = a[k].zName
a8e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
a8f0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
a900: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
a910: 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
a920: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b  = 0;.        a[k
a930: 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
a940: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a950: 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73    /* This expres
a960: 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72  sion is a "*" or
a970: 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64   a "TABLE.*" and
a980: 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
a990: 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64       ** expanded
a9a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
a9b0: 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20   tableSeen = 0; 
a9c0: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
a9d0: 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63   when TABLE matc
a9e0: 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  hes */.        c
a9f0: 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20  har *zTName;    
aa00: 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20          /* text 
aa10: 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
aa20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
aa30: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
aa40: 26 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  & pE->pLeft ){. 
aa50: 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
aa60: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
aa70: 6d 54 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d 3e  mToken(db, &pE->
aa80: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  pLeft->token);. 
aa90: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
aaa0: 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
aab0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
aac0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
aad0: 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
aae0: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
aaf0: 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
ab00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62  ){.          Tab
ab10: 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
ab20: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
ab30: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
ab40: 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73   = pFrom->zAlias
ab50: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
ab60: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  zTabName==0 || z
ab70: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b  TabName[0]==0 ){
ab80: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54   .            zT
ab90: 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
aba0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
abb0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
abc0: 7a 54 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e  zTName && (zTabN
abd0: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61  ame==0 || zTabNa
abe0: 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20  me[0]==0 || .   
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
ac00: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
ac10: 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
ac20: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
ac30: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
ac40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ac50: 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b    tableSeen = 1;
ac60: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
ac70: 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
ac80: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
ac90: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c      Expr *pExpr,
aca0: 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20   *pRight;.      
acb0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
acc0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
acd0: 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20  ].zName;..      
ace0: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f        /* If a co
acf0: 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61  lumn is marked a
ad00: 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72 72  s 'hidden' (curr
ad10: 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69  ently only possi
ad20: 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
ad30: 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74  ** for virtual t
ad40: 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69  ables), do not i
ad50: 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65  nclude it in the
ad60: 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20   expanded.      
ad70: 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d        ** result-
ad80: 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  set list..      
ad90: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
ada0: 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65       if( IsHidde
adb0: 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61  nColumn(&pTab->a
adc0: 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20  Col[j]) ){.     
add0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
ade0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29  IsVirtual(pTab))
adf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
ae00: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
ae10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
ae20: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a       if( i>0 ){.
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
ae40: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
ae50: 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62  m *pLeft = &pTab
ae60: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20  List->a[i-1];.  
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
ae80: 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79  (pLeft[1].jointy
ae90: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29  pe & JT_NATURAL)
aea0: 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  !=0 &&.         
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
aec0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74  olumnIndex(pLeft
aed0: 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d  ->pTab, zName)>=
aee0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
aef0: 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
af00: 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
af10: 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
af20: 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
af30: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
af40: 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
af50: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
af60: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
af70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
af80: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
af90: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
afa0: 65 78 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73 69  ex(pLeft[1].pUsi
afb0: 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ng, zName)>=0 ){
afc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
afd0: 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69   /* In a join wi
afe0: 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73  th a USING claus
aff0: 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20  e, omit columns 
b000: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
b010: 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20         ** using 
b020: 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
b030: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
b040: 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ht. */.         
b050: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
b060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
b070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
b080: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
b090: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
b0a0: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b  TK_ID, 0, 0, 0);
b0b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
b0c0: 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65   pRight==0 ) bre
b0d0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
b0e0: 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70  setQuotedToken(p
b0f0: 50 61 72 73 65 2c 20 26 70 52 69 67 68 74 2d 3e  Parse, &pRight->
b100: 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20  token, zName);. 
b110: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
b120: 54 61 62 4e 61 6d 65 20 26 26 20 28 6c 6f 6e 67  TabName && (long
b130: 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73  Names || pTabLis
b140: 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20  t->nSrc>1) ){.  
b150: 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
b160: 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65   *pLeft = sqlite
b170: 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  3Expr(TK_ID, 0, 
b180: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
b190: 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
b1a0: 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c  ite3Expr(TK_DOT,
b1b0: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
b1c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
b1d0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
b1e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
b1f0: 20 20 20 20 20 20 73 65 74 51 75 6f 74 65 64 54        setQuotedT
b200: 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26 70 4c  oken(pParse, &pL
b210: 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62  eft->token, zTab
b220: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
b230: 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70       setToken(&p
b240: 45 78 70 72 2d 3e 73 70 61 6e 2c 20 0a 20 20 20  Expr->span, .   
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
b260: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
b270: 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e  , "%s.%s", zTabN
b280: 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20  ame, zName));.  
b290: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
b2a0: 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b  r->span.dyn = 1;
b2b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
b2c0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  Expr->token.z = 
b2d0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
b2e0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20   pExpr->token.n 
b2f0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
b300: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
b310: 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dyn = 0;.       
b320: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b330: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
b340: 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
b350: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
b360: 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b  pan = pExpr->tok
b370: 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  en;.            
b380: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79    pExpr->span.dy
b390: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
b3a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
b3b0: 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
b3c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b3d0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
b3e0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
b3f0: 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72  rse, pNew, pExpr
b400: 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b  , &pExpr->span);
b410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
b420: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
b430: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
b440: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
b450: 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78  Parse, pNew, pEx
b460: 70 72 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b  pr, &pRight->tok
b470: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
b480: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
b490: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b4a0: 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
b4b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
b4c0: 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20   zTName ){.     
b4d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
b4e0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
b4f0: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
b500: 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20  s", zTName);.   
b510: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
b520: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b530: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
b540: 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65  , "no tables spe
b550: 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  cified");.      
b560: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b570: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
b580: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
b590: 33 5f 66 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a  3_free(zTName);.
b5a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b5b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
b5c0: 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b  tDelete(pEList);
b5d0: 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  .    p->pEList =
b5e0: 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28   pNew;.  }.  if(
b5f0: 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d   p->pEList && p-
b600: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 53  >pEList->nExpr>S
b610: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
b620: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
b630: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
b640: 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
b650: 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  s in result set"
b660: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
b670: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
b680: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
b690: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  iled ){.    rc =
b6a0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
b6b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b6c0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
b6d0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
b6e0: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69  SELECT./*.** Thi
b6f0: 73 20 72 6f 75 74 69 6e 65 20 61 73 73 6f 63 69  s routine associ
b700: 61 74 65 73 20 65 6e 74 72 69 65 73 20 69 6e 20  ates entries in 
b710: 61 6e 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  an ORDER BY expr
b720: 65 73 73 69 6f 6e 20 6c 69 73 74 20 77 69 74 68  ession list with
b730: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  .** columns in a
b740: 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 65 61   result.  For ea
b750: 63 68 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  ch ORDER BY expr
b760: 65 73 73 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f  ession, the opco
b770: 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70  de of.** the top
b780: 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 63  -level node is c
b790: 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c  hanged to TK_COL
b7a0: 55 4d 4e 20 61 6e 64 20 74 68 65 20 69 43 6f 6c  UMN and the iCol
b7b0: 75 6d 6e 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  umn value of.** 
b7c0: 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f  the top-level no
b7d0: 64 65 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20  de is filled in 
b7e0: 77 69 74 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  with column numb
b7f0: 65 72 20 61 6e 64 20 74 68 65 20 69 54 61 62 6c  er and the iTabl
b800: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68  e.** value of th
b810: 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65  e top-level node
b820: 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
b830: 69 54 61 62 6c 65 20 70 61 72 61 6d 65 74 65 72  iTable parameter
b840: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
b850: 20 61 72 65 20 70 72 69 6f 72 20 53 45 4c 45 43   are prior SELEC
b860: 54 20 63 6c 61 75 73 65 73 2c 20 74 68 65 79 20  T clauses, they 
b870: 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 66 69  are processed fi
b880: 72 73 74 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a  rst.  A match.**
b890: 20 69 6e 20 61 6e 20 65 61 72 6c 69 65 72 20 53   in an earlier S
b8a0: 45 4c 45 43 54 20 74 61 6b 65 73 20 70 72 65 63  ELECT takes prec
b8b0: 65 64 65 6e 63 65 20 6f 76 65 72 20 61 20 6c 61  edence over a la
b8c0: 74 65 72 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a  ter SELECT..**.*
b8d0: 2a 20 41 6e 79 20 65 6e 74 72 79 20 74 68 61 74  * Any entry that
b8e0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
b8f0: 69 73 20 66 6c 61 67 67 65 64 20 61 73 20 61 6e  is flagged as an
b900: 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d   error.  The num
b910: 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
b920: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
b930: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63  .static int matc
b940: 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e  hOrderbyToColumn
b950: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b960: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  e,          /* A
b970: 20 70 6c 61 63 65 20 74 6f 20 6c 65 61 76 65 20   place to leave 
b980: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a  error messages *
b990: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
b9a0: 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d  ect,        /* M
b9b0: 61 74 63 68 20 74 6f 20 72 65 73 75 6c 74 20 63  atch to result c
b9c0: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 69 73 20 53  olumns of this S
b9d0: 45 4c 45 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c  ELECT */.  ExprL
b9e0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
b9f0: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
ba00: 42 59 20 76 61 6c 75 65 73 20 74 6f 20 6d 61 74  BY values to mat
ba10: 63 68 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d  ch against colum
ba20: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ns */.  int iTab
ba30: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
ba40: 2f 2a 20 49 6e 73 65 72 74 20 74 68 69 73 20 76  /* Insert this v
ba50: 61 6c 75 65 20 69 6e 20 69 54 61 62 6c 65 20 2a  alue in iTable *
ba60: 2f 0a 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70  /.  int mustComp
ba70: 6c 65 74 65 20 20 20 20 20 20 20 20 2f 2a 20 49  lete        /* I
ba80: 66 20 54 52 55 45 20 61 6c 6c 20 4f 52 44 45 52  f TRUE all ORDER
ba90: 20 42 59 73 20 6d 75 73 74 20 6d 61 74 63 68 20   BYs must match 
baa0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72  */.){.  int nErr
bab0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   = 0;.  int i, j
bac0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
bad0: 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
bae0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
baf0: 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  ;..  if( pSelect
bb00: 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d  ==0 || pOrderBy=
bb10: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
bb20: 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74   if( mustComplet
bb30: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
bb40: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
bb50: 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65  xpr; i++){ pOrde
bb60: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
bb70: 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20   0; }.  }.  if( 
bb80: 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70  prepSelectStmt(p
bb90: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20  Parse, pSelect) 
bba0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
bbb0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65  .  }.  if( pSele
bbc0: 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ct->pPrior ){.  
bbd0: 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65 72    if( matchOrder
bbe0: 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  byToColumn(pPars
bbf0: 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e, pSelect->pPri
bc00: 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69 54  or, pOrderBy, iT
bc10: 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  able, 0) ){.    
bc20: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
bc30: 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d  }.  }.  pEList =
bc40: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
bc50: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
bc60: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
bc70: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
bc80: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
bc90: 70 49 74 65 6d 3b 0a 20 20 20 20 45 78 70 72 20  pItem;.    Expr 
bca0: 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  *pE = pOrderBy->
bcb0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
bcc0: 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  int iCol = -1;. 
bcd0: 20 20 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 3b     char *zLabel;
bce0: 0a 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  ..    if( pOrder
bcf0: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20  By->a[i].done ) 
bd00: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
bd10: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
bd20: 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c  nteger(pE, &iCol
bd30: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
bd40: 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70  Col<=0 || iCol>p
bd50: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
bd60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
bd70: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
bd80: 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52            "ORDER
bd90: 20 42 59 20 70 6f 73 69 74 69 6f 6e 20 25 64 20   BY position %d 
bda0: 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65 65  should be betwee
bdb0: 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a 20 20 20  n 1 and %d",.   
bdc0: 20 20 20 20 20 20 20 69 43 6f 6c 2c 20 70 45 4c         iCol, pEL
bdd0: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
bde0: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
bdf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
be00: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 6d    }.      if( !m
be10: 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 20 63 6f  ustComplete ) co
be20: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 43  ntinue;.      iC
be30: 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ol--;.    }.    
be40: 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 28 7a  if( iCol<0 && (z
be50: 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 4e  Label = sqlite3N
be60: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
be70: 20 26 70 45 2d 3e 74 6f 6b 65 6e 29 29 21 3d 30   &pE->token))!=0
be80: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   ){.      for(j=
be90: 30 2c 20 70 49 74 65 6d 3d 70 45 4c 69 73 74 2d  0, pItem=pEList-
bea0: 3e 61 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45  >a; j<pEList->nE
beb0: 78 70 72 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; j++, pItem+
bec0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
bed0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20   *zName;.       
bee0: 20 69 6e 74 20 69 73 4d 61 74 63 68 3b 0a 20 20   int isMatch;.  
bef0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
bf00: 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
bf10: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
bf20: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
bf30: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
bf40: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
bf50: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bf60: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
bf70: 6f 6b 65 6e 28 64 62 2c 20 26 70 49 74 65 6d 2d  oken(db, &pItem-
bf80: 3e 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a  >pExpr->token);.
bf90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bfa0: 20 20 69 73 4d 61 74 63 68 20 3d 20 7a 4e 61 6d    isMatch = zNam
bfb0: 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
bfc0: 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65  Cmp(zName, zLabe
bfd0: 6c 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 73  l)==0;.        s
bfe0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
bff0: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
c000: 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  isMatch ){.     
c010: 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20       iCol = j;. 
c020: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c030: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c040: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
c050: 66 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20  free(zLabel);.  
c060: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
c070: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 2d  >=0 ){.      pE-
c080: 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
c090: 0a 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75  .      pE->iColu
c0a0: 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  mn = iCol;.     
c0b0: 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54   pE->iTable = iT
c0c0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 2d 3e  able;.      pE->
c0d0: 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20  iAgg = -1;.     
c0e0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
c0f0: 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65  done = 1;.    }e
c100: 6c 73 65 20 69 66 28 20 6d 75 73 74 43 6f 6d 70  lse if( mustComp
c110: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71  lete ){.      sq
c120: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
c130: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 4f  arse,.        "O
c140: 52 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d  RDER BY term num
c150: 62 65 72 20 25 64 20 64 6f 65 73 20 6e 6f 74 20  ber %d does not 
c160: 6d 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74  match any result
c170: 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a   column", i+1);.
c180: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
c190: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c1a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45  .  }.  return nE
c1b0: 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  rr;  .}.#endif /
c1c0: 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
c1d0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
c1e0: 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
c1f0: 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
c200: 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
c210: 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
c220: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
c230: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
c240: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
c250: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
c260: 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
c270: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64  in pParse..*/.Vd
c280: 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64  be *sqlite3GetVd
c290: 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  be(Parse *pParse
c2a0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
c2b0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
c2c0: 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
c2d0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
c2e0: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  e = sqlite3VdbeC
c2f0: 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62  reate(pParse->db
c300: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
c310: 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  v;.}.../*.** Com
c320: 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20  pute the iLimit 
c330: 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c  and iOffset fiel
c340: 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ds of the SELECT
c350: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
c360: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
c370: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  set expressions.
c380: 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66    pLimit and pOf
c390: 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78  fset hold the ex
c3a0: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
c3b0: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
c3c0: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
c3d0: 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65  tement after the
c3e0: 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
c3f0: 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20  T.** keywords.  
c400: 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65  Or NULL if those
c410: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d   keywords are om
c420: 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e  itted. iLimit an
c430: 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72  d iOffset .** ar
c440: 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65  e the integer me
c450: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75  mory register nu
c460: 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65  mbers for counte
c470: 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  rs used to compu
c480: 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74  te .** the limit
c490: 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
c4a0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d   there is no lim
c4b0: 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74  it and/or offset
c4c0: 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69  , then .** iLimi
c4d0: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
c4e0: 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  e negative..**.*
c4f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
c500: 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
c510: 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20  s of iLimit and 
c520: 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a  iOffset only if.
c530: 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66  ** a limit or of
c540: 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20  fset is defined 
c550: 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  by pLimit and pO
c560: 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61  ffset.  iLimit a
c570: 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68  nd.** iOffset sh
c580: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
c590: 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72  reset to appropr
c5a0: 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c  iate default val
c5b0: 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20  ues.** (usually 
c5c0: 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d  but not always -
c5d0: 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  1) prior to call
c5e0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
c5f0: 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69  ..** Only if pLi
c600: 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65  mit!=0 or pOffse
c610: 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69  t!=0 do the limi
c620: 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a  t registers get.
c630: 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54  ** redefined.  T
c640: 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
c650: 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20  rator uses this 
c660: 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63  property to forc
c670: 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f  e.** the reuse o
c680: 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74  f the same limit
c690: 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69   and offset regi
c6a0: 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c  sters across mul
c6b0: 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20  tiple.** SELECT 
c6c0: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
c6d0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
c6e0: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
c6f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c700: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
c710: 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a  Break){.  Vdbe *
c720: 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69  v = 0;.  int iLi
c730: 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  mit = 0;.  int i
c740: 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64  Offset;.  int ad
c750: 64 72 31 2c 20 61 64 64 72 32 3b 0a 0a 20 20 2f  dr1, addr2;..  /
c760: 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d  * .  ** "LIMIT -
c770: 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20  1" always shows 
c780: 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65  all rows.  There
c790: 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f   is some.  ** co
c7a0: 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20  ntraversy about 
c7b0: 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  what the correct
c7c0: 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64   behavior should
c7d0: 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75   be..  ** The cu
c7e0: 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
c7f0: 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
c800: 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61  "LIMIT 0" to mea
c810: 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a  n.  ** no rows..
c820: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c    */.  if( p->pL
c830: 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69  imit ){.    p->i
c840: 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d  Limit = iLimit =
c850: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
c860: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
c870: 2b 3d 20 32 3b 0a 20 20 20 20 76 20 3d 20 73 71  += 2;.    v = sq
c880: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
c890: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
c8a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
c8b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c8c0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d  (pParse, p->pLim
c8d0: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
c8e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c8f0: 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29  MustBeInt, 0, 0)
c900: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c910: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
c920: 53 74 6f 72 65 2c 20 69 4c 69 6d 69 74 2c 20 31  Store, iLimit, 1
c930: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
c940: 6e 74 28 28 76 2c 20 22 23 20 4c 49 4d 49 54 20  nt((v, "# LIMIT 
c950: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
c960: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c970: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f  (v, OP_IfMemZero
c980: 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  , iLimit, iBreak
c990: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c9a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
c9b0: 6d 4c 6f 61 64 2c 20 69 4c 69 6d 69 74 2c 20 30  mLoad, iLimit, 0
c9c0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
c9d0: 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70  pOffset ){.    p
c9e0: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  ->iOffset = iOff
c9f0: 73 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  set = pParse->nM
ca00: 65 6d 2b 2b 3b 0a 20 20 20 20 76 20 3d 20 73 71  em++;.    v = sq
ca10: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
ca20: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
ca30: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
ca40: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
ca50: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66  (pParse, p->pOff
ca60: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
ca70: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ca80: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30  _MustBeInt, 0, 0
ca90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
caa0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
cab0: 6d 53 74 6f 72 65 2c 20 69 4f 66 66 73 65 74 2c  mStore, iOffset,
cac0: 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 29 3b 0a   p->pLimit==0);.
cad0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
cae0: 28 76 2c 20 22 23 20 4f 46 46 53 45 54 20 63 6f  (v, "# OFFSET co
caf0: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 61 64  unter"));.    ad
cb00: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
cb10: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d  eAddOp(v, OP_IfM
cb20: 65 6d 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20  emPos, iOffset, 
cb30: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
cb40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
cb50: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  op, 1, 0);.    s
cb60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
cb70: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
cb80: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
cb90: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
cba0: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 69 66 28   addr1);.    if(
cbb0: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
cbc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cbd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 2c 20  ddOp(v, OP_Add, 
cbe0: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
cbf0: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
cc00: 20 29 7b 0a 20 20 20 20 61 64 64 72 31 20 3d 20   ){.    addr1 = 
cc10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cc20: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c  (v, OP_IfMemPos,
cc30: 20 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20   iLimit, 0);.   
cc40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cc50: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
cc60: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
cc70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
cc80: 65 6d 49 6e 74 2c 20 2d 31 2c 20 69 4c 69 6d 69  emInt, -1, iLimi
cc90: 74 2b 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20  t+1);.    addr2 
cca0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ccb0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
ccc0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
ccd0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
cce0: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c   addr1);.    sql
ccf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cd00: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4c   OP_MemStore, iL
cd10: 69 6d 69 74 2b 31 2c 20 31 29 3b 0a 20 20 20 20  imit+1, 1);.    
cd20: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
cd30: 22 23 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  "# LIMIT+OFFSET"
cd40: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
cd50: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
cd60: 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ddr2);.  }.}../*
cd70: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 76  .** Allocate a v
cd80: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20  irtual index to 
cd90: 75 73 65 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e  use for sorting.
cda0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cdb0: 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64  createSortingInd
cdc0: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
cdd0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 45 78 70  , Select *p, Exp
cde0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 29  rList *pOrderBy)
cdf0: 7b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  {.  if( pOrderBy
ce00: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
ce10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
ce20: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
ce30: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 64 65  ==0 );.    pOrde
ce40: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  rBy->iECursor = 
ce50: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
ce60: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
ce70: 65 33 56 64 62 65 41 64 64 4f 70 28 70 50 61 72  e3VdbeAddOp(pPar
ce80: 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4f 70  se->pVdbe, OP_Op
ce90: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42           pOrderB
cec0: 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72  y->iECursor, pOr
ced0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 29 3b  derBy->nExpr+1);
cee0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
cef0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
cf00: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 70 2d 3e  == -1 );.    p->
cf10: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
cf20: 3d 20 61 64 64 72 3b 0a 20 20 7d 0a 7d 0a 0a 23  = addr;.  }.}..#
cf30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cf40: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
cf50: 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  CT./*.** Return 
cf60: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
cf70: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
cf80: 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d  ce for the iCol-
cf90: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  th column of.** 
cfa0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66  the result set f
cfb0: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d  or the compound-
cfc0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
cfd0: 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55   "p".  Return NU
cfe0: 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  LL if.** the col
cff0: 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75  umn has no defau
d000: 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  lt collating seq
d010: 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uence..**.** The
d020: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
d030: 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  nce for the comp
d040: 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74  ound select is t
d050: 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  aken from the.**
d060: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20   left-most term 
d070: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68  of the select th
d080: 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  at has a collati
d090: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
d0a0: 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a  static CollSeq *
d0b0: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
d0c0: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
d0d0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
d0e0: 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65   iCol){.  CollSe
d0f0: 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70  q *pRet;.  if( p
d100: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
d110: 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65  pRet = multiSele
d120: 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
d130: 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f  , p->pPrior, iCo
d140: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
d150: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20   pRet = 0;.  }. 
d160: 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a   if( pRet==0 ){.
d170: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
d180: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
d190: 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  arse, p->pEList-
d1a0: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b  >a[iCol].pExpr);
d1b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
d1c0: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  et;.}.#endif /* 
d1d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
d1e0: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
d1f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d200: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
d210: 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ECT./*.** This r
d220: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
d230: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75   to process a qu
d240: 65 72 79 20 74 68 61 74 20 69 73 20 72 65 61 6c  ery that is real
d250: 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20  ly the union.** 
d260: 6f 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  or intersection 
d270: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  of two or more s
d280: 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 2e  eparate queries.
d290: 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
d2a0: 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
d2b0: 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
d2c0: 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
d2d0: 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
d2e0: 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
d2f0: 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
d300: 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
d310: 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
d320: 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
d330: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
d340: 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
d350: 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
d360: 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
d370: 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
d380: 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
d390: 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
d3a0: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
d3b0: 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
d3c0: 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
d3d0: 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
d3e0: 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
d3f0: 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
d400: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
d410: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
d420: 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
d430: 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
d440: 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
d450: 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
d460: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
d470: 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
d480: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
d490: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
d4a0: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
d4b0: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
d4c0: 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
d4d0: 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
d4f0: 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
d500: 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
d510: 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
d520: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
d530: 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
d540: 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
d550: 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
d560: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
d570: 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
d580: 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
d590: 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
d5a0: 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
d5b0: 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
d5c0: 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
d5d0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
d5e0: 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
d5f0: 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
d600: 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
d610: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
d620: 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
d630: 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
d640: 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
d650: 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
d660: 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
d670: 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
d680: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d690: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
d6a0: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
d6b0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
d6c0: 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
d6d0: 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
d6e0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
d6f0: 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20  eDest,          
d700: 20 20 2f 2a 20 5c 5f 5f 5f 20 20 53 74 6f 72 65    /* \___  Store
d710: 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 61   query results a
d720: 73 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 20  s specified */. 
d730: 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20   int iParm,     
d740: 20 20 20 20 20 20 20 2f 2a 20 2f 20 20 20 20 20         /* /     
d750: 62 79 20 74 68 65 73 65 20 74 77 6f 20 70 61 72  by these two par
d760: 61 6d 65 74 65 72 73 2e 20 20 20 20 20 20 20 20  ameters.        
d770: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20   */.  char *aff 
d780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
d790: 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55  f eDest is SRT_U
d7a0: 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69  nion, the affini
d7b0: 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
d7c0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d7d0: 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65  E_OK;   /* Succe
d7e0: 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73  ss code from a s
d7f0: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53  ubroutine */.  S
d800: 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
d810: 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
d820: 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
d830: 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
d840: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
d850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
d860: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
d870: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
d880: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
d890: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d8a0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
d8b0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45  esult set */.  E
d8c0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
d8d0: 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y;   /* The ORDE
d8e0: 52 20 42 59 20 63 6c 61 75 73 65 20 6f 6e 20 70  R BY clause on p
d8f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 65 74 50 32   */.  int aSetP2
d900: 5b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  [2];        /* S
d910: 65 74 20 50 32 20 76 61 6c 75 65 20 6f 66 20 74  et P2 value of t
d920: 68 65 73 65 20 6f 70 20 74 6f 20 6e 75 6d 62 65  hese op to numbe
d930: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  r of columns */.
d940: 20 20 69 6e 74 20 6e 53 65 74 50 32 20 3d 20 30    int nSetP2 = 0
d950: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
d960: 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61 53  r of slots in aS
d970: 65 74 50 32 5b 5d 20 75 73 65 64 20 2a 2f 0a 0a  etP2[] used */..
d980: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
d990: 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
d9a0: 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61   BY or LIMIT cla
d9b0: 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c  use on prior SEL
d9c0: 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a  ECTs.  Only.  **
d9d0: 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74   the last (right
d9e0: 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e  -most) SELECT in
d9f0: 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
da00: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
da10: 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a   or LIMIT..  */.
da20: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d    if( p==0 || p-
da30: 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
da40: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
da50: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
da60: 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f  end;.  }.  pPrio
da70: 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
da80: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
da90: 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72  >pRightmost!=pPr
daa0: 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ior );.  assert(
dab0: 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
dac0: 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f  ost==p->pRightmo
dad0: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 50 72 69  st );.  if( pPri
dae0: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
daf0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
db00: 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45  Msg(pParse,"ORDE
db10: 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75  R BY clause shou
db20: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
db30: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
db40: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
db50: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
db60: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
db70: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
db80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f  .  }.  if( pPrio
db90: 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  r->pLimit ){.   
dba0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
dbb0: 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63  (pParse,"LIMIT c
dbc0: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
dbd0: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
dbe0: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
dbf0: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
dc00: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
dc10: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
dc20: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
dc30: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
dc40: 65 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 71  e have a valid q
dc50: 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66  uery engine.  If
dc60: 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e   not, create a n
dc70: 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76  ew one..  */.  v
dc80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
dc90: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
dca0: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20   v==0 ){.    rc 
dcb0: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
dcc0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
dcd0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65    }..  /* Create
dce0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
dcf0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
dd00: 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
dd10: 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
dd20: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
dd30: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
dd40: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 61 73 73  EList );.    ass
dd50: 65 72 74 28 20 6e 53 65 74 50 32 3c 73 69 7a 65  ert( nSetP2<size
dd60: 6f 66 28 61 53 65 74 50 32 29 2f 73 69 7a 65 6f  of(aSetP2)/sizeo
dd70: 66 28 61 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a  f(aSetP2[0]) );.
dd80: 20 20 20 20 61 53 65 74 50 32 5b 6e 53 65 74 50      aSetP2[nSetP
dd90: 32 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64  2++] = sqlite3Vd
dda0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
ddb0: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 50 61  enEphemeral, iPa
ddc0: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44 65 73  rm, 0);.    eDes
ddd0: 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
dde0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
ddf0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
de00: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
de10: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
de20: 0a 20 20 2a 2f 0a 20 20 70 4f 72 64 65 72 42 79  .  */.  pOrderBy
de30: 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
de40: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
de50: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
de60: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  LL: {.      if( 
de70: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
de80: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
de90: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 73 73  = 0;.        ass
dea0: 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c  ert( !pPrior->pL
deb0: 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20  imit );.        
dec0: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
ded0: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
dee0: 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66      pPrior->pOff
def0: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
df00: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
df10: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
df20: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65  rse, pPrior, eDe
df30: 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c  st, iParm, 0, 0,
df40: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
df50: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
df60: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  .        p->pOff
df70: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  set = 0;.       
df80: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
df90: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
dfa0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
dfb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
dfc0: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
dfd0: 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
dfe0: 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
dff0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  .        p->iOff
e000: 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f  set = pPrior->iO
e010: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69  ffset;.        i
e020: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20  f( p->iLimit>=0 
e030: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
e040: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
e050: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  ddOp(v, OP_IfMem
e060: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
e070: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56   0);.          V
e080: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
e090: 23 20 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20  # Jump ahead if 
e0a0: 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29  LIMIT reached"))
e0b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e0c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e0d0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
e0e0: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
e0f0: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
e100: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
e110: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
e120: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
e130: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
e140: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
e150: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e160: 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20  if( addr ){.    
e170: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e180: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
e190: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
e1a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e1b0: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f     }.      /* Fo
e1c0: 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20  r UNION ALL ... 
e1d0: 4f 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68  ORDER BY fall th
e1e0: 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
e1f0: 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  t case */.    }.
e200: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
e210: 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  PT:.    case TK_
e220: 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  UNION: {.      i
e230: 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20  nt unionTab;    
e240: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
e250: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
e260: 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  y table holding 
e270: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
e280: 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20 20 20  int op = 0;     
e290: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53   /* One of the S
e2a0: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  RT_ operations t
e2b0: 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20  o apply to self 
e2c0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69  */.      int pri
e2d0: 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  orOp;     /* The
e2e0: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20   SRT_ operation 
e2f0: 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f  to apply to prio
e300: 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20  r selects */.   
e310: 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
e320: 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61   *pOffset; /* Sa
e330: 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d  ved values of p-
e340: 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e  >nLimit and p->n
e350: 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  Offset */.      
e360: 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20  int addr;..     
e370: 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70   priorOp = p->op
e380: 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54  ==TK_ALL ? SRT_T
e390: 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e  able : SRT_Union
e3a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
e3b0: 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70 4f  t==priorOp && pO
e3c0: 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21 70 2d  rderBy==0 && !p-
e3d0: 3e 70 4c 69 6d 69 74 20 26 26 20 21 70 2d 3e 70  >pLimit && !p->p
e3e0: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
e3f0: 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73    /* We can reus
e400: 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  e a temporary ta
e410: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ble generated by
e420: 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72   a SELECT to our
e430: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68  .        ** righ
e440: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
e450: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
e460: 20 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65   iParm;.      }e
e470: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
e480: 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
e490: 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
e4a0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
e4b0: 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
e4c0: 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61     ** intermedia
e4d0: 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20  te results..    
e4e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
e4f0: 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65  nionTab = pParse
e500: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
e510: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
e520: 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  & matchOrderbyTo
e530: 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
e540: 2c 20 70 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f  , pOrderBy, unio
e550: 6e 54 61 62 2c 31 29 20 29 7b 0a 20 20 20 20 20  nTab,1) ){.     
e560: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
e570: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
e580: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
e590: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e5a0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
e5b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
e5c0: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69  enEphemeral, uni
e5d0: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
e5e0: 20 20 20 69 66 28 20 70 72 69 6f 72 4f 70 3d 3d     if( priorOp==
e5f0: 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20  SRT_Table ){.   
e600: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
e610: 53 65 74 50 32 3c 73 69 7a 65 6f 66 28 61 53 65  SetP2<sizeof(aSe
e620: 74 50 32 29 2f 73 69 7a 65 6f 66 28 61 53 65 74  tP2)/sizeof(aSet
e630: 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20  P2[0]) );.      
e640: 20 20 20 20 61 53 65 74 50 32 5b 6e 53 65 74 50      aSetP2[nSetP
e650: 32 2b 2b 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  2++] = addr;.   
e660: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e670: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
e680: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
e690: 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
e6a0: 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
e6b0: 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
e6c0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67           p->pRig
e6d0: 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d  htmost->usesEphm
e6e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
e6f0: 20 20 20 20 20 20 20 20 63 72 65 61 74 65 53 6f          createSo
e700: 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73  rtingIndex(pPars
e710: 65 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b  e, p, pOrderBy);
e720: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e730: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
e740: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
e750: 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
e760: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
e770: 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a  r left.      */.
e780: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
e790: 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
e7a0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
e7b0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
e7c0: 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 72 69 6f  se, pPrior, prio
e7d0: 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  rOp, unionTab, 0
e7e0: 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
e7f0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
e800: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
e810: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
e820: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
e830: 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
e840: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e850: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e860: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
e870: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
e880: 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20  K_EXCEPT:  op = 
e890: 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72  SRT_Except;   br
e8a0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61  eak;.         ca
e8b0: 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f  se TK_UNION:   o
e8c0: 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20  p = SRT_Union;  
e8d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
e8e0: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
e8f0: 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c     op = SRT_Tabl
e900: 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  e;    break;.   
e910: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
e920: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
e930: 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
e940: 0a 20 20 20 20 20 20 70 2d 3e 64 69 73 61 6c 6c  .      p->disall
e950: 6f 77 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  owOrderBy = pOrd
e960: 65 72 42 79 21 3d 30 3b 0a 20 20 20 20 20 20 70  erBy!=0;.      p
e970: 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
e980: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
e990: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
e9a0: 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
e9b0: 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
e9c0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
e9d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
e9e0: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70  ct(pParse, p, op
e9f0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30  , unionTab, 0, 0
ea00: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
ea10: 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65   /* Query flatte
ea20: 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53  ning in sqlite3S
ea30: 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65  elect() might re
ea40: 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79  fill p->pOrderBy
ea50: 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75  ..      ** Be su
ea60: 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e  re to delete p->
ea70: 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66  pOrderBy, theref
ea80: 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20  ore, to avoid a 
ea90: 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a  memory leak. */.
eaa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
eab0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  rListDelete(p->p
eac0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
ead0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
eae0: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  or;.      p->pOr
eaf0: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
eb00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
eb10: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69  xprDelete(p->pLi
eb20: 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
eb30: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
eb40: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
eb50: 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
eb60: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31    p->iLimit = -1
eb70: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
eb80: 65 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69  et = -1;.      i
eb90: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
eba0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
ebb0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
ebc0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
ebd0: 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
ebe0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
ebf0: 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
ec00: 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
ec10: 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
ec20: 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
ec30: 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20     */      .    
ec40: 20 20 69 66 28 20 65 44 65 73 74 21 3d 70 72 69    if( eDest!=pri
ec50: 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62  orOp || unionTab
ec60: 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20 20 20  !=iParm ){.     
ec70: 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
ec80: 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
ec90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
eca0: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
ecb0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
ecc0: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
ecd0: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
ece0: 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
ecf0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
ed00: 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
ed10: 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
ed20: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Prior;.         
ed30: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
ed40: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
ed50: 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
ed60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ed70: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
ed80: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
ed90: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
eda0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
edb0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
edc0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
edd0: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
ede0: 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
edf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ee00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
ee10: 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
ee20: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
ee30: 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
ee40: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
ee50: 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63  r(v);.        rc
ee60: 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f   = selectInnerLo
ee70: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
ee80: 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61  >pEList, unionTa
ee90: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  b, p->pEList->nE
eea0: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
eeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eec0: 20 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20    pOrderBy, -1, 
eed0: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20  eDest, iParm, . 
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e              iCon
ef00: 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20  t, iBreak, 0);. 
ef10: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
ef20: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
ef30: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  1;.          got
ef40: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
ef50: 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
ef60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ef70: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
ef80: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
ef90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
efa0: 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e  p(v, OP_Next, un
efb0: 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b  ionTab, iStart);
efc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
efd0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
efe0: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
eff0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f000: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
f010: 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
f020: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
f030: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f040: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
f050: 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  T: {.      int t
f060: 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20  ab1, tab2;.     
f070: 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
f080: 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
f090: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
f0a0: 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  *pOffset;.      
f0b0: 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20  int addr;..     
f0c0: 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73   /* INTERSECT is
f0d0: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
f0e0: 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65  the others since
f0f0: 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20   it requires.   
f100: 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72     ** two tempor
f110: 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e  ary tables.  Hen
f120: 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77  ce it has its ow
f130: 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20  n case.  Begin. 
f140: 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63       ** by alloc
f150: 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73  ating the tables
f160: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20   we will need.. 
f170: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61       */.      ta
f180: 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b1 = pParse->nTa
f190: 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20  b++;.      tab2 
f1a0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
f1b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
f1c0: 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64  erBy && matchOrd
f1d0: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61  erbyToColumn(pPa
f1e0: 72 73 65 2c 70 2c 70 4f 72 64 65 72 42 79 2c 74  rse,p,pOrderBy,t
f1f0: 61 62 31 2c 31 29 20 29 7b 0a 20 20 20 20 20 20  ab1,1) ){.      
f200: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
f210: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
f220: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
f230: 0a 20 20 20 20 20 20 63 72 65 61 74 65 53 6f 72  .      createSor
f240: 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65  tingIndex(pParse
f250: 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , p, pOrderBy);.
f260: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
f270: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f280: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
f290: 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
f2a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
f2b0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
f2c0: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
f2d0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
f2e0: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
f2f0: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73  ->pRightmost->us
f300: 65 73 45 70 68 6d 20 3d 20 31 3b 0a 20 20 20 20  esEphm = 1;.    
f310: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
f320: 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
f330: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
f340: 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
f350: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
f360: 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
f370: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
f380: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
f390: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 53 52 54  rse, pPrior, SRT
f3a0: 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c  _Union, tab1, 0,
f3b0: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
f3c0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
f3d0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
f3e0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
f3f0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
f400: 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
f410: 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
f420: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
f430: 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
f440: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
f450: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
f460: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
f470: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b2, 0);.      as
f480: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
f490: 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29  nEphm[1] == -1 )
f4a0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
f4b0: 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64  penEphm[1] = add
f4c0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
f4d0: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
f4e0: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
f4f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
f500: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
f510: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
f520: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
f530: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  set = 0;.      r
f540: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
f550: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54  t(pParse, p, SRT
f560: 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c  _Union, tab2, 0,
f570: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
f580: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
f590: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  Prior;.      sql
f5a0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
f5b0: 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
f5c0: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
f5d0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
f5e0: 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
f5f0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
f600: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
f610: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
f620: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
f630: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
f640: 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
f650: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
f660: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
f670: 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
f680: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
f690: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
f6a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
f6b0: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
f6c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65   ){.        Sele
f6d0: 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
f6e0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
f6f0: 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
f700: 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
f710: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
f720: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
f730: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
f740: 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
f750: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f760: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
f770: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
f780: 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
f790: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
f7a0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
f7b0: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
f7c0: 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
f7d0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
f7e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f7f0: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62  , OP_Rewind, tab
f800: 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  1, iBreak);.    
f810: 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
f820: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f830: 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20  P_RowKey, tab1, 
f840: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
f850: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f860: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
f870: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72   iCont);.      r
f880: 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  c = selectInnerL
f890: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
f8a0: 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20  ->pEList, tab1, 
f8b0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
f8c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f8e0: 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65  OrderBy, -1, eDe
f8f0: 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20  st, iParm, .    
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f910: 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20           iCont, 
f920: 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20  iBreak, 0);.    
f930: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
f940: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
f950: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
f960: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
f970: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
f980: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
f990: 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
f9a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f9b0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74  Op(v, OP_Next, t
f9c0: 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  ab1, iStart);.  
f9d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
f9e0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
f9f0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
fa00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fa10: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
fa20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
fa30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fa40: 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20  OP_Close, tab1, 
fa50: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
fa60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
fa70: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53   Make sure all S
fa80: 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74  ELECTs in the st
fa90: 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65  atement have the
faa0: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
fab0: 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e  elements.  ** in
fac0: 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65   their result se
fad0: 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ts..  */.  asser
fae0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  t( p->pEList && 
faf0: 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29  pPrior->pEList )
fb00: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  ;.  if( p->pELis
fb10: 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72  t->nExpr!=pPrior
fb20: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
fb30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
fb40: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
fb50: 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c  SELECTs to the l
fb60: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66  eft and right of
fb70: 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20   %s".      " do 
fb80: 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  not have the sam
fb90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
fba0: 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c  lt columns", sel
fbb0: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
fbc0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
fbd0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
fbe0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
fbf0: 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62   /* Set the numb
fc00: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
fc10: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
fc20: 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20  s.  */.  nCol = 
fc30: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
fc40: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 65 74 50  ;.  while( nSetP
fc50: 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  2 ){.    sqlite3
fc60: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
fc70: 61 53 65 74 50 32 5b 2d 2d 6e 53 65 74 50 32 5d  aSetP2[--nSetP2]
fc80: 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20  , nCol);.  }..  
fc90: 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
fca0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
fcb0: 73 65 64 20 62 79 20 65 69 74 68 65 72 20 74 68  sed by either th
fcc0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
fcd0: 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e 79  e or.  ** by any
fce0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
fcf0: 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c  s needed to impl
fd00: 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75  ement the compou
fd10: 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20  nd select..  ** 
fd20: 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e  Attach the KeyIn
fd30: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
fd40: 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61  all temporary ta
fd50: 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74 68  bles.  Invoke th
fd60: 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20  e.  ** ORDER BY 
fd70: 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74 68  processing if th
fd80: 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
fd90: 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  BY clause..  **.
fda0: 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f    ** This sectio
fdb0: 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20  n is run by the 
fdc0: 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
fdd0: 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79  T statement only
fde0: 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74  ..  ** SELECT st
fdf0: 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  atements to the 
fe00: 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70  left always skip
fe10: 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65   this part.  The
fe20: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
fe30: 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c   SELECT might al
fe40: 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  so skip this par
fe50: 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f  t if it has no O
fe60: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
fe70: 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20  nd.  ** no temp 
fe80: 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69  tables are requi
fe90: 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  red..  */.  if( 
fea0: 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 75  pOrderBy || p->u
feb0: 73 65 73 45 70 68 6d 20 29 7b 0a 20 20 20 20 69  sesEphm ){.    i
fec0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
fed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fee0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
fef0: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
ff00: 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
ff10: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
ff20: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
ff30: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
ff40: 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff60: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
ff70: 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
ff80: 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
ff90: 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  int nKeyCol;    
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ffb0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
ffc0: 65 73 20 69 6e 20 70 4b 65 79 49 6e 66 6f 2d 3e  es in pKeyInfo->
ffd0: 61 43 6f 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f  aCol[] */.    Co
ffe0: 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
10000 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
10010 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
10020 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  ll[] */.    Coll
10030 53 65 71 20 2a 2a 61 43 6f 70 79 3b 20 20 20 20  Seq **aCopy;    
10040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
10050 6f 70 79 20 6f 66 20 70 4b 65 79 49 6e 66 6f 2d  opy of pKeyInfo-
10060 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 0a 20 20 20  >aColl[] */..   
10070 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
10080 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20  htmost==p );.   
10090 20 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20   nKeyCol = nCol 
100a0 2b 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70 4f  + (pOrderBy ? pO
100b0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20  rderBy->nExpr : 
100c0 30 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  0);.    pKeyInfo
100d0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
100e0 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
100f0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
10100 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
10110 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 4b 65 79  (*pKeyInfo)+nKey
10120 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  Col*(sizeof(Coll
10130 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20 20  Seq*) + 1));.   
10140 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29   if( !pKeyInfo )
10150 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
10160 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
10170 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
10180 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20  ct_end;.    }.. 
10190 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63     pKeyInfo->enc
101a0 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
101b0 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  b);.    pKeyInfo
101c0 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b  ->nField = nCol;
101d0 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61  ..    for(i=0, a
101e0 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  pColl=pKeyInfo->
101f0 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69  aColl; i<nCol; i
10200 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20  ++, apColl++){. 
10210 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d       *apColl = m
10220 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
10230 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
10240 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61  .      if( 0==*a
10250 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
10260 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73   *apColl = pPars
10270 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
10280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10290 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
102a0 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
102b0 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
102c0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
102d0 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
102e0 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
102f0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
10300 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
10310 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
10320 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
10330 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
10340 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
10350 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
10360 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
10370 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
10380 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
10390 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
103a0 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
103b0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
103c0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
103d0 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
103e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
103f0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
10400 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
10410 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
10420 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10430 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
10440 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49  dr, (char*)pKeyI
10450 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29  nfo, P3_KEYINFO)
10460 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
10470 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
10480 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
10490 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
104a0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
104b0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
104c0 69 74 65 6d 20 2a 70 4f 54 65 72 6d 20 3d 20 70  item *pOTerm = p
104d0 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 20 20  OrderBy->a;.    
104e0 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 45 78    int nOrderByEx
104f0 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  pr = pOrderBy->n
10500 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Expr;.      int 
10510 61 64 64 72 3b 0a 20 20 20 20 20 20 75 38 20 2a  addr;.      u8 *
10520 70 53 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 20  pSortOrder;..   
10530 20 20 20 2f 2a 20 52 65 75 73 65 20 74 68 65 20     /* Reuse the 
10540 73 61 6d 65 20 70 4b 65 79 49 6e 66 6f 20 66 6f  same pKeyInfo fo
10550 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61  r the ORDER BY a
10560 73 20 77 61 73 20 75 73 65 64 20 61 62 6f 76 65  s was used above
10570 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68   for.      ** th
10580 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
10590 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 45  t statements.  E
105a0 78 63 65 70 74 20 77 65 20 68 61 76 65 20 74 6f  xcept we have to
105b0 20 63 68 61 6e 67 65 20 6f 75 74 20 74 68 65 0a   change out the.
105c0 20 20 20 20 20 20 2a 2a 20 70 4b 65 79 49 6e 66        ** pKeyInf
105d0 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65  o->aColl[] value
105e0 73 2e 20 20 53 6f 6d 65 20 6f 66 20 74 68 65 20  s.  Some of the 
105f0 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65 73 20 77  aColl[] values w
10600 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ill be.      ** 
10610 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f 6e 73  reused when cons
10620 74 72 75 63 74 69 6e 67 20 74 68 65 20 70 4b 65  tructing the pKe
10630 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 4f 52  yInfo for the OR
10640 44 45 52 20 42 59 2c 20 73 6f 20 6d 61 6b 65 0a  DER BY, so make.
10650 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79 2e        ** a copy.
10660 20 20 53 75 66 66 69 63 69 65 6e 74 20 73 70 61    Sufficient spa
10670 63 65 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20  ce to hold both 
10680 74 68 65 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73  the nCol entries
10690 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68   for.      ** th
106a0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
106b0 74 20 61 6e 64 20 74 68 65 20 6e 4f 72 64 65 72  t and the nOrder
106c0 62 79 45 78 70 72 20 65 6e 74 72 69 65 73 20 66  byExpr entries f
106d0 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  or the ORDER BY.
106e0 20 20 20 20 20 20 2a 2a 20 77 61 73 20 61 6c 6c        ** was all
106f0 6f 63 61 74 65 64 20 61 62 6f 76 65 2e 20 20 42  ocated above.  B
10700 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 6f  ut we need to mo
10710 76 65 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ve the compound 
10720 73 65 6c 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  select.      ** 
10730 65 6e 74 72 69 65 73 20 6f 75 74 20 6f 66 20 74  entries out of t
10740 68 65 20 77 61 79 20 62 65 66 6f 72 65 20 63 6f  he way before co
10750 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 4f  nstructing the O
10760 52 44 45 52 20 42 59 20 65 6e 74 72 69 65 73 2e  RDER BY entries.
10770 0a 20 20 20 20 20 20 2a 2a 20 4d 6f 76 65 20 74  .      ** Move t
10780 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
10790 63 74 20 65 6e 74 72 69 65 73 20 69 6e 74 6f 20  ct entries into 
107a0 61 43 6f 70 79 5b 5d 20 77 68 65 72 65 20 74 68  aCopy[] where th
107b0 65 79 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20  ey can be.      
107c0 2a 2a 20 61 63 63 65 73 73 65 64 20 61 6e 64 20  ** accessed and 
107d0 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f 6e 73  reused when cons
107e0 74 72 75 63 74 69 6e 67 20 74 68 65 20 4f 52 44  tructing the ORD
107f0 45 52 20 42 59 20 65 6e 74 72 69 65 73 2e 0a 20  ER BY entries.. 
10800 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
10810 6e 43 6f 6c 20 6d 69 67 68 74 20 62 65 20 67 72  nCol might be gr
10820 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 6c 65  eater than or le
10830 73 73 20 74 68 61 6e 20 6e 4f 72 64 65 72 42 79  ss than nOrderBy
10840 45 78 70 72 0a 20 20 20 20 20 20 2a 2a 20 77 65  Expr.      ** we
10850 20 68 61 76 65 20 74 6f 20 75 73 65 20 6d 65 6d   have to use mem
10860 6d 6f 76 65 28 29 20 77 68 65 6e 20 64 6f 69 6e  move() when doin
10870 67 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20 20  g the copy..    
10880 20 20 2a 2f 0a 20 20 20 20 20 20 61 43 6f 70 79    */.      aCopy
10890 20 3d 20 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43   = &pKeyInfo->aC
108a0 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 45 78 70 72  oll[nOrderByExpr
108b0 5d 3b 0a 20 20 20 20 20 20 70 53 6f 72 74 4f 72  ];.      pSortOr
108c0 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  der = pKeyInfo->
108d0 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
108e0 2a 29 26 61 43 6f 70 79 5b 6e 43 6f 6c 5d 3b 0a  *)&aCopy[nCol];.
108f0 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 61 43        memmove(aC
10900 6f 70 79 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  opy, pKeyInfo->a
10910 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73 69 7a 65 6f  Coll, nCol*sizeo
10920 66 28 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a 0a 20  f(CollSeq*));.. 
10930 20 20 20 20 20 61 70 43 6f 6c 6c 20 3d 20 70 4b       apColl = pK
10940 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a 20  eyInfo->aColl;. 
10950 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
10960 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 20 69 2b  nOrderByExpr; i+
10970 2b 2c 20 70 4f 54 65 72 6d 2b 2b 2c 20 61 70 43  +, pOTerm++, apC
10980 6f 6c 6c 2b 2b 2c 20 70 53 6f 72 74 4f 72 64 65  oll++, pSortOrde
10990 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  r++){.        Ex
109a0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 54 65  pr *pExpr = pOTe
109b0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
109c0 20 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e 66     if( (pExpr->f
109d0 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
109e0 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  late) ){.       
109f0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
10a00 2d 3e 70 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20  ->pColl!=0 );.  
10a10 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20          *apColl 
10a20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a  = pExpr->pColl;.
10a30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
10a40 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c           *apColl
10a50 20 3d 20 61 43 6f 70 79 5b 70 45 78 70 72 2d 3e   = aCopy[pExpr->
10a60 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20 20  iColumn];.      
10a70 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 53 6f    }.        *pSo
10a80 72 74 4f 72 64 65 72 20 3d 20 70 4f 54 65 72 6d  rtOrder = pOTerm
10a90 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
10aa0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
10ab0 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t( p->pRightmost
10ac0 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==p );.      ass
10ad0 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
10ae0 45 70 68 6d 5b 32 5d 3e 3d 30 20 29 3b 0a 20 20  Ephm[2]>=0 );.  
10af0 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 61 64      addr = p->ad
10b00 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3b 0a 20  drOpenEphm[2];. 
10b10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10b20 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
10b30 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  , p->pOrderBy->n
10b40 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 20 20 70  Expr+2);.      p
10b50 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
10b60 3d 20 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 0a  = nOrderByExpr;.
10b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10b80 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
10b90 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  r, (char*)pKeyIn
10ba0 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P3_KEYINFO_H
10bb0 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 70  ANDOFF);.      p
10bc0 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20  KeyInfo = 0;.   
10bd0 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
10be0 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76  ail(pParse, p, v
10bf0 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
10c00 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  pr, eDest, iParm
10c10 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  );.    }..    sq
10c20 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 49  lite3_free(pKeyI
10c30 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69  nfo);.  }..multi
10c40 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 72  _select_end:.  r
10c50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
10c60 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
10c70 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
10c80 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  T */..#ifndef SQ
10c90 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
10ca0 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72  * Forward Declar
10cb0 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
10cc0 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
10cd0 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78  ist(sqlite3*, Ex
10ce0 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78  prList*, int, Ex
10cf0 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63  prList*);.static
10d00 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
10d10 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65  t(sqlite3*, Sele
10d20 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ct *, int, ExprL
10d30 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ist *);../*.** S
10d40 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
10d50 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
10d60 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79  .  Replace every
10d70 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a   reference to.**
10d80 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
10d90 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65  le number iTable
10da0 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
10db0 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a  the iColumn-th.*
10dc0 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73  * entry in pELis
10dd0 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72  t.  (But leave r
10de0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
10df0 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a   ROWID column .*
10e00 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a  * unchanged.).**
10e10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10e20 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
10e30 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65  flattening proce
10e40 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72  dure.  A subquer
10e50 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c  y.** whose resul
10e60 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  t set is defined
10e70 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61   by pEList appea
10e80 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74  rs as entry in t
10e90 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  he.** FROM claus
10ea0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75  e of a SELECT su
10eb0 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45  ch that the VDBE
10ec0 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   cursor assigned
10ed0 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d   to that.** FORM
10ee0 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73   clause entry is
10ef0 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72   iTable.  This r
10f00 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20  outine make the 
10f10 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68  necessary .** ch
10f20 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73  anges to pExpr s
10f30 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73  o that it refers
10f40 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
10f50 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a   source table.**
10f60 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
10f70 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75   rather the resu
10f80 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75  lt set of the su
10f90 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
10fa0 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
10fb0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
10fc0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72          /* Repor
10fd0 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  t malloc errors 
10fe0 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  to this connecti
10ff0 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  on */.  Expr *pE
11000 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45  xpr,        /* E
11010 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62  xpr in which sub
11020 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73  stitution occurs
11030 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
11040 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ,         /* Tab
11050 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74  le to be substit
11060 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uted */.  ExprLi
11070 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
11080 20 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72   Substitute expr
11090 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  essions */.){.  
110a0 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
110b0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78  eturn;.  if( pEx
110c0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
110d0 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
110e0 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20  le==iTable ){.  
110f0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
11100 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
11110 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e  pExpr->op = TK_N
11120 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
11130 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
11140 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11150 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
11160 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69  pr->iColumn<pELi
11170 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
11180 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
11190 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
111a0 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26  xpr->pRight==0 &
111b0 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  & pExpr->pList==
111c0 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  0 );.      pNew 
111d0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  = pEList->a[pExp
111e0 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
111f0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
11200 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20   pNew!=0 );.    
11210 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e    pExpr->op = pN
11220 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73  ew->op;.      as
11230 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
11240 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ft==0 );.      p
11250 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71  Expr->pLeft = sq
11260 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
11270 20 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20   pNew->pLeft);. 
11280 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
11290 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
112a0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52  .      pExpr->pR
112b0 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
112c0 70 72 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e  prDup(db, pNew->
112d0 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61  pRight);.      a
112e0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
112f0 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
11300 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73  pExpr->pList = s
11310 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
11320 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 4c 69 73  p(db, pNew->pLis
11330 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  t);.      pExpr-
11340 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e  >iTable = pNew->
11350 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45  iTable;.      pE
11360 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 4e 65 77  xpr->pTab = pNew
11370 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 70 45  ->pTab;.      pE
11380 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  xpr->iColumn = p
11390 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  New->iColumn;.  
113a0 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
113b0 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20  = pNew->iAgg;.  
113c0 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
113d0 43 6f 70 79 28 64 62 2c 20 26 70 45 78 70 72 2d  Copy(db, &pExpr-
113e0 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74  >token, &pNew->t
113f0 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  oken);.      sql
11400 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62  ite3TokenCopy(db
11410 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20  , &pExpr->span, 
11420 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20  &pNew->span);.  
11430 20 20 20 20 70 45 78 70 72 2d 3e 70 53 65 6c 65      pExpr->pSele
11440 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
11450 63 74 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e  ctDup(db, pNew->
11460 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
11470 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70  pExpr->flags = p
11480 4e 65 77 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  New->flags;.    
11490 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
114a0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78  ubstExpr(db, pEx
114b0 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  pr->pLeft, iTabl
114c0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
114d0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45  substExpr(db, pE
114e0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61  xpr->pRight, iTa
114f0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
11500 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62    substSelect(db
11510 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
11520 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
11530 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
11540 4c 69 73 74 28 64 62 2c 20 70 45 78 70 72 2d 3e  List(db, pExpr->
11550 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  pList, iTable, p
11560 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
11570 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
11580 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74  xprList(.  sqlit
11590 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
115a0 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
115b0 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a   errors here */.
115c0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
115d0 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74  t,     /* List t
115e0 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68  o scan and in wh
115f0 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
11600 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74  titutes */.  int
11610 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
11620 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
11630 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a   substituted */.
11640 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
11650 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69  st     /* Substi
11660 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29  tute values */.)
11670 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
11680 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
11690 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
116a0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
116b0 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  ++){.    substEx
116c0 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  pr(db, pList->a[
116d0 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
116e0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
116f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
11700 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69  stSelect(.  sqli
11710 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
11720 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
11730 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f  c errors here */
11740 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
11750 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
11760 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77  T statement in w
11770 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
11780 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20  stitutions */.  
11790 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
117a0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
117b0 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a   be replaced */.
117c0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
117d0 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69  st     /* Substi
117e0 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29  tute values */.)
117f0 7b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  {.  if( !p ) ret
11800 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72  urn;.  substExpr
11810 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69  List(db, p->pELi
11820 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
11830 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
11840 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f  List(db, p->pGro
11850 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  upBy, iTable, pE
11860 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
11870 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f  prList(db, p->pO
11880 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20  rderBy, iTable, 
11890 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
118a0 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76  Expr(db, p->pHav
118b0 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ing, iTable, pEL
118c0 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
118d0 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  r(db, p->pWhere,
118e0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
118f0 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74 28  ;.  substSelect(
11900 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  db, p->pPrior, i
11910 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
11920 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
11930 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
11940 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 6e 64  _VIEW) */..#ifnd
11950 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
11960 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  IEW./*.** This r
11970 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
11980 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
11990 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74  eries in order t
119a0 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75  o speed.** execu
119b0 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e  tion.  It return
119c0 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
119d0 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
119e0 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a   no flattening.*
119f0 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  * occurs..**.** 
11a00 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  To understand th
11a10 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61  e concept of fla
11a20 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65  ttening, conside
11a30 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  r the following.
11a40 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  ** query:.**.** 
11a50 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
11a60 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53  M (SELECT x+y AS
11a70 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
11a80 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e   z<100) WHERE a>
11a90 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  5.**.** The defa
11aa0 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65  ult way of imple
11ab0 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65  menting this que
11ac0 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65  ry is to execute
11ad0 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79   the.** subquery
11ae0 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65   first and store
11af0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
11b00 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
11b10 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74  e, then.** run t
11b20 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f  he outer query o
11b30 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
11b40 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65   table.  This re
11b50 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61  quires two.** pa
11b60 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61  sses over the da
11b70 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ta.  Furthermore
11b80 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65  , because the te
11b90 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a  mporary table.**
11ba0 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c   has no indices,
11bb0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
11bc0 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e on the outer q
11bd0 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  uery cannot be.*
11be0 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a  * optimized..**.
11bf0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11c00 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72  attempts to rewr
11c10 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68  ite queries such
11c20 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e   as the above in
11c30 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66  to.** a single f
11c40 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65  lat select, like
11c50 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
11c60 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61   SELECT x+y AS a
11c70 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
11c80 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a  <100 AND a>5.**.
11c90 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
11ca0 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73  rated for this s
11cb0 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76  impification giv
11cc0 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  es the same resu
11cd0 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68  lt.** but only h
11ce0 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  as to scan the d
11cf0 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62  ata once.  And b
11d00 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d  ecause indices m
11d10 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f  ight .** exist o
11d20 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20  n the table t1, 
11d30 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20  a complete scan 
11d40 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68  of the data migh
11d50 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e  t be.** avoided.
11d60 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e  .**.** Flattenin
11d70 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  g is only attemp
11d80 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  ted if all of th
11d90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
11da0 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
11db0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
11dc0 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
11dd0 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
11de0 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a  use aggregates..
11df0 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65  **.**   (2)  The
11e00 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
11e10 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
11e20 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11e30 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
11e40 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65  **.**   (3)  The
11e50 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
11e60 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
11e70 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
11e80 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20  er join, or.**  
11e90 20 20 20 20 20 20 74 68 65 20 73 75 62 71 75 65        the subque
11ea0 72 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66  ry is not itself
11eb0 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65   a join.  (Ticke
11ec0 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20  t #306).**.**   
11ed0 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
11ee0 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
11ef0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
11f00 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
11f10 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20  in..**.**   (5) 
11f20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
11f30 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72   not DISTINCT or
11f40 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11f50 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
11f60 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
11f70 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20  es..**.**   (6) 
11f80 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
11f90 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
11fa0 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
11fb0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
11fc0 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
11fd0 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20  CT..**.**   (7) 
11fe0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61   The subquery ha
11ff0 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  s a FROM clause.
12000 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68  .**.**   (8)  Th
12010 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
12020 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
12030 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
12040 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
12050 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65  **.**   (9)  The
12060 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
12070 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
12080 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
12090 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
120a0 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65         aggregate
120b0 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20  s..**.**  (10)  
120c0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
120d0 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
120e0 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
120f0 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
12100 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c  .**        use L
12110 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31  IMIT..**.**  (11
12120 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
12130 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
12140 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
12150 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c  have ORDER BY cl
12160 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  auses..**.**  (1
12170 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
12180 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
12190 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
121a0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74   OUTER JOIN or t
121b0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  he.**        sub
121c0 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
121d0 52 45 20 63 6c 61 75 73 65 2e 20 20 28 61 64 64  RE clause.  (add
121e0 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35  ed by ticket #35
121f0 30 29 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20  0).**.**  (13)  
12200 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
12210 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
12220 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d  not both use LIM
12230 49 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20  IT.**.**  (14)  
12240 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
12250 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54  s not use OFFSET
12260 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68  .**.**  (15)  Th
12270 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
12280 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63   not part of a c
12290 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f  ompound select o
122a0 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  r the.**        
122b0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
122c0 74 20 68 61 76 65 20 62 6f 74 68 20 61 6e 20 4f  t have both an O
122d0 52 44 45 52 20 42 59 20 61 6e 64 20 61 20 4c 49  RDER BY and a LI
122e0 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20  MIT clause..**  
122f0 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65        (See ticke
12300 74 20 23 32 33 33 39 29 0a 2a 2a 0a 2a 2a 20 49  t #2339).**.** I
12310 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
12320 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
12330 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
12340 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
12350 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
12360 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
12370 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
12380 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
12390 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
123a0 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
123b0 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
123c0 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
123d0 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
123e0 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
123f0 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
12400 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
12410 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
12420 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
12430 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  ns 0..** If flat
12440 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
12450 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
12460 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
12470 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
12480 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
12490 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
124a0 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
124b0 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
124c0 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
124d0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
124e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
124f0 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
12500 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
12510 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
12520 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
12530 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
12540 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12550 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
12560 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12570 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
12580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
12590 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
125a0 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
125b0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
125c0 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
125d0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
125e0 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
125f0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
12600 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
12610 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
12620 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
12630 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
12640 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
12650 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  */.){.  Select *
12660 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54  pSub;       /* T
12670 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f  he inner query o
12680 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a  r "subquery" */.
12690 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
126a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
126b0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
126c0 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
126d0 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
126e0 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
126f0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
12700 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70  ubquery */.  Exp
12710 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
12720 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
12730 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  et of the outer 
12740 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
12750 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
12760 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
12770 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62  mber of the pSub
12780 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70   result set temp
12790 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
127a0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
127b0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
127c0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
127d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
127e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
127f0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
12800 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
12810 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20  em *pSubitem;   
12820 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
12830 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  */..  /* Check t
12840 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
12850 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
12860 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
12870 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ot..  */.  if( p
12880 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
12890 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
128a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
128b0 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
128c0 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
128d0 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
128e0 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
128f0 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
12900 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
12910 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
12920 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26  );.  if( isAgg &
12930 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
12940 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
12950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12960 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20  estriction (1)  
12970 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72  */.  if( subquer
12980 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e  yIsAgg && pSrc->
12990 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20  nSrc>1 ) return 
129a0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  0;          /* R
129b0 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20  estriction (2)  
129c0 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  */.  pSubSrc = p
129d0 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
129e0 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
129f0 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
12a00 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
12a10 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
12a20 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
12a30 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
12a40 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
12a50 79 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20  y expresssions, 
12a60 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20  we allowed some 
12a70 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d  combining of LIM
12a80 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
12a90 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20  ** because they 
12aa0 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  could be compute
12ab0 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
12ac0 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d  e.  But when LIM
12ad0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
12ae0 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72  ** became arbitr
12af0 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ary expressions,
12b00 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20   we were forced 
12b10 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69  to add restricti
12b20 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e  ons (13).  ** an
12b30 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28  d (14). */.  if(
12b40 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
12b50 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
12b60 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
12b70 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
12b80 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28  on (13) */.  if(
12b90 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29   pSub->pOffset )
12ba0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bc0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
12bd0 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28  on (14) */.  if(
12be0 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26   p->pRightmost &
12bf0 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  & pSub->pLimit &
12c00 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
12c10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
12c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12c50 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29  Restriction (15)
12c60 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
12c70 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29  ubSrc->nSrc==0 )
12c80 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
12c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ca0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
12cb0 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  (7)  */.  if( (p
12cc0 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  Sub->isDistinct 
12cd0 7c 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 29  || pSub->pLimit)
12ce0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70   .         && (p
12cf0 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69  Src->nSrc>1 || i
12d00 73 41 67 67 29 20 29 7b 20 20 20 20 20 20 20 20  sAgg) ){        
12d10 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
12d20 73 20 28 34 29 28 35 29 28 38 29 28 39 29 20 2a  s (4)(5)(8)(9) *
12d30 2f 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  /.     return 0;
12d40 20 20 20 20 20 20 20 0a 20 20 7d 0a 20 20 69 66         .  }.  if
12d50 28 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  ( p->isDistinct 
12d60 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
12d70 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
12d80 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
12d90 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 69 66  ion (6)  */.  if
12da0 28 20 28 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72  ( (p->disallowOr
12db0 64 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4f 72 64  derBy || p->pOrd
12dc0 65 72 42 79 29 20 26 26 20 70 53 75 62 2d 3e 70  erBy) && pSub->p
12dd0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
12de0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e10 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
12e20 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 0a  on (11) */.  }..
12e30 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
12e40 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71   3:  If the subq
12e50 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20  uery is a join, 
12e60 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
12e70 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20  bquery is .  ** 
12e80 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20  not used as the 
12e90 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
12ea0 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20   an outer join. 
12eb0 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79   Examples of why
12ec0 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f   this.  ** is no
12ed0 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
12ee0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
12ef0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
12f00 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a  (t2 JOIN t3).  *
12f10 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
12f20 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
12f30 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
12f40 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
12f50 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
12f60 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20  IN t2) JOIN t3. 
12f70 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69   **.  ** which i
12f80 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65  s not at all the
12f90 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a   same thing..  *
12fa0 2f 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d  /.  if( pSubSrc-
12fb0 3e 6e 53 72 63 3e 31 20 26 26 20 28 70 53 75 62  >nSrc>1 && (pSub
12fc0 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  item->jointype &
12fd0 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b   JT_OUTER)!=0 ){
12fe0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
12ff0 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63   }..  /* Restric
13000 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65  tion 12:  If the
13010 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
13020 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
13030 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20  f a left outer. 
13040 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73   ** join, make s
13050 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ure the subquery
13060 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   has no WHERE cl
13070 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78  ause..  ** An ex
13080 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
13090 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  is is not allowe
130a0 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
130b0 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
130c0 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20  ER JOIN (SELECT 
130d0 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  * FROM t2 WHERE 
130e0 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a  t2.x>0).  **.  *
130f0 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
13100 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
13110 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
13120 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
13130 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
13140 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20  ) WHERE t2.x>0. 
13150 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65   **.  ** But the
13160 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c   t2.x>0 test wil
13170 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e  l always fail on
13180 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74   a NULL row of t
13190 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66  2, which.  ** ef
131a0 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72  fectively conver
131b0 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49  ts the OUTER JOI
131c0 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20  N into an INNER 
131d0 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  JOIN..  */.  if(
131e0 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e   (pSubitem->join
131f0 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
13200 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 57 68  !=0 && pSub->pWh
13210 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ere!=0 ){.    re
13220 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
13230 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
13240 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
13250 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  ns flattening is
13260 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74   permitted for t
13270 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68  he.  ** iFrom-th
13280 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
13290 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65  OM clause in the
132a0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
132b0 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c  */..  /* Move al
132c0 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c  l of the FROM el
132d0 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75  ements of the su
132e0 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
132f0 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
13300 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
13310 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65  r query.  Before
13320 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d   doing this, rem
13330 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  ember.  ** the c
13340 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
13350 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75   the original ou
13360 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65  ter query FROM e
13370 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69  lement in.  ** i
13380 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61  Parent.  The iPa
13390 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c  rent cursor will
133a0 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20   never be used. 
133b0 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65   Subsequent code
133c0 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20  .  ** will scan 
133d0 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b  expressions look
133e0 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20  ing for iParent 
133f0 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72  references and r
13400 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73  eplace.  ** thos
13410 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  e references wit
13420 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  h expressions th
13430 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68  at resolve to th
13440 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a  e subquery FROM.
13450 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65    ** elements we
13460 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67   are now copying
13470 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72   in..  */.  iPar
13480 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ent = pSubitem->
13490 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20  iCursor;.  {.   
134a0 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20 70   int nSubSrc = p
134b0 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20  SubSrc->nSrc;.  
134c0 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
134d0 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74   pSubitem->joint
134e0 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ype;..    sqlite
134f0 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53 75  3DeleteTable(pSu
13500 62 69 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  bitem->pTab);.  
13510 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13520 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
13530 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
13540 5f 66 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e  _free(pSubitem->
13550 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
13560 74 65 33 5f 66 72 65 65 28 70 53 75 62 69 74 65  te3_free(pSubite
13570 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
13580 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b  if( nSubSrc>1 ){
13590 0a 20 20 20 20 20 20 69 6e 74 20 65 78 74 72 61  .      int extra
135a0 20 3d 20 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a   = nSubSrc - 1;.
135b0 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
135c0 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a  <nSubSrc; i++){.
135d0 20 20 20 20 20 20 20 20 70 53 72 63 20 3d 20 73          pSrc = s
135e0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
135f0 65 6e 64 28 64 62 2c 20 70 53 72 63 2c 20 30 2c  end(db, pSrc, 0,
13600 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
13610 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
13620 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  c;.      for(i=p
13630 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65  Src->nSrc-1; i-e
13640 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d  xtra>=iFrom; i--
13650 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d  ){.        pSrc-
13660 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b  >a[i] = pSrc->a[
13670 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20  i-extra];.      
13680 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
13690 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
136a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63  i++){.      pSrc
136b0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
136c0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
136d0 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
136e0 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
136f0 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
13700 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
13710 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
13720 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
13730 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  pe;.  }..  /* No
13740 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
13750 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
13760 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
13770 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72  ions for .  ** r
13780 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
13790 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
137a0 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
137b0 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  * .  ** Example:
137c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c  .  **.  **   SEL
137d0 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52  ECT a+5, b*10 FR
137e0 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41  OM (SELECT x*3 A
137f0 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46  S a, y+10 AS b F
13800 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e  ROM t1) WHERE a>
13810 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20 20  b;.  **   \     
13820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13830 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73  \_____________ s
13840 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  ubquery ________
13850 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20  __/          /. 
13860 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f   **    \________
13870 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
13880 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
13890 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
138a0 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20  ________/.  **. 
138b0 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
138c0 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
138d0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
138e0 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
138f0 63 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20 22  ce we see.  ** "
13900 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
13910 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
13920 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
13930 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
13940 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 70  "y+10"..  */.  p
13950 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
13960 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
13970 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
13980 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
13990 70 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  pr;.    if( pLis
139a0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
139b0 20 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69   && (pExpr = pLi
139c0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d  st->a[i].pExpr)-
139d0 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20  >span.z!=0 ){.  
139e0 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
139f0 7a 4e 61 6d 65 20 3d 20 0a 20 20 20 20 20 20 20  zName = .       
13a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
13a10 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
13a20 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c  *)pExpr->span.z,
13a30 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b   pExpr->span.n);
13a40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 75 62  .    }.  }.  sub
13a50 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
13a60 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
13a70 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
13a80 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  ;.  if( isAgg ){
13a90 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
13aa0 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  st(db, p->pGroup
13ab0 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
13ac0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
13ad0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
13ae0 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
13af0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
13b00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  ;.  }.  if( pSub
13b10 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
13b20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
13b30 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
13b40 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53  p->pOrderBy = pS
13b50 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
13b60 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
13b70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
13b80 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
13b90 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
13ba0 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  st(db, p->pOrder
13bb0 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
13bc0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  b->pEList);.  }.
13bd0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
13be0 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65  re ){.    pWhere
13bf0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
13c00 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65  p(db, pSub->pWhe
13c10 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  re);.  }else{.  
13c20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
13c30 7d 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  }.  if( subquery
13c40 49 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73  IsAgg ){.    ass
13c50 65 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d  ert( p->pHaving=
13c60 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  =0 );.    p->pHa
13c70 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65  ving = p->pWhere
13c80 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
13c90 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75  = pWhere;.    su
13ca0 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
13cb0 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
13cc0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
13cd0 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
13ce0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
13cf0 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  db, p->pHaving, 
13d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
13d30 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e  db, pSub->pHavin
13d40 67 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  g));.    assert(
13d50 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
13d60 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70  );.    p->pGroup
13d70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
13d80 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62  ListDup(db, pSub
13d90 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d  ->pGroupBy);.  }
13da0 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45  else{.    substE
13db0 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  xpr(db, p->pWher
13dc0 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  e, iParent, pSub
13dd0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  ->pEList);.    p
13de0 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
13df0 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 2d  e3ExprAnd(db, p-
13e00 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29  >pWhere, pWhere)
13e10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
13e20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
13e30 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65  is distinct if e
13e40 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
13e50 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65  or the.  ** oute
13e60 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
13e70 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e  nct. .  */.  p->
13e80 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
13e90 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53  isDistinct || pS
13ea0 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a  ub->isDistinct;.
13eb0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45 43  .  /*.  ** SELEC
13ec0 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45  T ... FROM (SELE
13ed0 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f  CT ... LIMIT a O
13ee0 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78  FFSET b) LIMIT x
13ef0 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 2a 2a 0a   OFFSET y;.  **.
13f00 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70    ** One is temp
13f10 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64  ted to try to ad
13f20 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d  d a and b to com
13f30 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e  bine the limits.
13f40 20 20 42 75 74 20 74 68 69 73 0a 20 20 2a 2a 20    But this.  ** 
13f50 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66  does not work if
13f60 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73   either limit is
13f70 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 2a 2f 0a   negative..  */.
13f80 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
13f90 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 69  it ){.    p->pLi
13fa0 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d  mit = pSub->pLim
13fb0 69 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4c  it;.    pSub->pL
13fc0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  imit = 0;.  }.. 
13fd0 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
13fe0 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
13ff0 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
14000 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
14010 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
14020 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
14030 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20 72  elete(pSub);.  r
14040 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
14050 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
14060 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VIEW */../*.** 
14070 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45  Analyze the SELE
14080 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  CT statement pas
14090 73 65 64 20 69 6e 20 61 73 20 61 6e 20 61 72 67  sed in as an arg
140a0 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20  ument to see if 
140b0 69 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c  it.** is a simpl
140c0 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
140d0 20 71 75 65 72 79 2e 20 20 49 66 20 69 74 20 69   query.  If it i
140e0 73 20 61 6e 64 20 74 68 69 73 20 71 75 65 72 79  s and this query
140f0 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73   can be.** satis
14100 66 69 65 64 20 75 73 69 6e 67 20 61 20 73 69 6e  fied using a sin
14110 67 6c 65 20 73 65 65 6b 20 74 6f 20 74 68 65 20  gle seek to the 
14120 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64  beginning or end
14130 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a   of an index,.**
14140 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20 74   then generate t
14150 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73  he code for this
14160 20 53 45 4c 45 43 54 20 61 6e 64 20 72 65 74 75   SELECT and retu
14170 72 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20 69  rn 1.  If this i
14180 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70  s not a .** simp
14190 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  le min() or max(
141a0 29 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72 65  ) query, then re
141b0 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20  turn 0;.**.** A 
141c0 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20  simply min() or 
141d0 6d 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b  max() query look
141e0 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
141f0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e  **    SELECT min
14200 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a  (a) FROM table;.
14210 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78  **    SELECT max
14220 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a  (a) FROM table;.
14230 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20  **.** The query 
14240 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61 20  may have only a 
14250 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
14260 69 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e  its FROM argumen
14270 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e  t.  There.** can
14280 20 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59 20   be no GROUP BY 
14290 6f 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48 45  or HAVING or WHE
142a0 52 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65  RE clauses.  The
142b0 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73 74   result set must
142c0 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28 29  .** be the min()
142d0 20 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20 73   or max() of a s
142e0 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
142f0 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  the table.  The 
14300 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65  column.** in the
14310 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
14320 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
14330 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20   indexed..**.** 
14340 54 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74  The parameters t
14350 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  o this routine a
14360 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 66  re the same as f
14370 6f 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  or sqlite3Select
14380 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68  ()..** See the h
14390 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
143a0 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f   that routine fo
143b0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
143c0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
143d0 74 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69  tic int simpleMi
143e0 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20  nMaxQuery(Parse 
143f0 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
14400 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  *p, int eDest, i
14410 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 45 78 70  nt iParm){.  Exp
14420 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74 20  r *pExpr;.  int 
14430 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iCol;.  Table *p
14440 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
14450 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a  dx;.  int base;.
14460 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
14470 20 73 65 65 6b 4f 70 3b 0a 20 20 45 78 70 72 4c   seekOp;.  ExprL
14480 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 2a 70 4c  ist *pEList, *pL
14490 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20 20 73 74  ist, eList;.  st
144a0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
144b0 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20  em eListItem;.  
144c0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
144d0 20 69 6e 74 20 62 72 6b 3b 0a 20 20 69 6e 74 20   int brk;.  int 
144e0 69 44 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  iDb;..  /* Check
144f0 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
14500 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c  query is a simpl
14510 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
14520 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a   query.  Return.
14530 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20    ** zero if it 
14540 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  is  not..  */.  
14550 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
14560 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c  || p->pHaving ||
14570 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
14580 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
14590 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70  p->pSrc;.  if( p
145a0 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
145b0 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73  eturn 0;.  pELis
145c0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
145d0 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
145e0 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
145f0 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69  ;.  pExpr = pELi
14600 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
14610 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
14620 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
14630 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
14640 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
14650 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  ist;.  if( pList
14660 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45  ==0 || pList->nE
14670 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
14680 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
14690 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74  token.n!=3 ) ret
146a0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  urn 0;.  if( sql
146b0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
146c0 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
146d0 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29  .z,"min",3)==0 )
146e0 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f  {.    seekOp = O
146f0 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73  P_Rewind;.  }els
14700 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
14710 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78  NICmp((char*)pEx
14720 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78  pr->token.z,"max
14730 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ",3)==0 ){.    s
14740 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b  eekOp = OP_Last;
14750 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
14760 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45  turn 0;.  }.  pE
14770 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30  xpr = pList->a[0
14780 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
14790 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
147a0 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
147b0 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e    iCol = pExpr->
147c0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20  iColumn;.  pTab 
147d0 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  = pSrc->a[0].pTa
147e0 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6f 70  b;..  /* This op
147f0 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f  timization canno
14800 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 76  t be used with v
14810 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 2a  irtual tables. *
14820 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
14830 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
14840 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   0;..  /* If we 
14850 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20  get to here, it 
14860 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79 20  means the query 
14870 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63  is of the correc
14880 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65  t form..  ** Che
14890 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
148a0 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78  we have an index
148b0 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70   and make pIdx p
148c0 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  oint to the.  **
148d0 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
148e0 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28  ex.  If the min(
148f0 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
14900 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
14910 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c  ARY.  ** key col
14920 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73  umn, no index is
14930 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73 65   necessary so se
14940 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20  t pIdx to NULL. 
14950 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62   If no.  ** usab
14960 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e  le index is foun
14970 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  d, return 0..  *
14980 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29  /.  if( iCol<0 )
14990 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a  {.    pIdx = 0;.
149a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f 6c    }else{.    Col
149b0 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
149c0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
149d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
149e0 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d  .    if( pColl==
149f0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
14a00 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
14a10 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
14a20 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
14a30 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14a40 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31  pIdx->nColumn>=1
14a50 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
14a60 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
14a70 3d 69 43 6f 6c 20 26 26 20 0a 20 20 20 20 20 20  =iCol && .      
14a80 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74      0==sqlite3St
14a90 72 49 43 6d 70 28 70 49 64 78 2d 3e 61 7a 43 6f  rICmp(pIdx->azCo
14aa0 6c 6c 5b 30 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  ll[0], pColl->zN
14ab0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
14ac0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
14ad0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64     }.    if( pId
14ae0 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  x==0 ) return 0;
14af0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  .  }..  /* Ident
14b00 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73  ify column types
14b10 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75   if we will be u
14b20 73 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63  sing the callbac
14b30 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74  k.  This.  ** st
14b40 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ep is skipped if
14b50 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67   the output is g
14b60 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20  oing to a table 
14b70 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  or a memory cell
14b80 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ..  ** The colum
14b90 6e 20 6e 61 6d 65 73 20 68 61 76 65 20 61 6c 72  n names have alr
14ba0 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61  eady been genera
14bb0 74 65 64 20 69 6e 20 74 68 65 20 63 61 6c 6c 69  ted in the calli
14bc0 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  ng function..  *
14bd0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
14be0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
14bf0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
14c00 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  urn 0;..  /* If 
14c10 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65  the output is de
14c20 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d  stined for a tem
14c30 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70  porary table, op
14c40 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20  en that table.. 
14c50 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
14c60 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
14c70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14c80 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
14c90 45 70 68 65 6d 65 72 61 6c 2c 20 69 50 61 72 6d  Ephemeral, iParm
14ca0 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 1);.  }..  /* 
14cb0 47 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20  Generating code 
14cc0 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 20  to find the min 
14cd0 6f 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61 73  or the max.  Bas
14ce0 69 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61  ically all we ha
14cf0 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73  ve.  ** to do is
14d00 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20   find the first 
14d10 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  or the last entr
14d20 79 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e 20  y in the chosen 
14d30 69 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20  index.  If.  ** 
14d40 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
14d50 28 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e 54  () is on the INT
14d60 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
14d70 2c 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65 20  , then find the 
14d80 66 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61  first.  ** or la
14d90 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
14da0 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  main table..  */
14db0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
14dc0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
14dd0 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
14de0 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65  pSchema);.  asse
14df0 72 74 28 20 69 44 62 3e 3d 30 20 7c 7c 20 70 54  rt( iDb>=0 || pT
14e00 61 62 2d 3e 69 73 45 70 68 65 6d 20 29 3b 0a 20  ab->isEphem );. 
14e10 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
14e20 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
14e30 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
14e40 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
14e50 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
14e60 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
14e70 65 29 3b 0a 20 20 62 61 73 65 20 3d 20 70 53 72  e);.  base = pSr
14e80 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b  c->a[0].iCursor;
14e90 0a 20 20 62 72 6b 20 3d 20 73 71 6c 69 74 65 33  .  brk = sqlite3
14ea0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14eb0 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
14ec0 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
14ed0 2c 20 70 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28  , p, brk);.  if(
14ee0 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c   pSrc->a[0].pSel
14ef0 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
14f00 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
14f10 50 61 72 73 65 2c 20 62 61 73 65 2c 20 69 44 62  Parse, base, iDb
14f20 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
14f30 65 61 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ead);.  }.  if( 
14f40 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pIdx==0 ){.    s
14f50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14f60 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c  v, seekOp, base,
14f70 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
14f80 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
14f90 20 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64   the cursor used
14fa0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 69 6e 64   to open the ind
14fb0 65 78 20 68 65 72 65 20 69 73 20 63 6c 6f 73 65  ex here is close
14fc0 64 0a 20 20 20 20 2a 2a 20 61 73 20 73 6f 6f 6e  d.    ** as soon
14fd0 20 61 73 20 61 20 73 69 6e 67 6c 65 20 76 61 6c   as a single val
14fe0 75 65 20 68 61 73 20 62 65 65 6e 20 72 65 61 64  ue has been read
14ff0 20 66 72 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63 61   from it, alloca
15000 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 75 73 69  te it.    ** usi
15010 6e 67 20 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  ng (pParse->nTab
15020 2b 2b 29 20 74 6f 20 70 72 65 76 65 6e 74 20 74  ++) to prevent t
15030 68 65 20 63 75 72 73 6f 72 20 69 64 20 66 72 6f  he cursor id fro
15040 6d 20 62 65 69 6e 67 20 0a 20 20 20 20 2a 2a 20  m being .    ** 
15050 72 65 75 73 65 64 2e 20 54 68 69 73 20 69 73 20  reused. This is 
15060 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20 73 74  important for st
15070 61 74 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  atements of the 
15080 66 6f 72 6d 20 0a 20 20 20 20 2a 2a 20 22 49 4e  form .    ** "IN
15090 53 45 52 54 20 49 4e 54 4f 20 78 20 53 45 4c 45  SERT INTO x SELE
150a0 43 54 20 6d 61 78 28 29 20 46 52 4f 4d 20 78 22  CT max() FROM x"
150b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
150c0 20 69 49 64 78 3b 0a 20 20 20 20 4b 65 79 49 6e   iIdx;.    KeyIn
150d0 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  fo *pKey = sqlit
150e0 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
150f0 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
15100 20 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d    iIdx = pParse-
15110 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 61 73 73  >nTab++;.    ass
15120 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65  ert( pIdx->pSche
15130 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
15140 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
15150 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15160 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29  Integer, iDb, 0)
15170 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15180 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  eOp3(v, OP_OpenR
15190 65 61 64 2c 20 69 49 64 78 2c 20 70 49 64 78 2d  ead, iIdx, pIdx-
151a0 3e 74 6e 75 6d 2c 20 0a 20 20 20 20 20 20 20 20  >tnum, .        
151b0 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 33 5f  (char*)pKey, P3_
151c0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
151d0 3b 0a 20 20 20 20 69 66 28 20 73 65 65 6b 4f 70  ;.    if( seekOp
151e0 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 7b 0a 20  ==OP_Rewind ){. 
151f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15200 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
15210 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
15220 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15230 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
15240 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
15250 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d 6f 76 65 47  eekOp = OP_MoveG
15260 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
15270 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
15280 72 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  r[0]==SQLITE_SO_
15290 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a  DESC ){.      /*
152a0 20 54 69 63 6b 65 74 20 23 32 35 31 34 3a 20 69   Ticket #2514: i
152b0 6e 76 65 72 74 20 74 68 65 20 73 65 65 6b 20 6f  nvert the seek o
152c0 70 65 72 61 74 6f 72 20 69 66 20 77 65 20 61 72  perator if we ar
152d0 65 20 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a  e using.      **
152e0 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
152f0 64 65 78 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  dex. */.      if
15300 28 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 4c 61 73  ( seekOp==OP_Las
15310 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65  t ){.        see
15320 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b  kOp = OP_Rewind;
15330 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15340 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
15350 65 6b 4f 70 3d 3d 4f 50 5f 4d 6f 76 65 47 74 20  ekOp==OP_MoveGt 
15360 29 3b 0a 20 20 20 20 20 20 20 20 73 65 65 6b 4f  );.        seekO
15370 70 20 3d 20 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20  p = OP_MoveLt;. 
15380 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15390 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
153a0 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64  p(v, seekOp, iId
153b0 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  x, 0);.    sqlit
153c0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
153d0 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
153e0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
153f0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15400 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29  _Close, iIdx, 0)
15410 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15420 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
15430 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  eGe, base, 0);. 
15440 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72   }.  eList.nExpr
15450 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 1;.  memset(&
15460 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69  eListItem, 0, si
15470 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29  zeof(eListItem))
15480 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65  ;.  eList.a = &e
15490 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73  ListItem;.  eLis
154a0 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70  t.a[0].pExpr = p
154b0 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e  Expr;.  selectIn
154c0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
154d0 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c  p, &eList, 0, 0,
154e0 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69   0, -1, eDest, i
154f0 50 61 72 6d 2c 20 62 72 6b 2c 20 62 72 6b 2c 20  Parm, brk, brk, 
15500 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
15510 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15520 20 62 72 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33   brk);.  sqlite3
15530 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15540 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b  Close, base, 0);
15550 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  .  .  return 1;.
15560 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
15570 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f 72   and ORDER BY or
15580 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
15590 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61   in a SELECT sta
155a0 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a  tement.  Return.
155b0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
155c0 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a   errors seen..**
155d0 0a 2a 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20  .** An ORDER BY 
155e0 6f 72 20 47 52 4f 55 50 20 42 59 20 69 73 20 61  or GROUP BY is a
155f0 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
15600 69 6f 6e 73 2e 20 20 49 66 20 61 6e 79 20 65 78  ions.  If any ex
15610 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61  pression.** is a
15620 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
15630 6e 74 2c 20 74 68 65 6e 20 74 68 61 74 20 65 78  nt, then that ex
15640 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 70 6c  pression is repl
15650 61 63 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63  aced by the.** c
15660 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e 74  orresponding ent
15670 72 79 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ry in the result
15680 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
15690 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65 72  int processOrder
156a0 47 72 6f 75 70 42 79 28 0a 20 20 4e 61 6d 65 43  GroupBy(.  NameC
156b0 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20  ontext *pNC,    
156c0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
156d0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
156e0 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 45  tatement. */.  E
156f0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
15700 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y,   /* The ORDE
15710 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
15720 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72   clause to be pr
15730 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ocessed */.  con
15740 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20  st char *zType  
15750 20 20 20 2f 2a 20 45 69 74 68 65 72 20 22 4f 52     /* Either "OR
15760 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 2c  DER" or "GROUP",
15770 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   as appropriate 
15780 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
15790 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
157a0 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b  t = pNC->pEList;
157b0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75       /* The resu
157c0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
157d0 4c 45 43 54 20 2a 2f 0a 20 20 50 61 72 73 65 20  LECT */.  Parse 
157e0 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
157f0 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 54 68  Parse;     /* Th
15800 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
15810 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  the SELECT */.  
15820 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 20 29  assert( pEList )
15830 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  ;..  if( pOrderB
15840 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y==0 ) return 0;
15850 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d  .  if( pOrderBy-
15860 3e 6e 45 78 70 72 3e 53 51 4c 49 54 45 5f 4d 41  >nExpr>SQLITE_MA
15870 58 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  X_COLUMN ){.    
15880 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15890 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
158a0 79 20 74 65 72 6d 73 20 69 6e 20 25 73 20 42 59  y terms in %s BY
158b0 20 63 6c 61 75 73 65 22 2c 20 7a 54 79 70 65 29   clause", zType)
158c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
158d0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
158e0 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
158f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
15900 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a  iCol;.    Expr *
15910 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
15920 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
15930 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
15940 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
15950 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l) ){.      if( 
15960 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d  iCol>0 && iCol<=
15970 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
15980 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
15990 20 2a 70 43 6f 6c 6c 20 3d 20 70 45 2d 3e 70 43   *pColl = pE->pC
159a0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  oll;.        int
159b0 20 66 6c 61 67 73 20 3d 20 70 45 2d 3e 66 6c 61   flags = pE->fla
159c0 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
159d0 74 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  te;.        sqli
159e0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45  te3ExprDelete(pE
159f0 29 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20  );.        pE = 
15a00 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
15a10 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 4c 69 73  Parse->db, pELis
15a20 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78  t->a[iCol-1].pEx
15a30 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  pr);.        pOr
15a40 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
15a50 72 20 3d 20 70 45 3b 0a 20 20 20 20 20 20 20 20  r = pE;.        
15a60 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 66 6c 61  if( pColl && fla
15a70 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
15a80 70 45 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c  pE->pColl = pCol
15a90 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 2d  l;.          pE-
15aa0 3e 66 6c 61 67 73 20 7c 3d 20 66 6c 61 67 73 3b  >flags |= flags;
15ab0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15ac0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15ad0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15ae0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
15af0 20 20 20 20 22 25 73 20 42 59 20 63 6f 6c 75 6d      "%s BY colum
15b00 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20  n number %d out 
15b10 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c  of range - shoul
15b20 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20  d be ".         
15b30 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64    "between 1 and
15b40 20 25 64 22 2c 20 7a 54 79 70 65 2c 20 69 43 6f   %d", zType, iCo
15b50 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l, pEList->nExpr
15b60 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
15b70 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
15b80 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
15b90 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
15ba0 65 73 28 70 4e 43 2c 20 70 45 29 20 29 7b 0a 20  es(pNC, pE) ){. 
15bb0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
15bc0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
15bd0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
15be0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c  is routine resol
15bf0 76 65 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73  ves any names us
15c00 65 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ed in the result
15c10 20 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73   set of the.** s
15c20 75 70 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73  upplied SELECT s
15c30 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65  tatement. If the
15c40 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15c50 74 20 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64  t being resolved
15c60 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c  .** is a sub-sel
15c70 65 63 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72  ect, then pOuter
15c80 4e 43 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  NC is a pointer 
15c90 74 6f 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65  to the NameConte
15ca0 78 74 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  xt .** of the pa
15cb0 72 65 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  rent SELECT..*/.
15cc0 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
15cd0 74 52 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73  tResolve(.  Pars
15ce0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
15cf0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
15d00 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
15d10 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
15d20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
15d30 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
15d40 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
15d50 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
15d60 65 72 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74  erNC  /* The out
15d70 65 72 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e  er name context.
15d80 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
15d90 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
15da0 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
15db0 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20   /* Result set. 
15dc0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15de0 2f 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69  /* For-loop vari
15df0 61 62 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c  able used in mul
15e00 74 69 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a  tiple places */.
15e10 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
15e20 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C;           /* 
15e30 4c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65  Local name-conte
15e40 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
15e50 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20   *pGroupBy;     
15e60 20 20 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20     /* The group 
15e70 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20  by clause */..  
15e80 2f 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  /* If this routi
15e90 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72  ne has run befor
15ea0 65 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  e, return immedi
15eb0 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20  ately. */.  if( 
15ec0 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b  p->isResolved ){
15ed0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 4f  .    assert( !pO
15ee0 75 74 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65  uterNC );.    re
15ef0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15f00 20 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c    }.  p->isResol
15f10 76 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49  ved = 1;..  /* I
15f20 66 20 74 68 65 72 65 20 68 61 76 65 20 61 6c 72  f there have alr
15f30 65 61 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73  eady been errors
15f40 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f  , do nothing. */
15f50 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
15f60 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  Err>0 ){.    ret
15f70 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
15f80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70  ;.  }..  /* Prep
15f90 61 72 65 20 74 68 65 20 73 65 6c 65 63 74 20 73  are the select s
15fa0 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63  tatement. This c
15fb0 61 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74  all will allocat
15fc0 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20  e all cursors.  
15fd0 2a 2a 20 72 65 71 75 69 72 65 64 20 74 6f 20 68  ** required to h
15fe0 61 6e 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73  andle the tables
15ff0 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
16000 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
16010 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  se..  */.  if( p
16020 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50  repSelectStmt(pP
16030 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
16040 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
16050 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ROR;.  }..  /* R
16060 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65  esolve the expre
16070 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49  ssions in the LI
16080 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
16090 6c 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20  lauses. These.  
160a0 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  ** are not allow
160b0 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61  ed to refer to a
160c0 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73  ny names, so pas
160d0 73 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43  s an empty NameC
160e0 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 6d  ontext..  */.  m
160f0 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
16100 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73  izeof(sNC));.  s
16110 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
16120 73 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se;.  if( sqlite
16130 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
16140 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69  s(&sNC, p->pLimi
16150 74 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69  t) ||.      sqli
16160 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
16170 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66  mes(&sNC, p->pOf
16180 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74  fset) ){.    ret
16190 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
161a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
161b0 75 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d  up the local nam
161c0 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73  e-context to pas
161d0 73 20 74 6f 20 45 78 70 72 52 65 73 6f 6c 76 65  s to ExprResolve
161e0 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a 20  Names() to.  ** 
161f0 72 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72  resolve the expr
16200 65 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a  ession-list..  *
16210 2f 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67  /.  sNC.allowAgg
16220 20 3d 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72 63   = 1;.  sNC.pSrc
16230 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
16240 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f    sNC.pNext = pO
16250 75 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 52 65  uterNC;..  /* Re
16260 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74  solve names in t
16270 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a  he result set. *
16280 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
16290 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 21 70  pEList;.  if( !p
162a0 45 4c 69 73 74 20 29 20 72 65 74 75 72 6e 20 53  EList ) return S
162b0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 66  QLITE_ERROR;.  f
162c0 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
162d0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
162e0 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45     Expr *pX = pE
162f0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
16300 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
16310 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
16320 73 28 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20  s(&sNC, pX) ){. 
16330 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16340 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
16350 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
16360 72 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67  re are no aggreg
16370 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ate functions in
16380 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c   the result-set,
16390 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59   and no GROUP BY
163a0 20 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f   .  ** expressio
163b0 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  n, do not allow 
163c0 61 67 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e  aggregates in an
163d0 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65  y of the other e
163e0 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
163f0 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69  .  assert( !p->i
16400 73 41 67 67 20 29 3b 0a 20 20 70 47 72 6f 75 70  sAgg );.  pGroup
16410 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
16420 3b 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79  ;.  if( pGroupBy
16430 20 7c 7c 20 73 4e 43 2e 68 61 73 41 67 67 20 29   || sNC.hasAgg )
16440 7b 0a 20 20 20 20 70 2d 3e 69 73 41 67 67 20 3d  {.    p->isAgg =
16450 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
16460 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20   sNC.allowAgg = 
16470 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
16480 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  a HAVING clause 
16490 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  is present, then
164a0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
164b0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
164c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
164d0 70 48 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f  pHaving && !pGro
164e0 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  upBy ){.    sqli
164f0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
16500 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20  se, "a GROUP BY 
16510 63 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72  clause is requir
16520 65 64 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47  ed before HAVING
16530 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ");.    return S
16540 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
16550 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65  ..  /* Add the e
16560 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
16570 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65  o the name-conte
16580 78 74 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e  xt before parsin
16590 67 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  g the.  ** other
165a0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
165b0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
165c0 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f  ment. This is so
165d0 20 74 68 61 74 0a 20 20 2a 2a 20 65 78 70 72 65   that.  ** expre
165e0 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48  ssions in the WH
165f0 45 52 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e  ERE clause (etc.
16600 29 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65  ) can refer to e
16610 78 70 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20  xpressions by.  
16620 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68  ** aliases in th
16630 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20  e result set..  
16640 2a 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f  **.  ** Minor po
16650 69 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73 20  int: If this is 
16660 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
16670 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  he expression wi
16680 6c 6c 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76  ll be.  ** re-ev
16690 61 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63 68  aluated for each
166a0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
166b0 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c  ..  */.  sNC.pEL
166c0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
166d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
166e0 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
166f0 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20  sNC, p->pWhere) 
16700 7c 7c 0a 20 20 20 20 20 73 71 6c 69 74 65 33 45  ||.     sqlite3E
16710 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
16720 26 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67  &sNC, p->pHaving
16730 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
16740 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
16750 7d 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  }.  if( p->pPrio
16760 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  r==0 ){.    if( 
16770 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75  processOrderGrou
16780 70 42 79 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 72  pBy(&sNC, p->pOr
16790 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 20  derBy, "ORDER") 
167a0 7c 7c 0a 20 20 20 20 20 20 20 20 70 72 6f 63 65  ||.        proce
167b0 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26  ssOrderGroupBy(&
167c0 73 4e 43 2c 20 70 47 72 6f 75 70 42 79 2c 20 22  sNC, pGroupBy, "
167d0 47 52 4f 55 50 22 29 20 29 7b 0a 20 20 20 20 20  GROUP") ){.     
167e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
167f0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
16800 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
16810 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
16820 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
16830 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
16840 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
16850 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
16860 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  use does not con
16870 74 61 69 6e 20 61 67 67 72 65 67 61 74 65 20 66  tain aggregate f
16880 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  unctions..  */. 
16890 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
168a0 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
168b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
168c0 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28 69 3d 30  ;.  .    for(i=0
168d0 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79  , pItem=pGroupBy
168e0 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d  ->a; i<pGroupBy-
168f0 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
16900 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
16910 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
16920 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 45  (pItem->pExpr, E
16930 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20  P_Agg) ){.      
16940 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16950 67 28 70 50 61 72 73 65 2c 20 22 61 67 67 72 65  g(pParse, "aggre
16960 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
16970 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69  re not allowed i
16980 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
16990 22 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c  "the GROUP BY cl
169a0 61 75 73 65 22 29 3b 0a 20 20 20 20 20 20 20 20  ause");.        
169b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
169c0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
169d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
169e0 74 68 69 73 20 69 73 20 6f 6e 65 20 53 45 4c 45  this is one SELE
169f0 43 54 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  CT of a compound
16a00 2c 20 62 65 20 73 75 72 65 20 74 6f 20 72 65 73  , be sure to res
16a10 6f 6c 76 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20  olve names.  ** 
16a20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 53 45 4c  in the other SEL
16a30 45 43 54 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ECTs..  */.  if(
16a40 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
16a50 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
16a60 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50  SelectResolve(pP
16a70 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
16a80 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 7d 65   pOuterNC);.  }e
16a90 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
16aa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
16ab0 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
16ac0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
16ad0 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
16ae0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
16af0 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
16b00 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
16b10 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
16b20 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
16b30 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
16b40 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
16b50 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
16b60 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f 72  tine simply stor
16b70 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20  es NULLs in all 
16b80 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20  of those memory 
16b90 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
16ba0 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
16bb0 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
16bc0 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
16bd0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
16be0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
16bf0 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
16c00 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
16c10 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66  unc *pFunc;.  if
16c20 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
16c30 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  c+pAggInfo->nCol
16c40 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  umn==0 ){.    re
16c50 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  turn;.  }.  for(
16c60 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
16c70 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
16c80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16c90 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75  ddOp(v, OP_MemNu
16ca0 6c 6c 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  ll, pAggInfo->aC
16cb0 6f 6c 5b 69 5d 2e 69 4d 65 6d 2c 20 30 29 3b 0a  ol[i].iMem, 0);.
16cc0 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d    }.  for(pFunc=
16cd0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
16ce0 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
16cf0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
16d00 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  unc++){.    sqli
16d10 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
16d20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 46 75 6e  OP_MemNull, pFun
16d30 63 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  c->iMem, 0);.   
16d40 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73   if( pFunc->iDis
16d50 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
16d60 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75    Expr *pE = pFu
16d70 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nc->pExpr;.     
16d80 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d   if( pE->pList==
16d90 30 20 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e  0 || pE->pList->
16da0 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
16db0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16dc0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53  Msg(pParse, "DIS
16dd0 54 49 4e 43 54 20 69 6e 20 61 67 67 72 65 67 61  TINCT in aggrega
16de0 74 65 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f  te must be follo
16df0 77 65 64 20 22 0a 20 20 20 20 20 20 20 20 20 20  wed ".          
16e00 20 22 62 79 20 61 6e 20 65 78 70 72 65 73 73 69   "by an expressi
16e10 6f 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46  on");.        pF
16e20 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  unc->iDistinct =
16e30 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
16e40 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  {.        KeyInf
16e50 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65  o *pKeyInfo = ke
16e60 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
16e70 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c  t(pParse, pE->pL
16e80 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ist);.        sq
16e90 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
16ea0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
16eb0 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  , pFunc->iDistin
16ec0 63 74 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  ct, 0, .        
16ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ee0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
16ef0 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P3_KEYINFO_HA
16f00 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a  NDOFF);.      }.
16f10 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
16f20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50  ** Invoke the OP
16f30 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63  _AggFinalize opc
16f40 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67  ode for every ag
16f50 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
16f60 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e  .** in the AggIn
16f70 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  fo structure..*/
16f80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e  .static void fin
16f90 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
16fa0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
16fb0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
16fc0 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
16fd0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
16fe0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
16ff0 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
17000 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  pF;.  for(i=0, p
17010 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
17020 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
17030 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
17040 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
17050 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
17060 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 73 71  r->pList;.    sq
17070 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
17080 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d  OP_AggFinal, pF-
17090 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70  >iMem, pList ? p
170a0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
170b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
170c0 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46         (void*)pF
170d0 2d 3e 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43  ->pFunc, P3_FUNC
170e0 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  DEF);.  }.}../*.
170f0 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63  ** Update the ac
17100 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79  cumulator memory
17110 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67   cells for an ag
17120 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e  gregate based on
17130 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
17140 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
17150 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17160 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
17170 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
17180 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
17190 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
171a0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
171b0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
171c0 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
171d0 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67  pF;.  struct Agg
171e0 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20  Info_col *pC;.. 
171f0 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
17200 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72  tMode = 1;.  for
17210 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
17220 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
17230 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
17240 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  , pF++){.    int
17250 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61   nArg;.    int a
17260 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ddrNext = 0;.   
17270 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
17280 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c   = pF->pExpr->pL
17290 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ist;.    if( pLi
172a0 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67  st ){.      nArg
172b0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
172c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
172d0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
172e0 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20  Parse, pList);. 
172f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17300 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  nArg = 0;.    }.
17310 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73      if( pF->iDis
17320 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
17330 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
17340 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
17350 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  l(v);.      asse
17360 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
17370 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63       codeDistinc
17380 74 28 76 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  t(v, pF->iDistin
17390 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 29  ct, addrNext, 1)
173a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
173b0 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43  pF->pFunc->needC
173c0 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ollSeq ){.      
173d0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
173e0 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   0;.      struct
173f0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
17400 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pItem;.      int
17410 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   j;.      assert
17420 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f  ( pList!=0 );  /
17430 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46  * pList!=0 if pF
17440 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c  ->pFunc->needCol
17450 6c 53 65 71 20 69 73 20 74 72 75 65 20 2a 2f 0a  lSeq is true */.
17460 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
17470 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
17480 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
17490 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
174a0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
174b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
174c0 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
174d0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
174e0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
174f0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
17500 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
17510 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
17520 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
17530 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
17540 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28  CollSeq, 0, 0, (
17550 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33  char *)pColl, P3
17560 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
17570 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17580 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op3(v, OP_AggSte
17590 70 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 6e 41 72  p, pF->iMem, nAr
175a0 67 2c 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46  g, (void*)pF->pF
175b0 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45 46 29  unc, P3_FUNCDEF)
175c0 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65  ;.    if( addrNe
175d0 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  xt ){.      sqli
175e0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
175f0 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29  bel(v, addrNext)
17600 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
17610 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
17620 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
17630 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
17640 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
17650 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
17660 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
17670 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69  pExpr);.    sqli
17680 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
17690 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 43 2d  OP_MemStore, pC-
176a0 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 20  >iMem, 1);.  }. 
176b0 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
176c0 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f  tMode = 0;.}.../
176d0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
176e0 64 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  de for the given
176f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
17700 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  t..**.** The res
17710 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62  ults are distrib
17720 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20  uted in various 
17730 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  ways depending o
17740 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  n the.** value o
17750 66 20 65 44 65 73 74 20 61 6e 64 20 69 50 61 72  f eDest and iPar
17760 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65  m..**.**     eDe
17770 73 74 20 56 61 6c 75 65 20 20 20 20 20 20 20 52  st Value       R
17780 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d  esult.**     ---
17790 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
177a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
177b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
177c0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
177d0 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20  SRT_Callback    
177e0 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62  Invoke the callb
177f0 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77  ack for each row
17800 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   of the result..
17810 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65  **.**     SRT_Me
17820 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20  m         Store 
17830 66 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20  first result in 
17840 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72  memory cell iPar
17850 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
17860 53 65 74 20 20 20 20 20 20 20 20 20 53 74 6f 72  Set         Stor
17870 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79  e results as key
17880 73 20 6f 66 20 74 61 62 6c 65 20 69 50 61 72 6d  s of table iParm
17890 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
178a0 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72  Union       Stor
178b0 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b  e results as a k
178c0 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ey in a temporar
178d0 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a  y table iParm.**
178e0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65  .**     SRT_Exce
178f0 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72  pt      Remove r
17900 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20  esults from the 
17910 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
17920 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
17930 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20   SRT_Table      
17940 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
17950 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
17960 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68  e iParm.**.** Th
17970 65 20 74 61 62 6c 65 20 61 62 6f 76 65 20 69 73  e table above is
17980 20 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64   incomplete.  Ad
17990 64 69 74 69 6f 6e 61 6c 20 65 44 69 73 74 20 76  ditional eDist v
179a0 61 6c 75 65 20 68 61 76 65 20 62 65 20 61 64 64  alue have be add
179b0 65 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69 73  ed.** since this
179c0 20 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72 69   comment was wri
179d0 74 74 65 6e 2e 20 20 53 65 65 20 74 68 65 20 73  tten.  See the s
179e0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29  electInnerLoop()
179f0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a   function for.**
17a00 20 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74   a complete list
17a10 69 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77  ing of the allow
17a20 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65  ed values of eDe
17a30 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61  st and their mea
17a40 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  nings..**.** Thi
17a50 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
17a60 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
17a70 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
17a80 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
17a90 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
17aa0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
17ab0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
17ac0 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
17ad0 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
17ae0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
17af0 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
17b00 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
17b10 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
17b20 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
17b30 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
17b40 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  o that..**.** Th
17b50 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e  e pParent, paren
17b60 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65  tTab, and *pPare
17b70 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61 72 65  ntAgg fields are
17b80 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68   filled in if th
17b90 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20  is.** SELECT is 
17ba0 61 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69  a subquery.  Thi
17bb0 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72  s routine may tr
17bc0 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69  y to combine thi
17bd0 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68  s SELECT.** with
17be0 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66   its parent to f
17bf0 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  orm a single fla
17c00 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20  t query.  In so 
17c10 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a  doing, it might.
17c20 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ** change the pa
17c30 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20  rent query from 
17c40 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  a non-aggregate 
17c50 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  to an aggregate 
17c60 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68  query..** For th
17c70 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70  at reason, the p
17c80 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69  ParentAgg flag i
17c90 73 20 70 61 73 73 65 64 20 61 73 20 61 20 70 6f  s passed as a po
17ca0 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20  inter, so it.** 
17cb0 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  can be changed..
17cc0 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a  **.** Example 1:
17cd0 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f     The meaning o
17ce0 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 61  f the pParent pa
17cf0 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  rameter..**.**  
17d00 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
17d10 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20  t1 JOIN (SELECT 
17d20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  x, count(*) FROM
17d30 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a   t2) JOIN t3;.**
17d40 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20      \           
17d50 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
17d60 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
17d70 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a  ____/        /.*
17d80 2a 20 20 20 20 20 5c 20 20 20 20 20 20 20 20 20  *     \         
17d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a               /.*
17dc0 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  *      \________
17dd0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
17de0 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
17df0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
17e00 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17e10 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74   is called for t
17e20 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 66  he outer query f
17e30 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74  irst.   For that
17e40 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e   call,.** pParen
17e50 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20  t will be NULL. 
17e60 20 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63   During the proc
17e70 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75  essing of the ou
17e80 74 65 72 20 71 75 65 72 79 2c 20 74 68 69 73 20  ter query, this 
17e90 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
17ea0 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
17eb0 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  y to handle the 
17ec0 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74  subquery.  For t
17ed0 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20  he recursive.** 
17ee0 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69  call, pParent wi
17ef0 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ll point to the 
17f00 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
17f10 63 61 75 73 65 20 74 68 65 20 73 75 62 71 75 65  cause the subque
17f20 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63  ry is.** the sec
17f30 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61  ond element in a
17f40 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c   three-way join,
17f50 20 74 68 65 20 70 61 72 65 6e 74 54 61 62 20 70   the parentTab p
17f60 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a  arameter will.**
17f70 20 62 65 20 31 20 28 74 68 65 20 32 6e 64 20 76   be 1 (the 2nd v
17f80 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65  alue of a 0-inde
17f90 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69  xed array.).*/.i
17fa0 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
17fb0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
17fc0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
17fd0 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
17fe0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18000 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
18010 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
18020 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  . */.  int eDest
18030 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
18040 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
18050 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  of the results *
18060 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20  /.  int iParm,  
18070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
18080 70 61 72 61 6d 65 74 65 72 20 75 73 65 64 20 62  parameter used b
18090 79 20 74 68 65 20 65 44 65 73 74 20 64 69 73 70  y the eDest disp
180a0 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
180b0 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74   Select *pParent
180c0 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ,       /* Anoth
180d0 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68  er SELECT for wh
180e0 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73 75  ich this is a su
180f0 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  b-query */.  int
18100 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20   parentTab,     
18110 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
18120 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66  pParent->pSrc of
18130 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20   this query */. 
18140 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67   int *pParentAgg
18150 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ,       /* True 
18160 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73 20  if pParent uses 
18170 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
18180 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ons */.  char *a
18190 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ff              
181a0 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53  /* If eDest is S
181b0 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66  RT_Union, the af
181c0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f  finity string */
181d0 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
181e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
181f0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
18200 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
18210 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74  Info;     /* Ret
18220 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  urn from sqlite3
18230 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a  WhereBegin() */.
18240 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
18250 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18260 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
18270 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
18280 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  on */.  int isAg
18290 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
182a0 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63  * True for selec
182b0 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f  t lists like "co
182c0 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70  unt(*)" */.  Exp
182d0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
182e0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63      /* List of c
182f0 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63  olumns to extrac
18300 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  t. */.  SrcList 
18310 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f  *pTabList;     /
18320 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
18330 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20   to select from 
18340 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
18350 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
18360 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
18370 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
18380 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
18390 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  derBy;    /* The
183a0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
183b0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
183c0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
183d0 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68  roupBy;    /* Th
183e0 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
183f0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
18400 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
18410 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng;         /* T
18420 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
18430 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
18440 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e  /.  int isDistin
18450 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ct;        /* Tr
18460 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
18470 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
18480 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64  esent */.  int d
18490 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
184a0 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73    /* Table to us
184b0 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
184c0 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  ct set */.  int 
184d0 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
184e0 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
184f0 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
18500 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  function */.  in
18510 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b  t addrSortIndex;
18520 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18530 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68  of an OP_OpenEph
18540 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
18550 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20  on */.  AggInfo 
18560 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f  sAggInfo;      /
18570 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73  * Information us
18580 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20  ed by aggregate 
18590 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74  queries */.  int
185a0 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   iEnd;          
185b0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
185c0 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
185d0 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69   query */.  sqli
185e0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
185f0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
18600 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
18610 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
18620 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  >db;.  if( p==0 
18630 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
18640 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
18650 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Err ){.    retur
18660 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
18670 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
18680 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
18690 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
186a0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
186b0 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20  mset(&sAggInfo, 
186c0 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e  0, sizeof(sAggIn
186d0 66 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  fo));..#ifndef S
186e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
186f0 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
18700 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20  If there is are 
18710 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75  a sequence of qu
18720 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61  eries, do the ea
18730 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74  rlier ones first
18740 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
18750 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
18760 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ( p->pRightmost=
18770 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  =0 ){.      Sele
18780 63 74 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 20  ct *pLoop;.     
18790 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
187a0 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
187b0 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
187c0 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74  oop->pPrior, cnt
187d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  ++){.        pLo
187e0 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d  op->pRightmost =
187f0 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   p;.      }.    
18800 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4d 41 58    if( SQLITE_MAX
18810 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
18820 3e 30 20 26 26 20 63 6e 74 3e 53 51 4c 49 54 45  >0 && cnt>SQLITE
18830 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
18840 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LECT ){.        
18850 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18860 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
18870 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f  y terms in compo
18880 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20  und SELECT");.  
18890 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
188a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
188b0 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
188c0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
188d0 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 61 66  eDest, iParm, af
188e0 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  f);.  }.#endif..
188f0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
18900 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  pOrderBy;.  if( 
18910 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
18920 28 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70  (eDest) ){.    p
18930 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
18940 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
18950 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70  3SelectResolve(p
18960 50 61 72 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a  Parse, p, 0) ){.
18970 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
18980 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f  end;.  }.  p->pO
18990 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
189a0 79 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f  y;..  /* Make lo
189b0 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68  cal copies of th
189c0 65 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72  e parameters for
189d0 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a   this query..  *
189e0 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  /.  pTabList = p
189f0 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65  ->pSrc;.  pWhere
18a00 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
18a10 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
18a20 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
18a30 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
18a40 20 20 69 73 41 67 67 20 3d 20 70 2d 3e 69 73 41    isAgg = p->isA
18a50 67 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74  gg;.  isDistinct
18a60 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
18a70 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
18a80 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
18a90 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73  List==0 ) goto s
18aa0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
18ab0 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76   .  ** Do not ev
18ac0 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65  en attempt to ge
18ad0 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20  nerate any code 
18ae0 69 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61  if we have alrea
18af0 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72  dy seen.  ** err
18b00 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69 73 20  ors before this 
18b10 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a  routine starts..
18b20 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
18b30 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f  e->nErr>0 ) goto
18b40 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
18b50 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f  /* If writing to
18b60 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72   memory or gener
18b70 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a  ating a set.  **
18b80 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63   only a single c
18b90 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74  olumn may be out
18ba0 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  put..  */.#ifnde
18bb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
18bc0 42 51 55 45 52 59 0a 20 20 69 66 28 20 63 68 65  BQUERY.  if( che
18bd0 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e  ckForMultiColumn
18be0 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  SelectError(pPar
18bf0 73 65 2c 20 65 44 65 73 74 2c 20 70 45 4c 69 73  se, eDest, pELis
18c00 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
18c10 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
18c20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
18c30 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20 69  /* ORDER BY is i
18c40 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20  gnored for some 
18c50 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20  destinations..  
18c60 2a 2f 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  */.  if( Ignorab
18c70 6c 65 4f 72 64 65 72 62 79 28 65 44 65 73 74 29  leOrderby(eDest)
18c80 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79   ){.    pOrderBy
18c90 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
18ca0 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
18cb0 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20   code..  */.  v 
18cc0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
18cd0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
18ce0 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  v==0 ) goto sele
18cf0 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 47 65  ct_end;..  /* Ge
18d00 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
18d10 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20  all sub-queries 
18d20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
18d30 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  se.  */.#if !def
18d40 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
18d50 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
18d60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
18d70 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69  IT_VIEW).  for(i
18d80 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
18d90 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
18da0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
18db0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
18dc0 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 52  0;.    int needR
18dd0 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 20  estoreContext;. 
18de0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
18df0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
18e00 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
18e10 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ..    if( pItem-
18e20 3e 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70  >pSelect==0 || p
18e30 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65  Item->isPopulate
18e40 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  d ) continue;.  
18e50 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61    if( pItem->zNa
18e60 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  me!=0 ){.      z
18e70 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
18e80 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
18e90 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 70  Context;.      p
18ea0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
18eb0 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61  ext = pItem->zNa
18ec0 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65  me;.      needRe
18ed0 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31  storeContext = 1
18ee0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18ef0 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f     needRestoreCo
18f00 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ntext = 0;.    }
18f10 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
18f20 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20  EXPR_DEPTH>0.   
18f30 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61   /* Increment Pa
18f40 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74  rse.nHeight by t
18f50 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  he height of the
18f60 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73   largest express
18f70 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20  ion.    ** tree 
18f80 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 74 68  refered to by th
18f90 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73  is, the parent s
18fa0 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64  elect. The child
18fb0 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d   select.    ** m
18fc0 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65  ay contain expre
18fd0 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61  ssion trees of a
18fe0 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53  t most.    ** (S
18ff0 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
19000 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67  EPTH-Parse.nHeig
19010 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73  ht) height. This
19020 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a   is a bit.    **
19030 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69   more conservati
19040 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72  ve than necessar
19050 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69  y, but much easi
19060 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e  er than enforcin
19070 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63  g.    ** an exac
19080 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a  t limit..    */.
19090 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
190a0 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65  ght += sqlite3Se
190b0 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
190c0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
190d0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
190e0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  se, pItem->pSele
190f0 63 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ct, SRT_EphemTab
19100 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
19110 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73      pItem->iCurs
19120 6f 72 2c 20 70 2c 20 69 2c 20 26 69 73 41 67 67  or, p, i, &isAgg
19130 2c 20 30 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  , 0);.#if SQLITE
19140 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
19150 30 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  0.    pParse->nH
19160 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33  eight -= sqlite3
19170 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
19180 28 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  (p);.#endif.    
19190 69 66 28 20 6e 65 65 64 52 65 73 74 6f 72 65 43  if( needRestoreC
191a0 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ontext ){.      
191b0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
191c0 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
191d0 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a  hContext;.    }.
191e0 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
191f0 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65  ->pSrc;.    pWhe
19200 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
19210 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62      if( !Ignorab
19220 6c 65 4f 72 64 65 72 62 79 28 65 44 65 73 74 29  leOrderby(eDest)
19230 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72   ){.      pOrder
19240 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
19250 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f  ;.    }.    pGro
19260 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
19270 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20  By;.    pHaving 
19280 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
19290 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70    isDistinct = p
192a0 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
192b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
192c0 68 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65  heck for the spe
192d0 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d  cial case of a m
192e0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75  in() or max() fu
192f0 6e 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66  nction by itself
19300 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  .  ** in the res
19310 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  ult set..  */.  
19320 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78  if( simpleMinMax
19330 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  Query(pParse, p,
19340 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29   eDest, iParm) )
19350 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20  {.    rc = 0;.  
19360 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
19370 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  d;.  }..  /* Che
19380 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ck to see if thi
19390 73 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  s is a subquery 
193a0 74 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61  that can be "fla
193b0 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73  ttened" into its
193c0 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66   parent..  ** If
193d0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
193e0 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20   possiblity, do 
193f0 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d  so and return im
19400 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a  mediately.  .  *
19410 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
19420 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28  _OMIT_VIEW.  if(
19430 20 70 50 61 72 65 6e 74 20 26 26 20 70 50 61 72   pParent && pPar
19440 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20 20  entAgg &&.      
19450 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
19460 64 62 2c 20 70 50 61 72 65 6e 74 2c 20 70 61 72  db, pParent, par
19470 65 6e 74 54 61 62 2c 20 2a 70 50 61 72 65 6e 74  entTab, *pParent
19480 41 67 67 2c 20 69 73 41 67 67 29 20 29 7b 0a 20  Agg, isAgg) ){. 
19490 20 20 20 69 66 28 20 69 73 41 67 67 20 29 20 2a     if( isAgg ) *
194a0 70 50 61 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a  pParentAgg = 1;.
194b0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
194c0 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  end;.  }.#endif.
194d0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
194e0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
194f0 61 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20  ause, then this 
19500 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  sorting.  ** ind
19510 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20  ex might end up 
19520 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20  being unused if 
19530 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20  the data can be 
19540 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20  .  ** extracted 
19550 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72  in pre-sorted or
19560 64 65 72 2e 20 20 49 66 20 74 68 61 74 20 69 73  der.  If that is
19570 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
19580 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e  the.  ** OP_Open
19590 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
195a0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68  ction will be ch
195b0 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e  anged to an OP_N
195c0 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65  oop once.  ** we
195d0 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74   figure out that
195e0 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
195f0 65 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64  ex is not needed
19600 2e 20 20 54 68 65 20 61 64 64 72 53 6f 72 74 49  .  The addrSortI
19610 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62  ndex.  ** variab
19620 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61  le is used to fa
19630 63 69 6c 69 74 61 74 65 20 74 68 61 74 20 63 68  cilitate that ch
19640 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ange..  */.  if(
19650 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
19660 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
19670 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72  fo;.    if( pPar
19680 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
19690 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
196a0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  d;.    }.    pKe
196b0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
196c0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
196d0 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  se, pOrderBy);. 
196e0 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
196f0 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
19700 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61  nTab++;.    p->a
19710 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
19720 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d   addrSortIndex =
19730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19740 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
19750 45 70 68 65 6d 65 72 61 6c 2c 20 70 4f 72 64 65  Ephemeral, pOrde
19760 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70  rBy->iECursor, p
19770 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32  OrderBy->nExpr+2
19780 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19790 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
197a0 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  yInfo, P3_KEYINF
197b0 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65  O_HANDOFF);.  }e
197c0 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72  lse{.    addrSor
197d0 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d  tIndex = -1;.  }
197e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
197f0 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
19800 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
19810 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
19820 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
19830 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  if( eDest==SRT_E
19840 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
19850 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
19860 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
19870 72 61 6c 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69  ral, iParm, pELi
19880 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a  st->nExpr);.  }.
19890 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69  .  /* Set the li
198a0 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45  miter..  */.  iE
198b0 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
198c0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
198d0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
198e0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
198f0 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70   iEnd);..  /* Op
19900 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  en a virtual ind
19910 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  ex to use for th
19920 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a  e distinct set..
19930 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73    */.  if( isDis
19940 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65 79  tinct ){.    Key
19950 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
19960 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70      distinct = p
19970 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
19980 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
19990 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
199a0 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  t(pParse, p->pEL
199b0 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
199c0 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f  3VdbeOp3(v, OP_O
199d0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 69  penEphemeral, di
199e0 73 74 69 6e 63 74 2c 20 30 2c 20 0a 20 20 20 20  stinct, 0, .    
199f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a00 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
19a10 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  nfo, P3_KEYINFO_
19a20 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73  HANDOFF);.  }els
19a30 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  e{.    distinct 
19a40 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
19a50 41 67 67 72 65 67 61 74 65 20 61 6e 64 20 6e 6f  Aggregate and no
19a60 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n-aggregate quer
19a70 69 65 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ies are handled 
19a80 64 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20  differently */. 
19a90 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70   if( !isAgg && p
19aa0 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
19ab0 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 69    /* This case i
19ac0 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67 72 65 67  s for non-aggreg
19ad0 61 74 65 20 71 75 65 72 69 65 73 0a 20 20 20 20  ate queries.    
19ae0 2a 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74  ** Begin the dat
19af0 61 62 61 73 65 20 73 63 61 6e 0a 20 20 20 20 2a  abase scan.    *
19b00 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73  /.    pWInfo = s
19b10 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
19b20 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
19b30 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4f 72 64  t, pWhere, &pOrd
19b40 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  erBy);.    if( p
19b50 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
19b60 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20  select_end;..   
19b70 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69   /* If sorting i
19b80 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63 72  ndex that was cr
19b90 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72  eated by a prior
19ba0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
19bb0 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  l .    ** instru
19bc0 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e  ction ended up n
19bd0 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c  ot being needed,
19be0 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65   then change the
19bf0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
19c00 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e  l.    ** into an
19c10 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f   OP_Noop..    */
19c20 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 6f 72  .    if( addrSor
19c30 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f 72  tIndex>=0 && pOr
19c40 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
19c50 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
19c60 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
19c70 72 53 6f 72 74 49 6e 64 65 78 2c 20 31 29 3b 0a  rSortIndex, 1);.
19c80 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
19c90 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20  nEphm[2] = -1;. 
19ca0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65     }..    /* Use
19cb0 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e   the standard in
19cc0 6e 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a  ner loop.    */.
19cd0 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e      if( selectIn
19ce0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
19cf0 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p, pEList, 0, 0,
19d00 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69   pOrderBy, disti
19d10 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20  nct, eDest,.    
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d30 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69  iParm, pWInfo->i
19d40 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f  Continue, pWInfo
19d50 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66 29 20 29  ->iBreak, aff) )
19d60 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  {.       goto se
19d70 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
19d80 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  .    /* End the 
19d90 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
19da0 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  op..    */.    s
19db0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
19dc0 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  WInfo);.  }else{
19dd0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
19de0 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66  the processing f
19df0 6f 72 20 61 67 67 72 65 67 61 74 65 20 71 75 65  or aggregate que
19e00 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65  ries */.    Name
19e10 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
19e20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
19e30 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61  for processing a
19e40 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61  ggregate informa
19e50 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tion */.    int 
19e60 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iAMem;          
19e70 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
19e80 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67  ress for storing
19e90 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
19ea0 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d  Y */.    int iBM
19eb0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
19ec0 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
19ed0 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47  s for previous G
19ee0 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
19ef0 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20  nt iUseFlag;    
19f00 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
19f10 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69  s holding flag i
19f20 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61  ndicating that a
19f30 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20  t least.        
19f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f50 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  ** one row of th
19f60 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61  e input to the a
19f70 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65  ggregator has be
19f80 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  en.             
19f90 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72             ** pr
19fa0 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69  ocessed */.    i
19fb0 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20  nt iAbortFlag;  
19fc0 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
19fd0 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71  s which causes q
19fe0 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f  uery abort if po
19ff0 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e  sitive */.    in
1a000 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20  t groupBySort;  
1a010 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66    /* Rows come f
1a020 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52  rom source in GR
1a030 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a  OUP BY order */.
1a040 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ..    /* The fol
1a050 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73  lowing variables
1a060 20 68 6f 6c 64 20 61 64 64 72 65 73 73 65 73 20   hold addresses 
1a070 6f 72 20 6c 61 62 65 6c 73 20 66 6f 72 20 70 61  or labels for pa
1a080 72 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  rts of the.    *
1a090 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
1a0a0 65 20 70 72 6f 67 72 61 6d 20 77 65 20 61 72 65  e program we are
1a0b0 20 70 75 74 74 69 6e 67 20 74 6f 67 65 74 68 65   putting togethe
1a0c0 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
1a0d0 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 20 20  rOutputRow;     
1a0e0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62   /* Start of sub
1a0f0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
1a100 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f  puts a result ro
1a110 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  w */.    int add
1a120 72 53 65 74 41 62 6f 72 74 3b 20 20 20 20 20 20  rSetAbort;      
1a130 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72   /* Set the abor
1a140 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72  t flag and retur
1a150 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  n */.    int add
1a160 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 3b  rInitializeLoop;
1a170 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64   /* Start of cod
1a180 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a  e that initializ
1a190 65 73 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  es the input loo
1a1a0 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  p */.    int add
1a1b0 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20 20 20  rTopOfLoop;     
1a1c0 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
1a1d0 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
1a1e0 20 69 6e 74 20 61 64 64 72 47 72 6f 75 70 42 79   int addrGroupBy
1a1f0 43 68 61 6e 67 65 3b 20 20 2f 2a 20 43 6f 64 65  Change;  /* Code
1a200 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 20   that runs when 
1a210 61 6e 79 20 47 52 4f 55 50 20 42 59 20 74 65 72  any GROUP BY ter
1a220 6d 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20  m changes */.   
1a230 20 69 6e 74 20 61 64 64 72 50 72 6f 63 65 73 73   int addrProcess
1a240 52 6f 77 3b 20 20 20 20 20 2f 2a 20 43 6f 64 65  Row;     /* Code
1a250 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 73 69   to process a si
1a260 6e 67 6c 65 20 69 6e 70 75 74 20 72 6f 77 20 2a  ngle input row *
1a270 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e  /.    int addrEn
1a280 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
1a290 20 45 6e 64 20 6f 66 20 61 6c 6c 20 70 72 6f 63   End of all proc
1a2a0 65 73 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  essing */.    in
1a2b0 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  t addrSortingIdx
1a2c0 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f  ;     /* The OP_
1a2d0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f  OpenEphemeral fo
1a2e0 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
1a2f0 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  dex */.    int a
1a300 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 20  ddrReset;       
1a310 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
1a320 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74   for resetting t
1a330 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a  he accumulator *
1a340 2f 0a 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d  /..    addrEnd =
1a350 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1a360 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
1a370 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c  * Convert TK_COL
1a380 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54  UMN nodes into T
1a390 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64  K_AGG_COLUMN and
1a3a0 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e   make entries in
1a3b0 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f  .    ** sAggInfo
1a3c0 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f   for all TK_AGG_
1a3d0 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69  FUNCTION nodes i
1a3e0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  n expressions of
1a3f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45   the.    ** SELE
1a400 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
1a410 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
1a420 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
1a430 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
1a440 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
1a450 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
1a460 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20   = pTabList;.   
1a470 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20   sNC.pAggInfo = 
1a480 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73  &sAggInfo;.    s
1a490 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
1a4a0 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42  Column = pGroupB
1a4b0 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y ? pGroupBy->nE
1a4c0 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73  xpr+1 : 0;.    s
1a4d0 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79  AggInfo.pGroupBy
1a4e0 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20   = pGroupBy;.   
1a4f0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1a500 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
1a510 73 4e 43 2c 20 70 45 4c 69 73 74 29 20 29 7b 0a  sNC, pEList) ){.
1a520 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
1a530 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
1a540 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1a550 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
1a560 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 20 29  sNC, pOrderBy) )
1a570 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
1a580 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
1a590 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 26     if( pHaving &
1a5a0 26 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  & sqlite3ExprAna
1a5b0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26  lyzeAggregates(&
1a5c0 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 20 29 7b  sNC, pHaving) ){
1a5d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
1a5e0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
1a5f0 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75    sAggInfo.nAccu
1a600 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e  mulator = sAggIn
1a610 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  fo.nColumn;.    
1a620 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
1a630 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  nfo.nFunc; i++){
1a640 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1a650 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1a660 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49  List(&sNC, sAggI
1a670 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
1a680 70 72 2d 3e 70 4c 69 73 74 29 20 29 7b 0a 20 20  pr->pList) ){.  
1a690 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
1a6a0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
1a6b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
1a6c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1a6d0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1a6e0 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73  ..    /* Process
1a6f0 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
1a700 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59  es with GROUP BY
1a710 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65   is very differe
1a720 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75  nt and.    ** mu
1a730 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20  ch more complex 
1a740 74 68 61 20 61 67 67 72 65 67 61 74 65 73 20 77  tha aggregates w
1a750 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42  ithout a GROUP B
1a760 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  Y..    */.    if
1a770 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
1a780 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
1a790 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e  yInfo;  /* Keyin
1a7a0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
1a7b0 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63  r the group by c
1a7c0 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 20 20 20 20  lause */..      
1a7d0 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73  /* Create labels
1a7e0 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65   that we will be
1a7f0 20 6e 65 65 64 69 6e 67 0a 20 20 20 20 20 20 2a   needing.      *
1a800 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 20 61 64  /.     .      ad
1a810 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70  drInitializeLoop
1a820 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1a830 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1a840 20 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61    addrGroupByCha
1a850 6e 67 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nge = sqlite3Vdb
1a860 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1a870 20 20 20 20 20 61 64 64 72 50 72 6f 63 65 73 73       addrProcess
1a880 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
1a890 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
1a8a0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
1a8b0 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20  e is a GROUP BY 
1a8c0 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20  clause we might 
1a8d0 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69  need a sorting i
1a8e0 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ndex to.      **
1a8f0 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20   implement it.  
1a900 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f  Allocate that so
1a910 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e  rting index now.
1a920 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75    If it turns ou
1a930 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  t.      ** that 
1a940 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69  we do not need i
1a950 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65  t after all, the
1a960 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69   OpenEphemeral i
1a970 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20  nstruction.     
1a980 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76   ** will be conv
1a990 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f  erted into a Noo
1a9a0 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  p.  .      */.  
1a9b0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
1a9c0 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65  tingIdx = pParse
1a9d0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
1a9e0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
1a9f0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
1aa00 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29  Parse, pGroupBy)
1aa10 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
1aa20 69 6e 67 49 64 78 20 3d 0a 20 20 20 20 20 20 20  ingIdx =.       
1aa30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
1aa40 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  3(v, OP_OpenEphe
1aa50 6d 65 72 61 6c 2c 20 73 41 67 67 49 6e 66 6f 2e  meral, sAggInfo.
1aa60 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20  sortingIdx,.    
1aa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa80 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53       sAggInfo.nS
1aa90 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 0a 20 20  ortingColumn,.  
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aab0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
1aac0 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
1aad0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20  FO_HANDOFF);..  
1aae0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
1aaf0 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
1ab00 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50  ns used by GROUP
1ab10 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72   BY aggregate pr
1ab20 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a  ocessing.      *
1ab30 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67  /.      iUseFlag
1ab40 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
1ab50 2b 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46  +;.      iAbortF
1ab60 6c 61 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  lag = pParse->nM
1ab70 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 41 4d 65  em++;.      iAMe
1ab80 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
1ab90 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1aba0 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
1abb0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
1abc0 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  BMem = pParse->n
1abd0 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73  Mem;.      pPars
1abe0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
1abf0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
1ac00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ac10 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c  Op(v, OP_MemInt,
1ac20 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   0, iAbortFlag);
1ac30 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1ac40 6e 74 28 28 76 2c 20 22 23 20 63 6c 65 61 72 20  nt((v, "# clear 
1ac50 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
1ac60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ac70 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
1ac80 6e 74 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29  nt, 0, iUseFlag)
1ac90 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1aca0 65 6e 74 28 28 76 2c 20 22 23 20 69 6e 64 69 63  ent((v, "# indic
1acb0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
1acc0 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20  empty"));.      
1acd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ace0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1acf0 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f  addrInitializeLo
1ad00 6f 70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  op);..      /* G
1ad10 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
1ad20 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
1ad30 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
1ad40 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
1ad50 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73     ** set.  This
1ad60 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73   subroutine firs
1ad70 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69  t looks at the i
1ad80 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73  UseFlag.  If iUs
1ad90 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69  eFlag.      ** i
1ada0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
1adb0 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68  qual to zero, th
1adc0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20  e subroutine is 
1add0 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20  a no-op.  If.   
1ade0 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
1adf0 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74  sing calls for t
1ae00 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72  he query to abor
1ae10 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  t, this subrouti
1ae20 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72  ne.      ** incr
1ae30 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72  ements the iAbor
1ae40 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63  tFlag memory loc
1ae50 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74  ation before ret
1ae60 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20  urning in.      
1ae70 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e  ** order to sign
1ae80 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  al the caller to
1ae90 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f   abort..      */
1aea0 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62  .      addrSetAb
1aeb0 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ort = sqlite3Vdb
1aec0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1aed0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1aee0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
1aef0 6d 49 6e 74 2c 20 31 2c 20 69 41 62 6f 72 74 46  mInt, 1, iAbortF
1af00 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
1af10 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73  Comment((v, "# s
1af20 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  et abort flag"))
1af30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1af40 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
1af50 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  eturn, 0, 0);.  
1af60 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
1af70 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  w = sqlite3VdbeC
1af80 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1af90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1afa0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65  AddOp(v, OP_IfMe
1afb0 6d 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20  mPos, iUseFlag, 
1afc0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29  addrOutputRow+2)
1afd0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1afe0 65 6e 74 28 28 76 2c 20 22 23 20 47 72 6f 75 70  ent((v, "# Group
1aff0 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
1b000 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22  tor entry point"
1b010 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
1b020 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1b030 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a  _Return, 0, 0);.
1b040 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
1b050 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
1b060 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
1b070 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67       if( pHaving
1b080 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1b090 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1b0a0 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
1b0b0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
1b0c0 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
1b0d0 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e     rc = selectIn
1b0e0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
1b0f0 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c  p, p->pEList, 0,
1b100 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20   0, pOrderBy,.  
1b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b120 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63           distinc
1b130 74 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  t, eDest, iParm,
1b140 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1b150 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
1b160 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64  rOutputRow+1, ad
1b170 64 72 53 65 74 41 62 6f 72 74 2c 20 61 66 66 29  drSetAbort, aff)
1b180 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1b190 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
1b1a0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
1b1b0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1b1c0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1b1d0 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20  Return, 0, 0);. 
1b1e0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1b1f0 28 28 76 2c 20 22 23 20 65 6e 64 20 67 72 6f 75  ((v, "# end grou
1b200 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
1b210 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
1b220 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1b230 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
1b240 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f  ll reset the gro
1b250 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f  up-by accumulato
1b260 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
1b270 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c   addrReset = sql
1b280 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1b290 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 72 65  ddr(v);.      re
1b2a0 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
1b2b0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
1b2c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b2d0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1b2e0 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 0a  Return, 0, 0);..
1b2f0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61        /* Begin a
1b300 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
1b310 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72  extract all sour
1b320 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50  ce rows in GROUP
1b330 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20   BY order..     
1b340 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69   ** This might i
1b350 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72  nvolve two separ
1b360 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61  ate loops with a
1b370 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74  n OP_Sort in bet
1b380 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a  ween, or.      *
1b390 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  * it might be a 
1b3a0 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74  single loop that
1b3b0 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74   uses an index t
1b3c0 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d  o extract inform
1b3d0 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ation.      ** i
1b3e0 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65  n the right orde
1b3f0 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e  r to begin with.
1b400 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1b410 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1b420 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 49  veLabel(v, addrI
1b430 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a  nitializeLoop);.
1b440 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b450 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73  eAddOp(v, OP_Gos
1b460 75 62 2c 20 30 2c 20 61 64 64 72 52 65 73 65 74  ub, 0, addrReset
1b470 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
1b480 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
1b490 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
1b4a0 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70  List, pWhere, &p
1b4b0 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
1b4c0 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
1b4d0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1b4e0 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f 75  .      if( pGrou
1b4f0 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBy==0 ){.      
1b500 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
1b510 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
1b520 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
1b530 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
1b540 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
1b550 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
1b560 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45  t.  The OP_OpenE
1b570 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
1b580 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
1b590 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65  * cancelled late
1b5a0 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69  r because we sti
1b5b0 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74  ll need to use t
1b5c0 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20  he pKeyInfo.    
1b5d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
1b5e0 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
1b5f0 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67  oupBy;.        g
1b600 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a  roupBySort = 0;.
1b610 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b620 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65       /* Rows are
1b630 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75   coming out in u
1b640 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65  ndetermined orde
1b650 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70  r.  We have to p
1b660 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ush.        ** e
1b670 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73  ach row into a s
1b680 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65  orting index, te
1b690 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73  rminate the firs
1b6a0 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  t loop,.        
1b6b0 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65  ** then loop ove
1b6c0 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
1b6d0 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  dex in order to 
1b6e0 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20  get the output. 
1b6f0 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72         ** in sor
1b700 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ted order.      
1b710 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f    */.        gro
1b720 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20  upBySort = 1;.  
1b730 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b740 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
1b750 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b  arse, pGroupBy);
1b760 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b770 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1b780 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e  Sequence, sAggIn
1b790 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 30  fo.sortingIdx, 0
1b7a0 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70  );.        j = p
1b7b0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31  GroupBy->nExpr+1
1b7c0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
1b7d0 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
1b7e0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
1b7f0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
1b800 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
1b810 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  = &sAggInfo.aCol
1b820 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
1b830 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
1b840 43 6f 6c 75 6d 6e 3c 6a 20 29 20 63 6f 6e 74 69  Column<j ) conti
1b850 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73  nue;.          s
1b860 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1b870 74 43 6f 6c 75 6d 6e 28 76 2c 20 70 43 6f 6c 2d  tColumn(v, pCol-
1b880 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f  >pTab, pCol->iCo
1b890 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62  lumn, pCol->iTab
1b8a0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a  le);.          j
1b8b0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
1b8c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b8d0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
1b8e0 65 52 65 63 6f 72 64 2c 20 6a 2c 20 30 29 3b 0a  eRecord, j, 0);.
1b8f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1b900 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
1b910 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e  dxInsert, sAggIn
1b920 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 30  fo.sortingIdx, 0
1b930 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1b940 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
1b950 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
1b960 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1b970 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e 66  OP_Sort, sAggInf
1b980 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
1b990 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  drEnd);.        
1b9a0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1b9b0 22 23 20 47 52 4f 55 50 20 42 59 20 73 6f 72 74  "# GROUP BY sort
1b9c0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67  "));.        sAg
1b9d0 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67  gInfo.useSorting
1b9e0 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Idx = 1;.      }
1b9f0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75  ..      /* Evalu
1ba00 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ate the current 
1ba10 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
1ba20 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20  nd store in b0, 
1ba30 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20  b1, b2....      
1ba40 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79  ** (b0 is memory
1ba50 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b   location iBMem+
1ba60 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31  0, b1 is iBMem+1
1ba70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a  , and so forth).
1ba80 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f        ** Then co
1ba90 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e  mpare the curren
1baa0 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
1bab0 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f   against the GRO
1bac0 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20  UP BY terms.    
1bad0 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72    ** from the pr
1bae0 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65  evious row curre
1baf0 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61  ntly stored in a
1bb00 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20  0, a1, a2....   
1bb10 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
1bb20 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69  TopOfLoop = sqli
1bb30 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1bb40 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72  dr(v);.      for
1bb50 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79  (j=0; j<pGroupBy
1bb60 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
1bb70 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70         if( group
1bb80 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
1bb90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bba0 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
1bbb0 6e 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  n, sAggInfo.sort
1bbc0 69 6e 67 49 64 78 2c 20 6a 29 3b 0a 20 20 20 20  ingIdx, j);.    
1bbd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bbe0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69       sAggInfo.di
1bbf0 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
1bc00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1bc10 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1bc20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70  pGroupBy->a[j].p
1bc30 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
1bc40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1bc50 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1bc60 4d 65 6d 53 74 6f 72 65 2c 20 69 42 4d 65 6d 2b  MemStore, iBMem+
1bc70 6a 2c 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  j, j<pGroupBy->n
1bc80 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d  Expr-1);.      }
1bc90 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 47 72  .      for(j=pGr
1bca0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20  oupBy->nExpr-1; 
1bcb0 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20  j>=0; j--){.    
1bcc0 20 20 20 20 69 66 28 20 6a 3c 70 47 72 6f 75 70      if( j<pGroup
1bcd0 42 79 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20  By->nExpr-1 ){. 
1bce0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1bcf0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1bd00 4d 65 6d 4c 6f 61 64 2c 20 69 42 4d 65 6d 2b 6a  MemLoad, iBMem+j
1bd10 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
1bd20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1bd30 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
1bd40 65 6d 4c 6f 61 64 2c 20 69 41 4d 65 6d 2b 6a 2c  emLoad, iAMem+j,
1bd50 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
1bd60 20 6a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   j==0 ){.       
1bd70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bd80 64 4f 70 28 76 2c 20 4f 50 5f 45 71 2c 20 30 78  dOp(v, OP_Eq, 0x
1bd90 32 30 30 2c 20 61 64 64 72 50 72 6f 63 65 73 73  200, addrProcess
1bda0 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Row);.        }e
1bdb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
1bdc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1bdd0 76 2c 20 4f 50 5f 4e 65 2c 20 30 78 32 30 30 2c  v, OP_Ne, 0x200,
1bde0 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e   addrGroupByChan
1bdf0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
1be00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1be10 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
1be20 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66  , (void*)pKeyInf
1be30 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 2c 20 50 33 5f  o->aColl[j], P3_
1be40 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
1be50 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  }..      /* Gene
1be60 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72  rate code that r
1be70 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  uns whenever the
1be80 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65   GROUP BY change
1be90 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e  s..      ** Chan
1bea0 67 65 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20  ge in the GROUP 
1beb0 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20  BY are detected 
1bec0 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
1bed0 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c  code.      ** bl
1bee0 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77  ock.  If there w
1bef0 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20  ere no changes, 
1bf00 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b  this block is sk
1bf10 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ipped..      **.
1bf20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
1bf30 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e  de copies curren
1bf40 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73  t group by terms
1bf50 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e   in b0,b1,b2,...
1bf60 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  .      ** over t
1bf70 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20  o a0,a1,a2.  It 
1bf80 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f  then calls the o
1bf90 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
1bfa0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
1bfb0 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61  sets the aggrega
1bfc0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  te accumulator r
1bfd0 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70  egisters in prep
1bfe0 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  aration.      **
1bff0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52   for the next GR
1c000 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20  OUP BY batch..  
1c010 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
1c020 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1c030 61 62 65 6c 28 76 2c 20 61 64 64 72 47 72 6f 75  abel(v, addrGrou
1c040 70 42 79 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  pByChange);.    
1c050 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72    for(j=0; j<pGr
1c060 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b  oupBy->nExpr; j+
1c070 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
1c080 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1c090 4f 50 5f 4d 65 6d 4d 6f 76 65 2c 20 69 41 4d 65  OP_MemMove, iAMe
1c0a0 6d 2b 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  m+j, iBMem+j);. 
1c0b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1c0c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1c0d0 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64   OP_Gosub, 0, ad
1c0e0 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
1c0f0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1c100 28 76 2c 20 22 23 20 6f 75 74 70 75 74 20 6f 6e  (v, "# output on
1c110 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20  e row"));.      
1c120 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c130 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c  (v, OP_IfMemPos,
1c140 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64   iAbortFlag, add
1c150 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62  rEnd);.      Vdb
1c160 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
1c170 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67  check abort flag
1c180 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1c190 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1c1a0 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72  P_Gosub, 0, addr
1c1b0 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  Reset);.      Vd
1c1c0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
1c1d0 20 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74   reset accumulat
1c1e0 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
1c1f0 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72   Update the aggr
1c200 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
1c210 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  rs based on the 
1c220 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20  content of.     
1c230 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
1c240 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  row.      */.   
1c250 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1c260 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
1c270 64 72 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20  drProcessRow);. 
1c280 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
1c290 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
1c2a0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
1c2b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c2c0 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20  p(v, OP_MemInt, 
1c2d0 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  1, iUseFlag);.  
1c2e0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1c2f0 28 76 2c 20 22 23 20 69 6e 64 69 63 61 74 65 20  (v, "# indicate 
1c300 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61  data in accumula
1c310 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
1c320 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
1c330 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
1c340 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
1c350 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1c360 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1c370 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66  OP_Next, sAggInf
1c380 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
1c390 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  drTopOfLoop);.  
1c3a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c3b0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
1c3c0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
1c3d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1c3e0 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
1c3f0 64 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31  ddrSortingIdx, 1
1c400 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1c410 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
1c420 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73  final row of res
1c430 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ult.      */.   
1c440 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c450 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
1c460 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f   0, addrOutputRo
1c470 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
1c480 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6f 75 74  mment((v, "# out
1c490 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29  put final row"))
1c4a0 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 20 2f  ;.      .    } /
1c4b0 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79  * endif pGroupBy
1c4c0 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20   */.    else {. 
1c4d0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73       /* This cas
1c4e0 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67  e runs if the ag
1c4f0 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47  gregate has no G
1c500 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
1c510 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 72   The.      ** pr
1c520 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68  ocessing is much
1c530 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74   simpler since t
1c540 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
1c550 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20  ingle row.      
1c560 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20  ** of output..  
1c570 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 73      */.      res
1c580 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
1c590 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
1c5a0 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
1c5b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1c5c0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
1c5d0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30 29 3b  ist, pWhere, 0);
1c5e0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
1c5f0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
1c600 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 75 70  ct_end;.      up
1c610 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
1c620 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
1c630 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
1c640 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
1c650 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
1c660 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
1c670 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
1c680 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
1c690 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
1c6a0 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
1c6b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1c6c0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
1c6d0 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20  aving, addrEnd, 
1c6e0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
1c6f0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
1c700 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
1c710 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c  pEList, 0, 0, 0,
1c720 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20   -1, .          
1c730 20 20 20 20 20 20 20 20 20 20 20 20 65 44 65 73              eDes
1c740 74 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 45 6e  t, iParm, addrEn
1c750 64 2c 20 61 64 64 72 45 6e 64 2c 20 61 66 66 29  d, addrEnd, aff)
1c760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1c770 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1c780 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b  bel(v, addrEnd);
1c790 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64  .    .  } /* end
1c7a0 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65  if aggregate que
1c7b0 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  ry */..  /* If t
1c7c0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
1c7d0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
1c7e0 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74   we need to sort
1c7f0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
1c800 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20  * and send them 
1c810 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
1c820 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f  one by one..  */
1c830 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
1c840 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53  ){.    generateS
1c850 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
1c860 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  p, v, pEList->nE
1c870 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72  xpr, eDest, iPar
1c880 6d 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  m);.  }..#ifndef
1c890 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1c8a0 51 55 45 52 59 0a 20 20 2f 2a 20 49 66 20 74 68  QUERY.  /* If th
1c8b0 69 73 20 77 61 73 20 61 20 73 75 62 71 75 65 72  is was a subquer
1c8c0 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63  y, we have now c
1c8d0 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73 75 62  onverted the sub
1c8e0 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a  query into a.  *
1c8f0 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
1c900 65 2e 20 20 53 6f 20 73 65 74 20 74 68 65 20 53  e.  So set the S
1c910 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69 73 50 6f  rcList_item.isPo
1c920 70 75 6c 61 74 65 64 20 66 6c 61 67 20 74 6f 20  pulated flag to 
1c930 70 72 65 76 65 6e 74 0a 20 20 2a 2a 20 74 68 69  prevent.  ** thi
1c940 73 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20  s subquery from 
1c950 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20  being evaluated 
1c960 61 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72  again and to for
1c970 63 65 20 74 68 65 20 75 73 65 20 6f 66 0a 20 20  ce the use of.  
1c980 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ** the temporary
1c990 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
1c9a0 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  f( pParent ){.  
1c9b0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1c9c0 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61  t->pSrc->nSrc>pa
1c9d0 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61  rentTab );.    a
1c9e0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1c9f0 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61  pSrc->a[parentTa
1ca00 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b  b].pSelect==p );
1ca10 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53  .    pParent->pS
1ca20 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d  rc->a[parentTab]
1ca30 2e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31  .isPopulated = 1
1ca40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1ca50 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
1ca60 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a  skip this query.
1ca70 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1ca80 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1ca90 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54  , iEnd);..  /* T
1caa0 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75  he SELECT was su
1cab0 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64  ccessfully coded
1cac0 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75  .   Set the retu
1cad0 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a  rn code to 0.  *
1cae0 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f  * to indicate no
1caf0 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20   errors..  */.  
1cb00 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  rc = 0;..  /* Co
1cb10 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68  ntrol jumps to h
1cb20 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ere if an error 
1cb30 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  is encountered a
1cb40 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20  bove, or upon.  
1cb50 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f  ** successful co
1cb60 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45  ding of the SELE
1cb70 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f  CT..  */.select_
1cb80 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  end:..  /* Ident
1cb90 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ify column names
1cba0 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75   if we will be u
1cbb0 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63  sing them in a c
1cbc0 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20  allback.  This. 
1cbd0 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70   ** step is skip
1cbe0 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75  ped if the outpu
1cbf0 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f  t is going to so
1cc00 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61  me other destina
1cc10 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
1cc20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1cc30 26 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  & eDest==SRT_Cal
1cc40 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e  lback ){.    gen
1cc50 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
1cc60 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
1cc70 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
1cc80 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1cc90 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a  sAggInfo.aCol);.
1cca0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
1ccb0 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a  AggInfo.aFunc);.
1ccc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ccd0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1cce0 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 2a  TE_DEBUG)./*.***
1ccf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cd00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cd10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cd20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cd30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
1cd40 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
1cd50 64 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  de is used for t
1cd60 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
1cd70 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65 20  ging only.  The 
1cd80 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20 66 6f 6c  code.** that fol
1cd90 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 70  lows does not ap
1cda0 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c 20 62  pear in normal b
1cdb0 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uilds..**.** The
1cdc0 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
1cdd0 75 73 65 64 20 74 6f 20 70 72 69 6e 74 20 6f 75  used to print ou
1cde0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
1cdf0 20 61 6c 6c 20 6f 72 20 70 61 72 74 20 6f 66 20   all or part of 
1ce00 61 20 0a 2a 2a 20 70 61 72 73 65 20 73 74 72 75  a .** parse stru
1ce10 63 74 75 72 65 73 20 73 75 63 68 20 61 73 20 53  ctures such as S
1ce20 65 6c 65 63 74 20 6f 72 20 45 78 70 72 2e 20 20  elect or Expr.  
1ce30 53 75 63 68 20 70 72 69 6e 74 6f 75 74 73 20 61  Such printouts a
1ce40 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72  re useful.** for
1ce50 20 68 65 6c 70 69 6e 67 20 74 6f 20 75 6e 64 65   helping to unde
1ce60 72 73 74 61 6e 64 20 77 68 61 74 20 69 73 20 68  rstand what is h
1ce70 61 70 70 65 6e 69 6e 67 20 69 6e 73 69 64 65 20  appening inside 
1ce80 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
1ce90 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68 65  or.** during the
1cea0 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 6f   execution of co
1ceb0 6d 70 6c 65 78 20 53 45 4c 45 43 54 20 73 74 61  mplex SELECT sta
1cec0 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54  tements..**.** T
1ced0 68 65 73 65 20 72 6f 75 74 69 6e 65 20 61 72 65  hese routine are
1cee0 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 6e 79 77   not called anyw
1cef0 68 65 72 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  here from within
1cf00 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 63   the normal.** c
1cf10 6f 64 65 20 62 61 73 65 2e 20 20 54 68 65 6e 20  ode base.  Then 
1cf20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 74 6f 20  are intended to 
1cf30 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  be called from w
1cf40 69 74 68 69 6e 20 74 68 65 20 64 65 62 75 67 67  ithin the debugg
1cf50 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20 74 65  er.** or from te
1cf60 6d 70 6f 72 61 72 79 20 22 70 72 69 6e 74 66 22  mporary "printf"
1cf70 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 65   statements inse
1cf80 72 74 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  rted for debuggi
1cf90 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ng..*/.void sqli
1cfa0 74 65 33 50 72 69 6e 74 45 78 70 72 28 45 78 70  te3PrintExpr(Exp
1cfb0 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
1cfc0 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 2d 3e 74 6f  token.z && p->to
1cfd0 6b 65 6e 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 73  ken.n>0 ){.    s
1cfe0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1cff0 66 28 22 28 25 2e 2a 73 22 2c 20 70 2d 3e 74 6f  f("(%.*s", p->to
1d000 6b 65 6e 2e 6e 2c 20 70 2d 3e 74 6f 6b 65 6e 2e  ken.n, p->token.
1d010 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
1d020 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1d030 6e 74 66 28 22 28 25 64 22 2c 20 70 2d 3e 6f 70  ntf("(%d", p->op
1d040 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
1d050 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 73 71 6c  pLeft ){.    sql
1d060 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1d070 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  " ");.    sqlite
1d080 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 4c  3PrintExpr(p->pL
1d090 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eft);.  }.  if( 
1d0a0 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  p->pRight ){.   
1d0b0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1d0c0 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71  ntf(" ");.    sq
1d0d0 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70  lite3PrintExpr(p
1d0e0 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  ->pRight);.  }. 
1d0f0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1d100 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76 6f 69 64  ntf(")");.}.void
1d110 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
1d120 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
1d130 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1d140 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1d150 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1d160 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  {.    sqlite3Pri
1d170 6e 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b  ntExpr(pList->a[
1d180 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
1d190 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  f( i<pList->nExp
1d1a0 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  r-1 ){.      sql
1d1b0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1d1c0 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ", ");.    }.  }
1d1d0 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
1d1e0 72 69 6e 74 53 65 6c 65 63 74 28 53 65 6c 65 63  rintSelect(Selec
1d1f0 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65 6e 74  t *p, int indent
1d200 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  ){.  sqlite3Debu
1d210 67 50 72 69 6e 74 66 28 22 25 2a 73 53 45 4c 45  gPrintf("%*sSELE
1d220 43 54 28 25 70 29 20 22 2c 20 69 6e 64 65 6e 74  CT(%p) ", indent
1d230 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73 71 6c 69  , "", p);.  sqli
1d240 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74  te3PrintExprList
1d250 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73  (p->pEList);.  s
1d260 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1d270 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66 28 20 70  f("\n");.  if( p
1d280 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 63 68  ->pSrc ){.    ch
1d290 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a 20 20 20  ar *zPrefix;.   
1d2a0 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a 50 72 65   int i;.    zPre
1d2b0 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b 0a 20 20  fix = "FROM";.  
1d2c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
1d2d0 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
1d2e0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  {.      struct S
1d2f0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1d300 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61  em = &p->pSrc->a
1d310 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [i];.      sqlit
1d320 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
1d330 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b 36 2c 20  *s ", indent+6, 
1d340 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20  zPrefix);.      
1d350 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20  zPrefix = "";.  
1d360 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
1d370 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
1d380 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1d390 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a 20 20 20  intf("(\n");.   
1d3a0 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e       sqlite3Prin
1d3b0 74 53 65 6c 65 63 74 28 70 49 74 65 6d 2d 3e 70  tSelect(pItem->p
1d3c0 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e 74 2b 31  Select, indent+1
1d3d0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
1d3e0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1d3f0 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74 2b 38 2c  %*s)", indent+8,
1d400 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   "");.      }els
1d410 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61  e if( pItem->zNa
1d420 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
1d430 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1d440 28 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ("%s", pItem->zN
1d450 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
1d460 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
1d470 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Tab ){.        s
1d480 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1d490 66 28 22 28 74 61 62 6c 65 3a 20 25 73 29 22 2c  f("(table: %s)",
1d4a0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
1d4b0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
1d4c0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
1d4d0 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
1d4e0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1d4f0 6e 74 66 28 22 20 41 53 20 25 73 22 2c 20 70 49  ntf(" AS %s", pI
1d500 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1d510 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1d520 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 2d  i<p->pSrc->nSrc-
1d530 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
1d540 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1d550 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ",");.      }.  
1d560 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1d570 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
1d580 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
1d590 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73  >pWhere ){.    s
1d5a0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1d5b0 66 28 22 25 2a 73 20 57 48 45 52 45 20 22 2c 20  f("%*s WHERE ", 
1d5c0 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20  indent, "");.   
1d5d0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
1d5e0 72 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  r(p->pWhere);.  
1d5f0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1d600 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a  intf("\n");.  }.
1d610 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
1d620 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
1d630 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
1d640 20 47 52 4f 55 50 20 42 59 20 22 2c 20 69 6e 64   GROUP BY ", ind
1d650 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71  ent, "");.    sq
1d660 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69  lite3PrintExprLi
1d670 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  st(p->pGroupBy);
1d680 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1d690 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
1d6a0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76   }.  if( p->pHav
1d6b0 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ing ){.    sqlit
1d6c0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
1d6d0 2a 73 20 48 41 56 49 4e 47 20 22 2c 20 69 6e 64  *s HAVING ", ind
1d6e0 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71  ent, "");.    sq
1d6f0 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70  lite3PrintExpr(p
1d700 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  ->pHaving);.    
1d710 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1d720 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  tf("\n");.  }.  
1d730 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
1d740 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
1d750 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 4f  bugPrintf("%*s O
1d760 52 44 45 52 20 42 59 20 22 2c 20 69 6e 64 65 6e  RDER BY ", inden
1d770 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69  t, "");.    sqli
1d780 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74  te3PrintExprList
1d790 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  (p->pOrderBy);. 
1d7a0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1d7b0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
1d7c0 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  .}./* End of the
1d7d0 20 73 74 72 75 63 74 75 72 65 20 64 65 62 75 67   structure debug
1d7e0 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a   printing code.*
1d7f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
1d840 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
1d850 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20  SQLITE_TEST) || 
1d860 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1d870 45 42 55 47 29 20 2a 2f 0a                       EBUG) */.