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

Artifact 1a5d0aaf8f420b164eb775d3b1ba2bfb79597f65:


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 34 31 31  select.c,v 1.411
0200: 20 32 30 30 38 2f 30 31 2f 32 35 20 31 35 3a 30   2008/01/25 15:0
0210: 34 3a 35 30 20 64 72 68 20 45 78 70 20 24 0a 2a  4:50 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0250: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0260: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 62 75  ect structure bu
0270: 74 20 64 6f 20 6e 6f 74 20 64 65 61 6c 6c 6f 63  t do not dealloc
0280: 61 74 65 0a 2a 2a 20 74 68 65 20 73 65 6c 65 63  ate.** the selec
0290: 74 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  t structure itse
02a0: 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  lf..*/.static vo
02b0: 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74 28 53  id clearSelect(S
02c0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c  elect *p){.  sql
02d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
02e0: 74 65 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  te(p->pEList);. 
02f0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
0300: 65 6c 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a  elete(p->pSrc);.
0310: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
0320: 65 74 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  ete(p->pWhere);.
0330: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0340: 74 44 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75  tDelete(p->pGrou
0350: 70 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  pBy);.  sqlite3E
0360: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 48 61  xprDelete(p->pHa
0370: 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  ving);.  sqlite3
0380: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
0390: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73  ->pOrderBy);.  s
03a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
03b0: 74 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  te(p->pPrior);. 
03c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
03d0: 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  te(p->pLimit);. 
03e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
03f0: 74 65 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  te(p->pOffset);.
0400: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
0410: 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73 74  ize a SelectDest
0420: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76   structure..*/.v
0430: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0440: 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74  tDestInit(Select
0450: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74  Dest *pDest, int
0460: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
0470: 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65  m){.  pDest->eDe
0480: 73 74 20 3d 20 65 44 65 73 74 3b 0a 20 20 70 44  st = eDest;.  pD
0490: 65 73 74 2d 3e 69 50 61 72 6d 20 3d 20 69 50 61  est->iParm = iPa
04a0: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66  rm;.  pDest->aff
04b0: 69 6e 69 74 79 20 3d 20 30 3b 0a 20 20 70 44 65  inity = 0;.  pDe
04c0: 73 74 2d 3e 69 4d 65 6d 20 3d 20 30 3b 0a 7d 0a  st->iMem = 0;.}.
04d0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
04e0: 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74   a new Select st
04f0: 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75  ructure and retu
0500: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
0510: 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72  that.** structur
0520: 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71  e..*/.Select *sq
0530: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
0540: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
0550: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
0560: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
0570: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
0580: 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63  ,     /* which c
0590: 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64  olumns to includ
05a0: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
05b0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
05c0: 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  rc,        /* th
05d0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d  e FROM clause --
05e0: 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f   which tables to
05f0: 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20   scan */.  Expr 
0600: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
0610: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
0620: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
0630: 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20  st *pGroupBy,   
0640: 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  /* the GROUP BY 
0650: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
0660: 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20   *pHaving,      
0670: 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20    /* the HAVING 
0680: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
0690: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
06a0: 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42    /* the ORDER B
06b0: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
06c0: 74 20 69 73 44 69 73 74 69 6e 63 74 2c 20 20 20  t isDistinct,   
06d0: 20 20 20 20 2f 2a 20 74 72 75 65 20 69 66 20 74      /* true if t
06e0: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
06f0: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
0700: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
0710: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d  ,         /* LIM
0720: 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20  IT value.  NULL 
0730: 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a  means not used *
0740: 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65  /.  Expr *pOffse
0750: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46  t         /* OFF
0760: 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  SET value.  NULL
0770: 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74   means no offset
0780: 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
0790: 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20  *pNew;.  Select 
07a0: 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74  standin;.  sqlit
07b0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
07c0: 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  >db;.  pNew = sq
07d0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
07e0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  o(db, sizeof(*pN
07f0: 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ew) );.  assert(
0800: 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70 4c 69   !pOffset || pLi
0810: 6d 69 74 20 29 3b 20 20 20 2f 2a 20 43 61 6e 27  mit );   /* Can'
0820: 74 20 68 61 76 65 20 4f 46 46 53 45 54 20 77 69  t have OFFSET wi
0830: 74 68 6f 75 74 20 4c 49 4d 49 54 2e 20 2a 2f 0a  thout LIMIT. */.
0840: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
0850: 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61  .    pNew = &sta
0860: 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ndin;.    memset
0870: 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (pNew, 0, sizeof
0880: 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20  (*pNew));.  }.  
0890: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
08a0: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71  .    pEList = sq
08b0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
08c0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
08d0: 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 54 4b  qlite3Expr(db,TK
08e0: 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20 30 29 3b  _ALL,0,0,0), 0);
08f0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
0900: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
0910: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72  pNew->pSrc = pSr
0920: 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  c;.  pNew->pWher
0930: 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e  e = pWhere;.  pN
0940: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70  ew->pGroupBy = p
0950: 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d  GroupBy;.  pNew-
0960: 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69  >pHaving = pHavi
0970: 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  ng;.  pNew->pOrd
0980: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
0990: 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69  .  pNew->isDisti
09a0: 6e 63 74 20 3d 20 69 73 44 69 73 74 69 6e 63 74  nct = isDistinct
09b0: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54  ;.  pNew->op = T
09c0: 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 61 73 73 65  K_SELECT;.  asse
09d0: 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c  rt( pOffset==0 |
09e0: 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20  | pLimit!=0 );. 
09f0: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
0a00: 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e  pLimit;.  pNew->
0a10: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
0a20: 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  t;.  pNew->iLimi
0a30: 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  t = -1;.  pNew->
0a40: 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20  iOffset = -1;.  
0a50: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0a60: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
0a70: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0a80: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
0a90: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
0aa0: 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 4e  ] = -1;.  if( pN
0ab0: 65 77 3d 3d 26 73 74 61 6e 64 69 6e 29 20 7b 0a  ew==&standin) {.
0ac0: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
0ad0: 70 4e 65 77 29 3b 0a 20 20 20 20 70 4e 65 77 20  pNew);.    pNew 
0ae0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
0af0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
0b00: 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76 65   Delete the give
0b10: 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  n Select structu
0b20: 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  re and all of it
0b30: 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73 2e  s substructures.
0b40: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0b50: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 53 65 6c  SelectDelete(Sel
0b60: 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
0b70: 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c   ){.    clearSel
0b80: 65 63 74 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  ect(p);.    sqli
0b90: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
0ba0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
0bb0: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
0bc0: 72 73 20 70 72 65 63 65 65 64 69 6e 67 20 74 68  rs preceeding th
0bd0: 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20  e JOIN keyword, 
0be0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a  determine the.**
0bf0: 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20   type of join.  
0c00: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
0c10: 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  r constant that 
0c20: 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74  expresses that t
0c30: 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20  ype.** in terms 
0c40: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
0c50: 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a   bit values:.**.
0c60: 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a  **     JT_INNER.
0c70: 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a  **     JT_CROSS.
0c80: 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a  **     JT_OUTER.
0c90: 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41  **     JT_NATURA
0ca0: 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54  L.**     JT_LEFT
0cb0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54  .**     JT_RIGHT
0cc0: 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75  .**.** A full ou
0cd0: 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20  ter join is the 
0ce0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a  combination of J
0cf0: 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49  T_LEFT and JT_RI
0d00: 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  GHT..**.** If an
0d10: 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75   illegal or unsu
0d20: 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70  pported join typ
0d30: 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20  e is seen, then 
0d40: 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20  still return.** 
0d50: 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74  a join type, but
0d60: 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e   put an error in
0d70: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
0d80: 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
0d90: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61  lite3JoinType(Pa
0da0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
0db0: 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70  en *pA, Token *p
0dc0: 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20  B, Token *pC){. 
0dd0: 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
0de0: 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c  0;.  Token *apAl
0df0: 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  l[3];.  Token *p
0e00: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0e10: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
0e20: 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 77 6f 72  nst char zKeywor
0e30: 64 5b 38 5d 3b 0a 20 20 20 20 75 38 20 6e 43 68  d[8];.    u8 nCh
0e40: 61 72 3b 0a 20 20 20 20 75 38 20 63 6f 64 65 3b  ar;.    u8 code;
0e50: 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73 5b 5d 20  .  } keywords[] 
0e60: 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61 74 75 72  = {.    { "natur
0e70: 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41 54 55 52  al", 7, JT_NATUR
0e80: 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 66  AL },.    { "lef
0e90: 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46  t",    4, JT_LEF
0ea0: 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20  T|JT_OUTER },.  
0eb0: 20 20 7b 20 22 72 69 67 68 74 22 2c 20 20 20 35    { "right",   5
0ec0: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
0ed0: 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75  TER },.    { "fu
0ee0: 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45  ll",    4, JT_LE
0ef0: 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  FT|JT_RIGHT|JT_O
0f00: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 6f  UTER },.    { "o
0f10: 75 74 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 4f  uter",   5, JT_O
0f20: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 69  UTER },.    { "i
0f30: 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 49  nner",   5, JT_I
0f40: 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 63  NNER },.    { "c
0f50: 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a 54 5f 49  ross",   5, JT_I
0f60: 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 7d 2c  NNER|JT_CROSS },
0f70: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .  };.  int i, j
0f80: 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70  ;.  apAll[0] = p
0f90: 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20  A;.  apAll[1] = 
0fa0: 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d  pB;.  apAll[2] =
0fb0: 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   pC;.  for(i=0; 
0fc0: 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b  i<3 && apAll[i];
0fd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61   i++){.    p = a
0fe0: 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  pAll[i];.    for
0ff0: 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b  (j=0; j<sizeof(k
1000: 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28  eywords)/sizeof(
1010: 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b  keywords[0]); j+
1020: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
1030: 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e  >n==keywords[j].
1040: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
1050: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
1060: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
1070: 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b 65   keywords[j].zKe
1080: 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30 20  yword, p->n)==0 
1090: 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74  ){.        joint
10a0: 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72 64 73 5b  ype |= keywords[
10b0: 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20  j].code;.       
10c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
10d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e      }.    if( j>
10e0: 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73  =sizeof(keywords
10f0: 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64  )/sizeof(keyword
1100: 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 6a  s[0]) ){.      j
1110: 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52  ointype |= JT_ER
1120: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
1130: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1140: 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  (.     (jointype
1150: 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   & (JT_INNER|JT_
1160: 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e  OUTER))==(JT_INN
1170: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a  ER|JT_OUTER) ||.
1180: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1190: 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20   JT_ERROR)!=0.  
11a0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
11b0: 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 3b 0a 20  r *zSp1 = " ";. 
11c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11d0: 53 70 32 20 3d 20 22 20 22 3b 0a 20 20 20 20 69  Sp2 = " ";.    i
11e0: 66 28 20 70 42 3d 3d 30 20 29 7b 20 7a 53 70 31  f( pB==0 ){ zSp1
11f0: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 43  ++; }.    if( pC
1200: 3d 3d 30 20 29 7b 20 7a 53 70 32 2b 2b 3b 20 7d  ==0 ){ zSp2++; }
1210: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1220: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
1230: 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f  known or unsuppo
1240: 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20  rted join type: 
1250: 22 0a 20 20 20 20 20 20 20 22 25 54 25 73 25 54  ".       "%T%s%T
1260: 25 73 25 54 22 2c 20 70 41 2c 20 7a 53 70 31 2c  %s%T", pA, zSp1,
1270: 20 70 42 2c 20 7a 53 70 32 2c 20 70 43 29 3b 0a   pB, zSp2, pC);.
1280: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
1290: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65  T_INNER;.  }else
12a0: 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20 26 20   if( jointype & 
12b0: 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20 20 20  JT_RIGHT ){.    
12c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12d0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
12e0: 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f  RIGHT and FULL O
12f0: 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e  UTER JOINs are n
1300: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70  ot currently sup
1310: 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f  ported");.    jo
1320: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
1330: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
1340: 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  jointype;.}../*.
1350: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
1360: 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  dex of a column 
1370: 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74  in a table.  Ret
1380: 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f  urn -1 if the co
1390: 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63  lumn.** is not c
13a0: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
13b0: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
13c0: 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   int columnIndex
13d0: 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f  (Table *pTab, co
13e0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b  nst char *zCol){
13f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1400: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
1410: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
1420: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1430: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
1440: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20  ame, zCol)==0 ) 
1450: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
1460: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
1470: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
1480: 65 20 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f 20  e of a token to 
1490: 61 20 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e 61  a '\000'-termina
14a0: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  ted string..*/.s
14b0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 54 6f  tatic void setTo
14c0: 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f  ken(Token *p, co
14d0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
14e0: 70 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b 0a 20  p->z = (u8*)z;. 
14f0: 20 70 2d 3e 6e 20 3d 20 7a 20 3f 20 73 74 72 6c   p->n = z ? strl
1500: 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 70 2d 3e  en(z) : 0;.  p->
1510: 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  dyn = 0;.}../*.*
1520: 2a 20 53 65 74 20 74 68 65 20 74 6f 6b 65 6e 20  * Set the token 
1530: 74 6f 20 74 68 65 20 64 6f 75 62 6c 65 2d 71 75  to the double-qu
1540: 6f 74 65 64 20 61 6e 64 20 65 73 63 61 70 65 64  oted and escaped
1550: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
1560: 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 0a 2a  string pointed.*
1570: 2a 20 74 6f 20 62 79 20 7a 2e 20 46 6f 72 20 65  * to by z. For e
1580: 78 61 6d 70 6c 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  xample;.**.**   
1590: 20 7b 61 22 62 63 7d 20 20 2d 3e 20 20 7b 22 61   {a"bc}  ->  {"a
15a0: 22 22 62 63 22 7d 0a 2a 2f 0a 73 74 61 74 69 63  ""bc"}.*/.static
15b0: 20 76 6f 69 64 20 73 65 74 51 75 6f 74 65 64 54   void setQuotedT
15c0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
15d0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f  se, Token *p, co
15e0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
15f0: 70 2d 3e 7a 20 3d 20 28 75 38 20 2a 29 73 71 6c  p->z = (u8 *)sql
1600: 69 74 65 33 4d 50 72 69 6e 74 66 28 30 2c 20 22  ite3MPrintf(0, "
1610: 5c 22 25 77 5c 22 22 2c 20 7a 29 3b 0a 20 20 70  \"%w\"", z);.  p
1620: 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 69 66 28  ->dyn = 1;.  if(
1630: 20 70 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 2d 3e   p->z ){.    p->
1640: 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72  n = strlen((char
1650: 20 2a 29 70 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73   *)p->z);.  }els
1660: 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64  e{.    pParse->d
1670: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1680: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
1690: 2a 20 43 72 65 61 74 65 20 61 6e 20 65 78 70 72  * Create an expr
16a0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20  ession node for 
16b0: 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 77 69  an identifier wi
16c0: 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 7a  th the name of z
16d0: 4e 61 6d 65 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  Name.*/.Expr *sq
16e0: 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70  lite3CreateIdExp
16f0: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1700: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1710: 6d 65 29 7b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d  me){.  Token dum
1720: 6d 79 3b 0a 20 20 73 65 74 54 6f 6b 65 6e 28 26  my;.  setToken(&
1730: 64 75 6d 6d 79 2c 20 7a 4e 61 6d 65 29 3b 0a 20  dummy, zName);. 
1740: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
1750: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1760: 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79  ID, 0, 0, &dummy
1770: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  );.}.../*.** Add
1780: 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 57   a term to the W
1790: 48 45 52 45 20 65 78 70 72 65 73 73 69 6f 6e 20  HERE expression 
17a0: 69 6e 20 2a 70 70 45 78 70 72 20 74 68 61 74 20  in *ppExpr that 
17b0: 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a 2a 20  requires the.** 
17c0: 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f 20 62  zCol column to b
17d0: 65 20 65 71 75 61 6c 20 69 6e 20 74 68 65 20 74  e equal in the t
17e0: 77 6f 20 74 61 62 6c 65 73 20 70 54 61 62 31 20  wo tables pTab1 
17f0: 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f 0a 73 74  and pTab2..*/.st
1800: 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65  atic void addWhe
1810: 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  reTerm(.  Parse 
1820: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1830: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1840: 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ntext */.  const
1850: 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20   char *zCol,    
1860: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1870: 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  he column */.  c
1880: 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62  onst Table *pTab
1890: 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  1,      /* First
18a0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73   table */.  cons
18b0: 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73 31 2c  t char *zAlias1,
18c0: 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f       /* Alias fo
18d0: 72 20 66 69 72 73 74 20 74 61 62 6c 65 2e 20 20  r first table.  
18e0: 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
18f0: 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54   const Table *pT
1900: 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53 65 63  ab2,      /* Sec
1910: 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63  ond table */.  c
1920: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61  onst char *zAlia
1930: 73 32 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73  s2,     /* Alias
1940: 20 66 6f 72 20 73 65 63 6f 6e 64 20 74 61 62 6c   for second tabl
1950: 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
1960: 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 4a  */.  int iRightJ
1970: 6f 69 6e 54 61 62 6c 65 2c 20 20 20 20 20 2f 2a  oinTable,     /*
1980: 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
1990: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
19a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
19b0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
19c0: 2a 20 41 64 64 20 74 68 65 20 65 71 75 61 6c 69  * Add the equali
19d0: 74 79 20 74 65 72 6d 20 74 6f 20 74 68 69 73 20  ty term to this 
19e0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
19f0: 0a 20 20 45 78 70 72 20 2a 70 45 31 61 2c 20 2a  .  Expr *pE1a, *
1a00: 70 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20 20 45  pE1b, *pE1c;.  E
1a10: 78 70 72 20 2a 70 45 32 61 2c 20 2a 70 45 32 62  xpr *pE2a, *pE2b
1a20: 2c 20 2a 70 45 32 63 3b 0a 20 20 45 78 70 72 20  , *pE2c;.  Expr 
1a30: 2a 70 45 3b 0a 0a 20 20 70 45 31 61 20 3d 20 73  *pE;..  pE1a = s
1a40: 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78  qlite3CreateIdEx
1a50: 70 72 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 29  pr(pParse, zCol)
1a60: 3b 0a 20 20 70 45 32 61 20 3d 20 73 71 6c 69 74  ;.  pE2a = sqlit
1a70: 65 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70  e3CreateIdExpr(p
1a80: 50 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20  Parse, zCol);.  
1a90: 69 66 28 20 7a 41 6c 69 61 73 31 3d 3d 30 20 29  if( zAlias1==0 )
1aa0: 7b 0a 20 20 20 20 7a 41 6c 69 61 73 31 20 3d 20  {.    zAlias1 = 
1ab0: 70 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pTab1->zName;.  
1ac0: 7d 0a 20 20 70 45 31 62 20 3d 20 73 71 6c 69 74  }.  pE1b = sqlit
1ad0: 65 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70  e3CreateIdExpr(p
1ae0: 50 61 72 73 65 2c 20 7a 41 6c 69 61 73 31 29 3b  Parse, zAlias1);
1af0: 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 32 3d 3d  .  if( zAlias2==
1b00: 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 32  0 ){.    zAlias2
1b10: 20 3d 20 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b   = pTab2->zName;
1b20: 0a 20 20 7d 0a 20 20 70 45 32 62 20 3d 20 73 71  .  }.  pE2b = sq
1b30: 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70  lite3CreateIdExp
1b40: 72 28 70 50 61 72 73 65 2c 20 7a 41 6c 69 61 73  r(pParse, zAlias
1b50: 32 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c  2);.  pE1c = sql
1b60: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1b70: 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 31 62 2c 20  , TK_DOT, pE1b, 
1b80: 70 45 31 61 2c 20 30 29 3b 0a 20 20 70 45 32 63  pE1a, 0);.  pE2c
1b90: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
1ba0: 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
1bb0: 70 45 32 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a  pE2b, pE2a, 0);.
1bc0: 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33 50 45    pE = sqlite3PE
1bd0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 45  xpr(pParse, TK_E
1be0: 51 2c 20 70 45 31 63 2c 20 70 45 32 63 2c 20 30  Q, pE1c, pE2c, 0
1bf0: 29 3b 0a 20 20 69 66 28 20 70 45 20 29 7b 0a 20  );.  if( pE ){. 
1c00: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
1c10: 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
1c20: 69 6e 29 3b 0a 20 20 20 20 70 45 2d 3e 69 52 69  in);.    pE->iRi
1c30: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 69  ghtJoinTable = i
1c40: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
1c50: 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d 20    }.  *ppExpr = 
1c60: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
1c70: 50 61 72 73 65 2d 3e 64 62 2c 2a 70 70 45 78 70  Parse->db,*ppExp
1c80: 72 2c 20 70 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r, pE);.}../*.**
1c90: 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d   Set the EP_From
1ca0: 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e  Join property on
1cb0: 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
1cc0: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
1cd0: 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74  on..** And set t
1ce0: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
1cf0: 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62 6c  inTable to iTabl
1d00: 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d  e for every term
1d10: 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   in the.** expre
1d20: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ssion..**.** The
1d30: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f   EP_FromJoin pro
1d40: 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e  perty is used on
1d50: 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70   terms of an exp
1d60: 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a  ression to tell.
1d70: 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45  ** the LEFT OUTE
1d80: 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e  R JOIN processin
1d90: 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69  g logic that thi
1da0: 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f  s term is part o
1db0: 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65  f the.** join re
1dc0: 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66  striction specif
1dd0: 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ied in the ON or
1de0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e   USING clause an
1df0: 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20  d not a part.** 
1e00: 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65  of the more gene
1e10: 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  ral WHERE clause
1e20: 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61  .  These terms a
1e30: 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f  re moved over to
1e40: 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
1e50: 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e  ause during join
1e60: 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20   processing but 
1e70: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  we need to remem
1e80: 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a  ber that they.**
1e90: 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74   originated in t
1ea0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
1eb0: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lause..**.** The
1ec0: 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
1ed0: 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65 20  Table tells the 
1ee0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
1ef0: 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68 65  cessing that the
1f00: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64  .** expression d
1f10: 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20  epends on table 
1f20: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1f30: 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61 62  even if that tab
1f40: 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70  le is not.** exp
1f50: 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65  licitly mentione
1f60: 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73  d in the express
1f70: 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f 72  ion.  That infor
1f80: 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65 64  mation is needed
1f90: 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c 69  .** for cases li
1fa0: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1fb0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1fc0: 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
1fd0: 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44  ON t1.a=t2.b AND
1fe0: 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68   t1.x=5.**.** Th
1ff0: 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6e  e where clause n
2000: 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74 68  eeds to defer th
2010: 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68  e handling of th
2020: 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d  e t1.x=5.** term
2030: 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65   until after the
2040: 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20   t2 loop of the 
2050: 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20 77  join.  In that w
2060: 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32  ay, a.** NULL t2
2070: 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e 73   row will be ins
2080: 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  erted whenever t
2090: 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20 64  1.x!=5.  If we d
20a0: 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74  o not.** defer t
20b0: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
20c0: 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62  1.x=5, it will b
20d0: 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d 65  e processed imme
20e0: 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72  diately.** after
20f0: 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64   the t1 loop and
2100: 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78 21   rows with t1.x!
2110: 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 70  =5 will never ap
2120: 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f  pear in.** the o
2130: 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73 20  utput, which is 
2140: 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74  incorrect..*/.st
2150: 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69  atic void setJoi
2160: 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69  nExpr(Expr *p, i
2170: 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68  nt iTable){.  wh
2180: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78  ile( p ){.    Ex
2190: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c  prSetProperty(p,
21a0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
21b0: 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e     p->iRightJoin
21c0: 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
21d0: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
21e0: 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  p->pLeft, iTable
21f0: 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  );.    p = p->pR
2200: 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a  ight;.  } .}../*
2210: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2220: 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a   processes the j
2230: 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oin information 
2240: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
2250: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e  tement..** ON an
2260: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
2270: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  are converted in
2280: 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  to extra terms o
2290: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
22a0: 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a  se..** NATURAL j
22b0: 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65  oins also create
22c0: 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61   extra WHERE cla
22d0: 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a  use terms..**.**
22e0: 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20   The terms of a 
22f0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20  FROM clause are 
2300: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
2310: 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72   Select.pSrc str
2320: 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c  ucture..** The l
2330: 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69  eft most table i
2340: 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  s the first entr
2350: 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63  y in Select.pSrc
2360: 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
2370: 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68  t.** table is th
2380: 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54  e last entry.  T
2390: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
23a0: 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20   is held in the 
23b0: 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20  entry to.** the 
23c0: 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72  left.  Thus entr
23d0: 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  y 0 contains the
23e0: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66   join operator f
23f0: 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77  or the join betw
2400: 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30  een.** entries 0
2410: 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20   and 1.  Any ON 
2420: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
2430: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2440: 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a   the join are.**
2450: 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74   also attached t
2460: 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79  o the left entry
2470: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2480: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
2490: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
24a0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  s encountered..*
24b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
24c0: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50  iteProcessJoin(P
24d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
24e0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  lect *p){.  SrcL
24f0: 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
2500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2510: 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
2520: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2530: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2560: 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  rs */.  struct S
2570: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65  rcList_item *pLe
2580: 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20  ft;     /* Left 
2590: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
25a0: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ed */.  struct S
25b0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69  rcList_item *pRi
25c0: 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74  ght;    /* Right
25d0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
25e0: 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d  ned */..  pSrc =
25f0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66   p->pSrc;.  pLef
2600: 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b  t = &pSrc->a[0];
2610: 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65  .  pRight = &pLe
2620: 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ft[1];.  for(i=0
2630: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ; i<pSrc->nSrc-1
2640: 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c  ; i++, pRight++,
2650: 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54   pLeft++){.    T
2660: 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20 3d  able *pLeftTab =
2670: 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20   pLeft->pTab;.  
2680: 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54    Table *pRightT
2690: 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61  ab = pRight->pTa
26a0: 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65 66  b;..    if( pLef
26b0: 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68  tTab==0 || pRigh
26c0: 74 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  tTab==0 ) contin
26d0: 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  ue;..    /* When
26e0: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
26f0: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c  word is present,
2700: 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73   add WHERE claus
2710: 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20  e terms for.    
2720: 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ** every column 
2730: 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62  that the two tab
2740: 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d  les have in comm
2750: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
2760: 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74  f( pRight->joint
2770: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
2780: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
2790: 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69  ight->pOn || pRi
27a0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
27b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
27c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
27d0: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d  a NATURAL join m
27e0: 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20  ay not have ".  
27f0: 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20           "an ON 
2800: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22  or USING clause"
2810: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
2820: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
2830: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2840: 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43 6f 6c 3b  <pLeftTab->nCol;
2850: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
2860: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 65  har *zName = pLe
2870: 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  ftTab->aCol[j].z
2880: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
2890: 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52  ( columnIndex(pR
28a0: 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3e  ightTab, zName)>
28b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
28c0: 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61  addWhereTerm(pPa
28d0: 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c 65 66  rse, zName, pLef
28e0: 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c  tTab, pLeft->zAl
28f0: 69 61 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ias, .          
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 20 20 70 52 69 67 68 74 54 61 62 2c 20 70      pRightTab, p
2920: 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20  Right->zAlias,. 
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
2950: 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26 70  ght->iCursor, &p
2960: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
2970: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a       .        }.
2980: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2990: 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62     /* Disallow b
29a0: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
29b0: 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20   clauses in the 
29c0: 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f  same join.    */
29d0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
29e0: 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e  >pOn && pRight->
29f0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2a00: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2a10: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
2a20: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
2a30: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
2a40: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
2a50: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
2a60: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2a70: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
2a80: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
2a90: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2aa0: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
2ab0: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
2ac0: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
2ad0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
2ae0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b  ( pRight->pOn ){
2af0: 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  .      setJoinEx
2b00: 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20  pr(pRight->pOn, 
2b10: 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29  pRight->iCursor)
2b20: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72  ;.      p->pWher
2b30: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
2b40: 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
2b50: 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68 74  ->pWhere, pRight
2b60: 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52  ->pOn);.      pR
2b70: 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20  ight->pOn = 0;. 
2b80: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
2b90: 61 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20  ate extra terms 
2ba0: 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  on the WHERE cla
2bb0: 75 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  use for each col
2bc0: 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a  umn named.    **
2bd0: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
2be0: 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20  ause.  Example: 
2bf0: 49 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  If the two table
2c00: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61  s to be joined a
2c10: 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64  re .    ** A and
2c20: 20 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47   B and the USING
2c30: 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c   clause names X,
2c40: 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20   Y, and Z, then 
2c50: 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  add this.    ** 
2c60: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
2c70: 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20  use:    A.X=B.X 
2c80: 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20  AND A.Y=B.Y AND 
2c90: 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52  A.Z=B.Z.    ** R
2ca0: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69  eport an error i
2cb0: 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e  f any column men
2cc0: 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53  tioned in the US
2cd0: 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20  ING clause is.  
2ce0: 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e    ** not contain
2cf0: 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  ed in both table
2d00: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a  s to be joined..
2d10: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2d20: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
2d30: 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70  .      IdList *p
2d40: 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70  List = pRight->p
2d50: 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72  Using;.      for
2d60: 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e  (j=0; j<pList->n
2d70: 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; j++){.      
2d80: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
2d90: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
2da0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  e;.        if( c
2db0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74  olumnIndex(pLeft
2dc0: 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c  Tab, zName)<0 ||
2dd0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69   columnIndex(pRi
2de0: 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30  ghtTab, zName)<0
2df0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2e00: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2e10: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f  arse, "cannot jo
2e20: 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20  in using column 
2e30: 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20  %s - column ".  
2e40: 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70            "not p
2e50: 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74  resent in both t
2e60: 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ables", zName);.
2e70: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2e80: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2e90: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
2ea0: 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  rm(pParse, zName
2eb0: 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66  , pLeftTab, pLef
2ec0: 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20  t->zAlias, .    
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61          pRightTa
2ef0: 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61  b, pRight->zAlia
2f00: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2f20: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20  Right->iCursor, 
2f30: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
2f40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2f50: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2f60: 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20  .** Insert code 
2f70: 69 6e 74 6f 20 22 76 22 20 74 68 61 74 20 77 69  into "v" that wi
2f80: 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63 6f  ll push the reco
2f90: 72 64 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  rd on the top of
2fa0: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e   the.** stack in
2fb0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
2fc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
2fd0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
2fe0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2ff0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
3000: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
3010: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
3020: 2c 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  ,    /* The ORDE
3030: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
3040: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
3050: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77  ,       /* The w
3060: 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74  hole SELECT stat
3070: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ement */.  int r
3080: 65 67 44 61 74 61 20 20 20 20 20 20 20 20 20 20  egData          
3090: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
30a0: 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65  lding data to be
30b0: 20 73 6f 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20   sorted */.){.  
30c0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
30d0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6e  ->pVdbe;.  int n
30e0: 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
30f0: 3e 6e 45 78 70 72 3b 0a 20 20 69 6e 74 20 72 65  >nExpr;.  int re
3100: 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47  gBase = sqlite3G
3110: 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
3120: 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20  se, nExpr+2);.  
3130: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
3140: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
3150: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
3160: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
3170: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72  List(pParse, pOr
3180: 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 29 3b  derBy, regBase);
3190: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
31a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
31b0: 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  nce, pOrderBy->i
31c0: 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65  ECursor, regBase
31d0: 2b 6e 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74  +nExpr);.  sqlit
31e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
31f0: 4f 50 5f 4d 6f 76 65 2c 20 72 65 67 44 61 74 61  OP_Move, regData
3200: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b  , regBase+nExpr+
3210: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
3220: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
3230: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73  keRecord, regBas
3240: 65 2c 20 6e 45 78 70 72 20 2b 20 32 2c 20 72 65  e, nExpr + 2, re
3250: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
3260: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3270: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
3280: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
3290: 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  r, regRecord);. 
32a0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
32b0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
32c0: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
32d0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
32e0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
32f0: 42 61 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a  Base, nExpr+2);.
3300: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69    if( pSelect->i
3310: 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20  Limit>=0 ){.    
3320: 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
3330: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74  ;.    int iLimit
3340: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
3350: 74 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  t->pOffset ){.  
3360: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65      iLimit = pSe
3370: 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b  lect->iOffset+1;
3380: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3390: 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65    iLimit = pSele
33a0: 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  ct->iLimit;.    
33b0: 7d 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  }.    addr1 = sq
33c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
33d0: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
33e0: 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
33f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3400: 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69  OP_AddImm, iLimi
3410: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
3420: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
3430: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
3440: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3450: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3460: 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr1);.    sqlite
3470: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
3480: 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79  P_Last, pOrderBy
3490: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
34a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34b0: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
34c0: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
34d0: 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sor);.    sqlite
34e0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
34f0: 20 61 64 64 72 32 29 3b 0a 20 20 20 20 70 53 65   addr2);.    pSe
3500: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d  lect->iLimit = -
3510: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
3520: 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c  Add code to impl
3530: 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54  ement the OFFSET
3540: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3550: 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64  codeOffset(.  Vd
3560: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
3570: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
3580: 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f   into this VM */
3590: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
35a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
35b0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
35c0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
35d0: 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20  t iContinue     
35e0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
35f0: 73 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74  skip the current
3600: 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
3610: 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e 3d  if( p->iOffset>=
3620: 30 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d  0 && iContinue!=
3630: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  0 ){.    int add
3640: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  r;.    sqlite3Vd
3650: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
3660: 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66 73 65  ddImm, p->iOffse
3670: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
3680: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
3690: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 65 67  dOp1(v, OP_IfNeg
36a0: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20  , p->iOffset);. 
36b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
36d0: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
36e0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
36f0: 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45 54  (v, "skip OFFSET
3700: 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20   records"));.   
3710: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
3720: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
3730: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
3740: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
3750: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
3760: 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72  e the N register
3770: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d  s starting at iM
3780: 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73  em.** form a dis
3790: 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54  tinct entry.  iT
37a0: 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20  ab is a sorting 
37b0: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
37c0: 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73   previously.** s
37d0: 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  een combinations
37e0: 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73   of the N values
37f0: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
3800: 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a  s made in iTab.*
3810: 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  * if the current
3820: 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65   N values are ne
3830: 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  w..**.** A jump 
3840: 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73  to addrRepeat is
3850: 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b   made and the N+
3860: 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70  1 values are pop
3870: 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ped from the.** 
3880: 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70  stack if the top
3890: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20   N elements are 
38a0: 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f  not distinct..*/
38b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
38c0: 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72  eDistinct(.  Par
38d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
38e0: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
38f0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
3900: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
3910: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
3920: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
3930: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
3940: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
3950: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
3960: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
3970: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
3980: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
3990: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
39a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
39b0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
39c0: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem           /*
39d0: 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a   First element *
39e0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  /.){.  Vdbe *v;.
39f0: 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d    int r1;..  v =
3a00: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
3a10: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
3a20: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
3a30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3a40: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
3a50: 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c  Record, iMem, N,
3a60: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   r1);.  sqlite3V
3a70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
3a80: 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64  Found, iTab, add
3a90: 72 52 65 70 65 61 74 2c 20 72 31 29 3b 0a 20 20  rRepeat, r1);.  
3aa0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3ab0: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
3ac0: 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20  t, iTab, r1);.  
3ad0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
3ae0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
3af0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
3b00: 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rate an error me
3b10: 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c  ssage when a SEL
3b20: 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74 68  ECT is used with
3b30: 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73 69  in a subexpressi
3b40: 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20  on.** (example: 
3b50: 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a   "a IN (SELECT *
3b60: 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62   FROM table)") b
3b70: 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74  ut it has more t
3b80: 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20  han 1 result.** 
3b90: 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74  column.  We do t
3ba0: 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74  his in a subrout
3bb0: 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ine because the 
3bc0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
3bd0: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 70 6c 61 63  multiple.** plac
3be0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
3bf0: 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  t checkForMultiC
3c00: 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
3c10: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3c20: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
3c30: 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20  e context. */.  
3c40: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
3c50: 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74  t,   /* Destinat
3c60: 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65  ion of SELECT re
3c70: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  sults */.  int n
3c80: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
3c90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
3ca0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75  ult columns retu
3cb0: 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a  rned by SELECT *
3cc0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74  /.){.  int eDest
3cd0: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
3ce0: 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26  .  if( nExpr>1 &
3cf0: 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  & (eDest==SRT_Me
3d00: 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
3d10: 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Set) ){.    sqli
3d20: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3d30: 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  se, "only a sing
3d40: 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
3d50: 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
3d60: 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
3d70: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
3d80: 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65  ession");.    re
3d90: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
3da0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3db0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
3dc0: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
3dd0: 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
3de0: 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68  the inside of th
3df0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
3e00: 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  of a SELECT..**.
3e10: 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e 64  ** If srcTab and
3e20: 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74   nColumn are bot
3e30: 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  h zero, then the
3e40: 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69   pEList expressi
3e50: 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75  ons.** are evalu
3e60: 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
3e70: 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f   get the data fo
3e80: 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20  r this row.  If 
3e90: 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65  nColumn>0.** the
3ea0: 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64  n data is pulled
3eb0: 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64   from srcTab and
3ec0: 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20   pEList is used 
3ed0: 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a  only to get the.
3ee0: 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f 72  ** datatypes for
3ef0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
3f00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
3f10: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
3f20: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3f30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
3f40: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
3f50: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
3f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
3f70: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
3f80: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
3f90: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
3fa0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
3fb0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
3fc0: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
3fd0: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
3fe0: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
3ff0: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
4000: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
4010: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
4020: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n,            /*
4030: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
4040: 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65  ns in the source
4050: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
4060: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
4070: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
4080: 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73  LL, sort results
4090: 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20   using this key 
40a0: 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63  */.  int distinc
40b0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
40c0: 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72  If >=0, make sur
40d0: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
40e0: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 53 65 6c 65  stinct */.  Sele
40f0: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
4100: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
4110: 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
4120: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ults */.  int iC
4130: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20  ontinue,        
4140: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
4150: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
4160: 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  next row */.  in
4170: 74 20 69 42 72 65 61 6b 2c 20 20 20 20 20 20 20  t iBreak,       
4180: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4190: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
41a0: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
41b0: 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66  p */.  char *aff
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
41d0: 2a 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  * affinity strin
41e0: 67 20 69 66 20 65 44 65 73 74 20 69 73 20 53 52  g if eDest is SR
41f0: 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  T_Union */.){.  
4200: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
4210: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
4220: 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69  ;.  int hasDisti
4230: 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nct;        /* T
4240: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
4250: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
4260: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
4270: 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20  regResult;      
4280: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
4290: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69   of memory holdi
42a0: 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  ng result set */
42b0: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
42c0: 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f  Dest->eDest;   /
42d0: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
42e0: 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20   of results */. 
42f0: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
4300: 73 74 2d 3e 69 50 61 72 6d 3b 20 20 20 2f 2a 20  st->iParm;   /* 
4310: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
4320: 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  o disposal metho
4330: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75  d */.  int nResu
4340: 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  ltCol;          
4350: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4360: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
4370: 2f 0a 20 20 69 6e 74 20 6e 54 6f 46 72 65 65 3b  /.  int nToFree;
4380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4390: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
43a0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 72  ult columns to r
43b0: 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 69 66 28  elease */..  if(
43c0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
43d0: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
43e0: 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  !=0 );..  /* If 
43f0: 74 68 65 72 65 20 77 61 73 20 61 20 4c 49 4d 49  there was a LIMI
4400: 54 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  T clause on the 
4410: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4420: 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 63 68  , then do the ch
4430: 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20  eck.  ** to see 
4440: 69 66 20 74 68 69 73 20 72 6f 77 20 73 68 6f 75  if this row shou
4450: 6c 64 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ld be output..  
4460: 2a 2f 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  */.  hasDistinct
4470: 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 20 26   = distinct>=0 &
4480: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
4490: 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  0;.  if( pOrderB
44a0: 79 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74  y==0 && !hasDist
44b0: 69 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f 64 65  inct ){.    code
44c0: 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f  Offset(v, p, iCo
44d0: 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20  ntinue);.  }..  
44e0: 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75  /* Pull the requ
44f0: 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ested columns.. 
4500: 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d   */.  if( nColum
4510: 6e 3e 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 75  n>0 ){.    nResu
4520: 6c 74 43 6f 6c 20 3d 20 6e 43 6f 6c 75 6d 6e 3b  ltCol = nColumn;
4530: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52  .  }else{.    nR
4540: 65 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73  esultCol = pELis
4550: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20  t->nExpr;.  }.  
4560: 69 66 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3e  if( pDest->iMem>
4570: 30 20 29 7b 0a 20 20 20 20 72 65 67 52 65 73 75  0 ){.    regResu
4580: 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 4d 65 6d  lt = pDest->iMem
4590: 3b 0a 20 20 20 20 6e 54 6f 46 72 65 65 20 3d 20  ;.    nToFree = 
45a0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
45b0: 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 72 65  pDest->iMem = re
45c0: 67 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65  gResult = sqlite
45d0: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
45e0: 61 72 73 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  arse, nResultCol
45f0: 29 3b 0a 20 20 20 20 6e 54 6f 46 72 65 65 20 3d  );.    nToFree =
4600: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
4610: 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30  .  if( nColumn>0
4620: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
4630: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
4640: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
4650: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4660: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
4670: 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b  i, regResult+i);
4680: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
4690: 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78  f( eDest!=SRT_Ex
46a0: 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ists ){.    /* I
46b0: 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
46c0: 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e  n is an EXISTS(.
46d0: 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ..) expression, 
46e0: 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a  the actual.    *
46f0: 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65  * values returne
4700: 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
4710: 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64  are not required
4720: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
4730: 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43  (i=0; i<nResultC
4740: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
4750: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
4760: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
4770: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 72 65 67 52  a[i].pExpr, regR
4780: 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 7d 0a  esult+i);.    }.
4790: 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20    }.  nColumn = 
47a0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 2f  nResultCol;..  /
47b0: 2a 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43  * If the DISTINC
47c0: 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72  T keyword was pr
47d0: 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c  esent on the SEL
47e0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
47f0: 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20  ** and this row 
4800: 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65  has been seen be
4810: 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  fore, then do no
4820: 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a  t make this row.
4830: 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65    ** part of the
4840: 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20   result..  */.  
4850: 69 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20  if( hasDistinct 
4860: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4870: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  EList!=0 );.    
4880: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e  assert( pEList->
4890: 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20 29  nExpr==nColumn )
48a0: 3b 0a 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e  ;.    codeDistin
48b0: 63 74 28 70 50 61 72 73 65 2c 20 64 69 73 74 69  ct(pParse, disti
48c0: 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  nct, iContinue, 
48d0: 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65 73 75  nColumn, regResu
48e0: 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72  lt);.    if( pOr
48f0: 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
4900: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
4910: 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  p, iContinue);. 
4920: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
4930: 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c  checkForMultiCol
4940: 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70  umnSelectError(p
4950: 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45  Parse, pDest, pE
4960: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
4970: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
4980: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
4990: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
49a0: 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65  is mode, write e
49b0: 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ach query result
49c0: 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74   to the key of t
49d0: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
49e0: 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e   ** table iParm.
49f0: 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
4a00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
4a10: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20  OUND_SELECT.    
4a20: 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20  case SRT_Union: 
4a30: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a  {.      int r1;.
4a40: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
4a50: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
4a60: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
4a70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4a80: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4a90: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
4aa0: 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 69  mn, r1);.      i
4ab0: 66 28 20 61 66 66 20 29 7b 0a 20 20 20 20 20 20  f( aff ){.      
4ac0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
4ad0: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 61 66 66  ngeP4(v, -1, aff
4ae0: 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
4af0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
4b00: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4b10: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
4b20: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
4b30: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
4b40: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
4b50: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
4b60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
4b70: 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72  onstruct a recor
4b80: 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79  d from the query
4b90: 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73   result, but ins
4ba0: 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73  tead of.    ** s
4bb0: 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72  aving that recor
4bc0: 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b  d, use it as a k
4bd0: 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65  ey to delete ele
4be0: 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a  ments from.    *
4bf0: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
4c00: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
4c10: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
4c20: 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20  _Except: {.     
4c30: 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72   int r1;.      r
4c40: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
4c50: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
4c60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4c70: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
4c80: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
4c90: 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29  lt, nColumn, r1)
4ca0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4cb0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
4cc0: 31 2c 20 61 66 66 2c 20 50 34 5f 53 54 41 54 49  1, aff, P4_STATI
4cd0: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
4ce0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4cf0: 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61  P_IdxDelete, iPa
4d00: 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  rm, r1);.      s
4d10: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
4d20: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
4d30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4d40: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
4d50: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
4d60: 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
4d70: 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
4d80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
4d90: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
4da0: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
4db0: 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
4dc0: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
4dd0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
4de0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4df0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
4e00: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
4e10: 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29  lt, nColumn, r1)
4e20: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
4e30: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
4e40: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
4e50: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
4e60: 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d   p, r1);.      }
4e70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
4e80: 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
4e90: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
4ea0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4eb0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4ec0: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
4ed0: 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  m, r2);.        
4ee0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4ef0: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
4f00: 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  iParm, r1, r2);.
4f10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4f20: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
4f30: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
4f40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
4f50: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
4f60: 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
4f70: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  }.      sqlite3R
4f80: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
4f90: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
4fa0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
4fb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4fc0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
4fd0: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
4fe0: 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
4ff0: 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
5000: 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72  ECT ...)" constr
5010: 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  uct,.    ** then
5020: 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   there should be
5030: 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f   a single item o
5040: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72  n the stack.  Wr
5050: 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ite this.    ** 
5060: 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65  item into the se
5070: 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67  t table with bog
5080: 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  us data..    */.
5090: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
50a0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
50b0: 64 72 32 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  dr2;..      asse
50c0: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
50d0: 3b 0a 20 20 20 20 20 20 61 64 64 72 32 20 3d 20  ;.      addr2 = 
50e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
50f0: 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
5100: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
5110: 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20    p->affinity = 
5120: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
5130: 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61  finity(pEList->a
5140: 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74  [0].pExpr, pDest
5150: 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20  ->affinity);.   
5160: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
5170: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
5180: 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f   first glance yo
5190: 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65  u would think we
51a0: 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20   could optimize 
51b0: 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  out the.        
51c0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74  ** ORDER BY in t
51d0: 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74  his case since t
51e0: 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72  he order of entr
51f0: 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20  ies in the set. 
5200: 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e         ** does n
5210: 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20  ot matter.  But 
5220: 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61  there might be a
5230: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69   LIMIT clause, i
5240: 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  n which.        
5250: 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65  ** case the orde
5260: 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f  r does matter */
5270: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
5280: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
5290: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67  pOrderBy, p, reg
52a0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
52b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
52c0: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
52d0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
52e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
52f0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
5300: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
5310: 67 52 65 73 75 6c 74 2c 20 31 2c 20 72 31 2c 20  gResult, 1, r1, 
5320: 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29  &p->affinity, 1)
5330: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5340: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5350: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
5360: 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  rm, r1);.       
5370: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5380: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5390: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
53a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
53b0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b  pHere(v, addr2);
53c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
53d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
53e0: 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20  ny row exist in 
53f0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
5400: 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74  record that fact
5410: 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20   and abort..    
5420: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
5430: 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20  Exists: {.      
5440: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5450: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
5460: 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20   1, iParm);.    
5470: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
5480: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
5490: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
54a0: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
54b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
54c0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
54d0: 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
54e0: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
54f0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
5500: 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
5510: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
5520: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
5530: 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
5540: 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
5550: 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
5560: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5570: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
5580: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
5590: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  n==1 );.      if
55a0: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
55b0: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
55c0: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
55d0: 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73  derBy, p, regRes
55e0: 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ult);.      }els
55f0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
5600: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5610: 4f 50 5f 4d 6f 76 65 2c 20 72 65 67 52 65 73 75  OP_Move, regResu
5620: 6c 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20  lt, iParm);.    
5630: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
5640: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
5650: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
5660: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
5670: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
5680: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
5690: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
56a0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
56b0: 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68  ..    /* Send th
56c0: 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61  e data to the ca
56d0: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
56e0: 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  or to a subrouti
56f0: 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20  ne.  In the.    
5700: 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75 62  ** case of a sub
5710: 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62  routine, the sub
5720: 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69  routine itself i
5730: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
5740: 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67  r.    ** popping
5750: 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74   the data from t
5760: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f  he stack..    */
5770: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 75  .    case SRT_Su
5780: 62 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61  broutine:.    ca
5790: 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a  se SRT_Callback:
57a0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72   {.      if( pOr
57b0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
57c0: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
57d0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
57e0: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
57f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5800: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5810: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c   regResult, nCol
5820: 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  umn, r1);.      
5830: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
5840: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
5850: 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20  y, p, r1);.     
5860: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
5870: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
5880: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   r1);.      }els
5890: 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54  e if( eDest==SRT
58a0: 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20  _Subroutine ){. 
58b0: 20 20 20 20 20 20 20 6e 54 6f 46 72 65 65 20 3d         nToFree =
58c0: 20 30 3b 20 20 2f 2a 20 50 72 65 73 65 72 76 65   0;  /* Preserve
58d0: 20 72 65 67 69 73 74 65 72 73 2e 20 53 75 62 72   registers. Subr
58e0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 65 65 64  outine will need
58f0: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 20 20 20 20   them. */.      
5900: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5910: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
5920: 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20   0, iParm);.    
5930: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5940: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5950: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
5960: 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  ow, regResult, n
5970: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
5980: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5990: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
59a0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
59b0: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
59c0: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
59d0: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
59e0: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
59f0: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
5a00: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
5a10: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
5a20: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
5a30: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
5a40: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
5a50: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
5a60: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
5a70: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
5a80: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
5a90: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
5aa0: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
5ab0: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
5ac0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
5ad0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
5ae0: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
5af0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5b00: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
5b10: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
5b20: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
5b30: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
5b40: 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f  is reached..  */
5b50: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
5b60: 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d  >=0 && pOrderBy=
5b70: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
5b80: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5b90: 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69  P_AddImm, p->iLi
5ba0: 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71  mit, -1);.    sq
5bb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5bc0: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
5bd0: 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29  >iLimit, iBreak)
5be0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  ;.  }.  sqlite3R
5bf0: 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
5c00: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
5c10: 74 2c 20 6e 54 6f 46 72 65 65 29 3b 0a 7d 0a 0a  t, nToFree);.}..
5c20: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65  /*.** Given an e
5c30: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
5c40: 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e  generate a KeyIn
5c50: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
5c60: 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  t records.** the
5c70: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
5c80: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78 70  nce for each exp
5c90: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20  ression in that 
5ca0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
5cb0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78  .**.** If the Ex
5cc0: 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44  prList is an ORD
5cd0: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
5ce0: 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68  Y clause then th
5cf0: 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b  e resulting.** K
5d00: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5d10: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
5d20: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
5d30: 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
5d40: 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
5d50: 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49   that clause.  I
5d60: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
5d70: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
5d80: 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20   of a SELECT.** 
5d90: 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f  then the KeyInfo
5da0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
5db0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
5dc0: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
5dd0: 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  tual.** index to
5de0: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53   implement a DIS
5df0: 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a  TINCT test..**.*
5e00: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
5e10: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
5e20: 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 20  cture is obtain 
5e30: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68  from malloc.  Th
5e40: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
5e50: 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
5e60: 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20  ible for seeing 
5e70: 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74  that this struct
5e80: 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ure is eventuall
5e90: 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41 64 64  y.** freed.  Add
5ea0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
5eb0: 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 50 34  ucture to the P4
5ec0: 20 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70 63   field of an opc
5ed0: 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50 34 5f  ode using.** P4_
5ee0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
5ef0: 69 73 20 74 68 65 20 75 73 75 61 6c 20 77 61 79  is the usual way
5f00: 20 6f 66 20 64 65 61 6c 69 6e 67 20 77 69 74 68   of dealing with
5f10: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
5f20: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
5f30: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 50 61  oFromExprList(Pa
5f40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
5f50: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
5f60: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5f70: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
5f80: 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66   nExpr;.  KeyInf
5f90: 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75  o *pInfo;.  stru
5fa0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
5fb0: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
5fc0: 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69  ;..  nExpr = pLi
5fd0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
5fe0: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
5ff0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
6000: 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 45  eof(*pInfo) + nE
6010: 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  xpr*(sizeof(Coll
6020: 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66  Seq*)+1) );.  if
6030: 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70  ( pInfo ){.    p
6040: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
6050: 20 3d 20 28 75 38 2a 29 26 70 49 6e 66 6f 2d 3e   = (u8*)&pInfo->
6060: 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20  aColl[nExpr];.  
6070: 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20    pInfo->nField 
6080: 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20 70 49 6e  = nExpr;.    pIn
6090: 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  fo->enc = ENC(db
60a0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  );.    for(i=0, 
60b0: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
60c0: 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  i<nExpr; i++, pI
60d0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f  tem++){.      Co
60e0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
60f0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
6100: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
6110: 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
6120: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
6130: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
6140: 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44    pColl = db->pD
6150: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
6160: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  .      pInfo->aC
6170: 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  oll[i] = pColl;.
6180: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f        pInfo->aSo
6190: 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 74  rtOrder[i] = pIt
61a0: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
61b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
61c0: 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pInfo;.}.../*.
61d0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
61e0: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
61f0: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
6200: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
6210: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
6220: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
6230: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
6240: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
6250: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
6260: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
6270: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
6280: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
6290: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
62a0: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
62b0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
62c0: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
62d0: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
62e0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
62f0: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
6300: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
6310: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
6320: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
6330: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
6340: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
6350: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
6360: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
6370: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
6380: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  VDBE */.  int nC
6390: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e  olumn,      /* N
63a0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
63b0: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65   of data */.  Se
63c0: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
63d0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72  /* Write the sor
63e0: 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65  ted results here
63f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 72 6b   */.){.  int brk
6400: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
6410: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e  keLabel(v);.  in
6420: 74 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  t cont = sqlite3
6430: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
6440: 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  ;.  int addr;.  
6450: 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e 74 20  int iTab;.  int 
6460: 70 73 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a 20  pseudoTab = 0;. 
6470: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
6480: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
6490: 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73 74 20  y;..  int eDest 
64a0: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a  = pDest->eDest;.
64b0: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44    int iParm = pD
64c0: 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20 20 69  est->iParm;..  i
64d0: 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74  nt regRow;.  int
64e0: 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54   regRowid;..  iT
64f0: 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69  ab = pOrderBy->i
6500: 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65  ECursor;.  if( e
6510: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
6520: 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ck || eDest==SRT
6530: 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20  _Subroutine ){. 
6540: 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70     pseudoTab = p
6550: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
6560: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6570: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp2(v, OP_OpenP
6580: 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62  seudo, pseudoTab
6590: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
65a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
65b0: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
65c0: 20 70 73 65 75 64 6f 54 61 62 2c 20 6e 43 6f 6c   pseudoTab, nCol
65d0: 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72  umn);.  }.  addr
65e0: 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
65f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
6600: 6f 72 74 2c 20 69 54 61 62 2c 20 62 72 6b 29 3b  ort, iTab, brk);
6610: 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
6620: 20 70 2c 20 63 6f 6e 74 29 3b 0a 20 20 72 65 67   p, cont);.  reg
6630: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Row = sqlite3Get
6640: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
6650: 0a 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71  .  regRowid = sq
6660: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
6670: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
6680: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6690: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
66a0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
66b0: 20 2b 20 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20   + 1, regRow);. 
66c0: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
66d0: 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  {.    case SRT_T
66e0: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
66f0: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
6700: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6710: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
6720: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65  Rowid, iParm, re
6730: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
6740: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6750: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
6760: 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65  Parm, regRow, re
6770: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
6780: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6790: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
67a0: 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61  END);.      brea
67b0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
67c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
67d0: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53  QUERY.    case S
67e0: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
67f0: 69 6e 74 20 6a 31 3b 0a 20 20 20 20 20 20 61 73  int j1;.      as
6800: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
6810: 20 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73   );.      j1 = s
6820: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
6830: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
6840: 65 67 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71  egRow);.      sq
6850: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
6860: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
6870: 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67  , regRow, 1, reg
6880: 52 6f 77 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74  Row, &p->affinit
6890: 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  y, 1);.      sql
68a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
68b0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
68c0: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 29 3b 0a  iParm, regRow);.
68d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
68e0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
68f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6900: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
6910: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
6920: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
6930: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
6940: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6950: 4f 50 5f 4d 6f 76 65 2c 20 72 65 67 52 6f 77 2c  OP_Move, regRow,
6960: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f   iParm);.      /
6970: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
6980: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
6990: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
69a0: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
69b0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
69c0: 20 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c     case SRT_Call
69d0: 62 61 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53  back:.    case S
69e0: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b  RT_Subroutine: {
69f0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
6a00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6a10: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
6a20: 67 65 72 2c 20 31 2c 20 72 65 67 52 6f 77 69 64  ger, 1, regRowid
6a30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6a40: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6a50: 5f 49 6e 73 65 72 74 2c 20 70 73 65 75 64 6f 54  _Insert, pseudoT
6a60: 61 62 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52  ab, regRow, regR
6a70: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  owid);.      for
6a80: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
6a90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
6aa0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6ab0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
6ac0: 73 65 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65  seudoTab, i, pDe
6ad0: 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20 20 20  st->iMem+i);.   
6ae0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65     }.      if( e
6af0: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
6b00: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ck ){.        sq
6b10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6b20: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
6b30: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43   pDest->iMem, nC
6b40: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65  olumn);.      }e
6b50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
6b60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6b70: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69  , OP_Gosub, 0, i
6b80: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
6b90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6ba0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
6bb0: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
6bc0: 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72  hing */.      br
6bd0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
6be0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
6bf0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
6c00: 65 67 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65  egRow);.  sqlite
6c10: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
6c20: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
6c30: 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  );..  /* Jump to
6c40: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
6c50: 6c 6f 6f 70 20 77 68 65 6e 20 74 68 65 20 4c 49  loop when the LI
6c60: 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 0a 20  MIT is reached. 
6c70: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69   */.  if( p->iLi
6c80: 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  mit>=0 ){.    sq
6c90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6ca0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d  v, OP_AddImm, p-
6cb0: 3e 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20  >iLimit, -1);.  
6cc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6cd0: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op2(v, OP_IfZero
6ce0: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 62 72 6b  , p->iLimit, brk
6cf0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
6d00: 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
6d10: 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
6d20: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
6d30: 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73  el(v, cont);.  s
6d40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6d50: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
6d60: 62 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  b, addr);.  sqli
6d70: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
6d80: 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 69  bel(v, brk);.  i
6d90: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
6da0: 6c 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d  llback || eDest=
6db0: 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20  =SRT_Subroutine 
6dc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
6dd0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
6de0: 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62 2c  lose, pseudoTab,
6df0: 20 30 29 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a   0);.  }..}../*.
6e00: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
6e10: 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
6e20: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27  containing the '
6e30: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
6e40: 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  ' of the.** expr
6e50: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68  ession pExpr. Th
6e60: 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20  e string may be 
6e70: 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69  treated as stati
6e80: 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  c by the caller.
6e90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  .**.** The decla
6ea0: 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74  ration type is t
6eb0: 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70  he exact datatyp
6ec0: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74  e definition ext
6ed0: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  racted from the.
6ee0: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41  ** original CREA
6ef0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
6f00: 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  nt if the expres
6f10: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
6f20: 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61  . The.** declara
6f30: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20  tion type for a 
6f40: 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49  ROWID field is I
6f50: 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20  NTEGER. Exactly 
6f60: 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  when an expressi
6f70: 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  on.** is conside
6f80: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e  red a column can
6f90: 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74   be complex in t
6fa0: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73  he presence of s
6fb0: 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a  ubqueries. The.*
6fc0: 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  * result-set exp
6fd0: 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f  ression in all o
6fe0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
6ff0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7000: 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65  s is .** conside
7010: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20  red a column by 
7020: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
7030: 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f  *.**   SELECT co
7040: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
7050: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
7060: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
7070: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
7080: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b  T col FROM tbl);
7090: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63  .**   SELECT abc
70a0: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f   FROM (SELECT co
70b0: 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62  l AS abc FROM tb
70c0: 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64  l);.** .** The d
70d0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
70e0: 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69  for any expressi
70f0: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  on other than a 
7100: 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a  column is NULL..
7110: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
7120: 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65  char *columnType
7130: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
7140: 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70  *pNC, .  Expr *p
7150: 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Expr,.  const ch
7160: 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44 62 2c  ar **pzOriginDb,
7170: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
7180: 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20 20 63  pzOriginTab,.  c
7190: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
71a0: 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68 61  iginCol.){.  cha
71b0: 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d  r const *zType =
71c0: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
71d0: 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20 30 3b   *zOriginDb = 0;
71e0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
71f0: 4f 72 69 67 69 6e 54 61 62 20 3d 20 30 3b 0a 20  OriginTab = 0;. 
7200: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
7210: 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  iginCol = 0;.  i
7220: 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70 45 78 70  nt j;.  if( pExp
7230: 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70 53 72  r==0 || pNC->pSr
7240: 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  cList==0 ) retur
7250: 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  n 0;..  switch( 
7260: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
7270: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
7280: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
7290: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
72a0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
72b0: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
72c0: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
72d0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62   the column is b
72e0: 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78  eing.      ** ex
72f0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20  tracted from in 
7300: 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63  NameContext.pSrc
7310: 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65  List. This table
7320: 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20   may be real.   
7330: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74     ** database t
7340: 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65  able or a subque
7350: 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ry..      */.   
7360: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
7370: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
7380: 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  * Table structur
7390: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
73a0: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
73b0: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
73c0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
73d0: 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f  /* Select the co
73e0: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
73f0: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
7400: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
7410: 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49  ->iColumn;  /* I
7420: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  ndex of column i
7430: 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20  n pTab */.      
7440: 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70  while( pNC && !p
7450: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53  Tab ){.        S
7460: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
7470: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
7480: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
7490: 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  0;j<pTabList->nS
74a0: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
74b0: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45  a[j].iCursor!=pE
74c0: 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29  xpr->iTable;j++)
74d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  ;.        if( j<
74e0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
74f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  {.          pTab
7500: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
7510: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ].pTab;.        
7520: 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d    pS = pTabList-
7530: 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[j].pSelect;. 
7540: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7550: 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e          pNC = pN
7560: 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  C->pNext;.      
7570: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
7580: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
7590: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 49 58  {.        /* FIX
75a0: 20 4d 45 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20   ME:.        ** 
75b0: 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72 73 20  This can occurs 
75c0: 69 66 20 79 6f 75 20 68 61 76 65 20 73 6f 6d 65  if you have some
75d0: 74 68 69 6e 67 20 6c 69 6b 65 20 22 53 45 4c 45  thing like "SELE
75e0: 43 54 20 6e 65 77 2e 78 3b 22 20 69 6e 73 69 64  CT new.x;" insid
75f0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74  e.        ** a t
7600: 72 69 67 67 65 72 2e 20 20 49 6e 20 6f 74 68 65  rigger.  In othe
7610: 72 20 77 6f 72 64 73 2c 20 69 66 20 79 6f 75 20  r words, if you 
7620: 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 70  reference the sp
7630: 65 63 69 61 6c 20 22 6e 65 77 22 0a 20 20 20 20  ecial "new".    
7640: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 6e 20      ** table in 
7650: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
7660: 66 20 61 20 73 65 6c 65 63 74 2e 20 20 57 65 20  f a select.  We 
7670: 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 67 6f  do not have a go
7680: 6f 64 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a  od way.        *
7690: 2a 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61 63  * to find the ac
76a0: 74 75 61 6c 20 74 61 62 6c 65 20 74 79 70 65 2c  tual table type,
76b0: 20 73 6f 20 63 61 6c 6c 20 69 74 20 22 54 45 58   so call it "TEX
76c0: 54 22 2e 20 20 54 68 69 73 20 69 73 20 72 65 61  T".  This is rea
76d0: 6c 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  lly.        ** s
76e0: 6f 6d 65 74 68 69 6e 67 20 6f 66 20 61 20 62 75  omething of a bu
76f0: 67 2c 20 62 75 74 20 49 20 64 6f 20 6e 6f 74 20  g, but I do not 
7700: 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 66 69 78 20  know how to fix 
7710: 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  it..        **. 
7720: 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63         ** This c
7730: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f  ode does not pro
7740: 64 75 63 65 20 74 68 65 20 63 6f 72 72 65 63 74  duce the correct
7750: 20 61 6e 73 77 65 72 20 2d 20 69 74 20 6a 75 73   answer - it jus
7760: 74 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20 20  t prevents.     
7770: 20 20 20 2a 2a 20 61 20 73 65 67 66 61 75 6c 74     ** a segfault
7780: 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 31  .  See ticket #1
7790: 32 32 39 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  229..        */.
77a0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
77b0: 22 54 45 58 54 22 3b 0a 20 20 20 20 20 20 20 20  "TEXT";.        
77c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
77d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
77e0: 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab );.      if( 
77f0: 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pS ){.        /*
7800: 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20   The "table" is 
7810: 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73  actually a sub-s
7820: 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20  elect or a view 
7830: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
7840: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  se.        ** of
7850: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
7860: 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68  ement. Return th
7870: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
7880: 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20  pe and origin.  
7890: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f        ** data fo
78a0: 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  r the result-set
78b0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73   column of the s
78c0: 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20  ub-select..     
78d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
78e0: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
78f0: 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  l<pS->pEList->nE
7900: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
7910: 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c   /* If iCol is l
7920: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
7930: 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
7940: 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a  on requests the.
7950: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77            ** row
7960: 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  id of the sub-se
7970: 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68  lect or view. Th
7980: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
7990: 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20   legal (see .   
79a0: 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63         ** test c
79b0: 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d  ase misc2.2.2) -
79c0: 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75   it always evalu
79d0: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20  ates to NULL..  
79e0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
79f0: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
7a00: 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   sNC;.          
7a10: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
7a20: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
7a30: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  xpr;.          s
7a40: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
7a50: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20  ->pSrc;.        
7a60: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b    sNC.pNext = 0;
7a70: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
7a80: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
7a90: 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  rse;.          z
7aa0: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
7ab0: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
7ac0: 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54  ginDb, &zOriginT
7ad0: 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29  ab, &zOriginCol)
7ae0: 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
7af0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61     }else if( pTa
7b00: 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
7b10: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20        /* A real 
7b20: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
7b30: 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a   assert( !pS );.
7b40: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
7b50: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
7b60: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
7b70: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
7b80: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
7b90: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
7ba0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ) );.        if(
7bb0: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
7bc0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
7bd0: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
7be0: 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22    zOriginCol = "
7bf0: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20  rowid";.        
7c00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
7c10: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
7c20: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
7c30: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
7c40: 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  inCol = pTab->aC
7c50: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
7c60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7c70: 20 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 70    zOriginTab = p
7c80: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
7c90: 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61      if( pNC->pPa
7ca0: 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rse ){.         
7cb0: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
7cc0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
7cd0: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
7ce0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
7cf0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
7d00: 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72  inDb = pNC->pPar
7d10: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
7d20: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
7d30: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
7d40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
7d50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7d60: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
7d70: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
7d80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
7d90: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62  ression is a sub
7da0: 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20  -select. Return 
7db0: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
7dc0: 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  type and.      *
7dd0: 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f  * origin info fo
7de0: 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c  r the single col
7df0: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
7e00: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
7e10: 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ECT.      ** sta
7e20: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  tement..      */
7e30: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
7e40: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
7e50: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
7e60: 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
7e70: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
7e80: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
7e90: 72 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72  r;.      sNC.pSr
7ea0: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
7eb0: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78  ;.      sNC.pNex
7ec0: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73  t = pNC;.      s
7ed0: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
7ee0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a  >pParse;.      z
7ef0: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
7f00: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
7f10: 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54  ginDb, &zOriginT
7f20: 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29  ab, &zOriginCol)
7f30: 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
7f40: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
7f50: 0a 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67  .  .  if( pzOrig
7f60: 69 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65  inDb ){.    asse
7f70: 72 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20  rt( pzOriginTab 
7f80: 26 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29  && pzOriginCol )
7f90: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44  ;.    *pzOriginD
7fa0: 62 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20  b = zOriginDb;. 
7fb0: 20 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20     *pzOriginTab 
7fc0: 3d 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20  = zOriginTab;.  
7fd0: 20 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d    *pzOriginCol =
7fe0: 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d   zOriginCol;.  }
7ff0: 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b  .  return zType;
8000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
8010: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
8020: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
8030: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
8040: 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  types of columns
8050: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c  .** in the resul
8060: 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t set..*/.static
8070: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
8080: 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72  lumnTypes(.  Par
8090: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
80a0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
80b0: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
80c0: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
80d0: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
80e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
80f0: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
8100: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
8110: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
8120: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
8130: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
8140: 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f   int i;.  NameCo
8150: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43  ntext sNC;.  sNC
8160: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
8170: 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72  List;.  sNC.pPar
8180: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66  se = pParse;.  f
8190: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
81a0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
81b0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
81c0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
81d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
81e0: 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20  *zOrigDb = 0;.  
81f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
8200: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  rigTab = 0;.    
8210: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
8220: 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 63 6f  gCol = 0;.    co
8230: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
8240: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
8250: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
8260: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
8270: 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  gCol);..    /* T
8280: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
8290: 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  e its own copy o
82a0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
82b0: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
82c0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
82d0: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
82e0: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
82f0: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
8300: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
8310: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
8320: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
8330: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8340: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
8350: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
8360: 20 7a 54 79 70 65 2c 20 50 34 5f 54 52 41 4e 53   zType, P4_TRANS
8370: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
8380: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8390: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
83a0: 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62  ATABASE, zOrigDb
83b0: 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b  , P4_TRANSIENT);
83c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
83d0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
83e0: 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20   COLNAME_TABLE, 
83f0: 7a 4f 72 69 67 54 61 62 2c 20 50 34 5f 54 52 41  zOrigTab, P4_TRA
8400: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
8410: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
8420: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
8430: 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f  _COLUMN, zOrigCo
8440: 6c 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29  l, P4_TRANSIENT)
8450: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
8460: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
8470: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
8480: 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f  VDBE the names o
8490: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
84a0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
84b0: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
84c0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  n is used to pro
84d0: 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f  vide the.** azCo
84e0: 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68  l[] values in th
84f0: 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  e callback..*/.s
8500: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
8510: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
8520: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8530: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
8540: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
8550: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
8560: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
8570: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
8580: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
8590: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
85a0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
85b0: 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  et */.){.  Vdbe 
85c0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
85d0: 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  be;.  int i, j;.
85e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
85f0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
8600: 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f  t fullNames, sho
8610: 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65  rtNames;..#ifnde
8620: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
8630: 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68  PLAIN.  /* If th
8640: 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  is is an EXPLAIN
8650: 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70  , skip this step
8660: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
8670: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
8680: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
8690: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 76  dif..  assert( v
86a0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
86b0: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
86c0: 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 64 62 2d 3e   || v==0 || db->
86d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
86e0: 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d  eturn;.  pParse-
86f0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
8700: 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20  ;.  fullNames = 
8710: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
8720: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
8730: 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d  )!=0;.  shortNam
8740: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
8750: 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
8760: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71  lNames)!=0;.  sq
8770: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
8780: 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e  ols(v, pEList->n
8790: 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Expr);.  for(i=0
87a0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
87b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
87c0: 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45  r *p;.    p = pE
87d0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
87e0: 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
87f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
8800: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f( pEList->a[i].
8810: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63  zName ){.      c
8820: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
8830: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
8840: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8850: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8860: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
8870: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
8880: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f  Name));.      co
8890: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
88a0: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
88b0: 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69  COLUMN && pTabLi
88c0: 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  st ){.      Tabl
88d0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63  e *pTab;.      c
88e0: 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
88f0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69   int iCol = p->i
8900: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f  Column;.      fo
8910: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73  r(j=0; j<pTabLis
8920: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
8930: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
8940: 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b  r!=p->iTable; j+
8950: 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72  +){}.      asser
8960: 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  t( j<pTabList->n
8970: 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61  Src );.      pTa
8980: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
8990: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  j].pTab;.      i
89a0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
89b0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
89c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
89d0: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
89e0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
89f0: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
8a00: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
8a10: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f        zCol = "ro
8a20: 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wid";.      }els
8a30: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
8a40: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
8a50: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
8a60: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f  }.      if( !sho
8a70: 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c  rtNames && !full
8a80: 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e  Names && p->span
8a90: 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b  .z && p->span.z[
8aa0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0] ){.        sq
8ab0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8ac0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8ad0: 45 5f 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29 70  E_NAME, (char*)p
8ae0: 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61  ->span.z, p->spa
8af0: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n.n);.      }els
8b00: 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20  e if( fullNames 
8b10: 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20  || (!shortNames 
8b20: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  && pTabList->nSr
8b30: 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  c>1) ){.        
8b40: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
8b50: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
8b60: 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a  Tab;. .        z
8b70: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
8b80: 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20  a[j].zAlias;.   
8b90: 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d       if( fullNam
8ba0: 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20  es || zTab==0 ) 
8bb0: 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  zTab = pTab->zNa
8bc0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  me;.        sqli
8bd0: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  te3SetString(&zN
8be0: 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  ame, zTab, ".", 
8bf0: 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b  zCol, (char*)0);
8c00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8c10: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8c20: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
8c30: 45 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e  E, zName, P4_DYN
8c40: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
8c50: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
8c60: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8c70: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8c80: 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 73 74 72 6c  NAME, zCol, strl
8c90: 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20 20  en(zCol));.     
8ca0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
8cb0: 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d   p->span.z && p-
8cc0: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  >span.z[0] ){.  
8cd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8ce0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8cf0: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63  COLNAME_NAME, (c
8d00: 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20  har*)p->span.z, 
8d10: 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  p->span.n);.    
8d20: 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65    /* sqlite3Vdbe
8d30: 43 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c  CompressSpace(v,
8d40: 20 61 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d   addr); */.    }
8d50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
8d60: 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20   zName[30];.    
8d70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
8d80: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54  =TK_COLUMN || pT
8d90: 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20  abList==0 );.   
8da0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8db0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4e 61 6d 65  ntf(sizeof(zName
8dc0: 29 2c 20 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d  ), zName, "colum
8dd0: 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20  n%d", i+1);.    
8de0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8df0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8e00: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
8e10: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 0);.    }.  }
8e20: 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
8e30: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
8e40: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
8e50: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
8e60: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
8e70: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e  D_SELECT./*.** N
8e80: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ame of the conne
8e90: 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20  ction operator, 
8ea0: 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d  used for error m
8eb0: 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  essages..*/.stat
8ec0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  ic const char *s
8ed0: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20  electOpName(int 
8ee0: 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  id){.  char *z;.
8ef0: 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a    switch( id ){.
8f00: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
8f10: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
8f20: 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b  N ALL";   break;
8f30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
8f40: 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54  ERSECT: z = "INT
8f50: 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b  ERSECT";   break
8f60: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ;.    case TK_EX
8f70: 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58  CEPT:    z = "EX
8f80: 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61  CEPT";      brea
8f90: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
8fa0: 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55            z = "U
8fb0: 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65  NION";       bre
8fc0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
8fd0: 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
8fe0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
8ff0: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
9000: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
9010: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
9020: 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65  tic int prepSele
9030: 63 74 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53  ctStmt(Parse*, S
9040: 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  elect*);../*.** 
9050: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
9060: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
9070: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
9080: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
9090: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
90a0: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
90b0: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
90c0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
90d0: 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
90e0: 70 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54  pParse, char *zT
90f0: 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a  abName, Select *
9100: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
9110: 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69  e *pTab;.  int i
9120: 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  , j;.  ExprList 
9130: 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d  *pEList;.  Colum
9140: 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a  n *aCol, *pCol;.
9150: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9160: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 77  pParse->db;..  w
9170: 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
9180: 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20  Prior ) pSelect 
9190: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
91a0: 72 3b 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c  r;.  if( prepSel
91b0: 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20  ectStmt(pParse, 
91c0: 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  pSelect) ){.    
91d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
91e0: 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
91f0: 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c  tResolve(pParse,
9200: 20 70 53 65 6c 65 63 74 2c 20 30 29 20 29 7b 0a   pSelect, 0) ){.
9210: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
9220: 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  }.  pTab = sqlit
9230: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
9240: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
9250: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
9260: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
9270: 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 6e  0;.  }.  pTab->n
9280: 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d  Ref = 1;.  pTab-
9290: 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d  >zName = zTabNam
92a0: 65 20 3f 20 73 71 6c 69 74 65 33 44 62 53 74 72  e ? sqlite3DbStr
92b0: 44 75 70 28 64 62 2c 20 7a 54 61 62 4e 61 6d 65  Dup(db, zTabName
92c0: 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20  ) : 0;.  pEList 
92d0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
92e0: 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  t;.  pTab->nCol 
92f0: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
9300: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
9310: 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61  >nCol>0 );.  pTa
9320: 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d  b->aCol = aCol =
9330: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
9340: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
9350: 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70  pTab->aCol[0])*p
9360: 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 66 6f  Tab->nCol);.  fo
9370: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
9380: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
9390: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
93a0: 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a    Expr *p, *pR;.
93b0: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
93c0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
93d0: 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b  ;.    int nName;
93e0: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
93f0: 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74  oll;.    int cnt
9400: 3b 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  ;.    NameContex
9410: 74 20 73 4e 43 3b 0a 20 20 20 20 0a 20 20 20 20  t sNC;.    .    
9420: 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70  /* Get an approp
9430: 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74  riate name for t
9440: 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f  he column.    */
9450: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
9460: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
9470: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
9480: 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  ht==0 || p->pRig
9490: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c  ht->token.z==0 |
94a0: 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b  | p->pRight->tok
94b0: 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  en.z[0]!=0 );.  
94c0: 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70    if( (zName = p
94d0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
94e0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  e)!=0 ){.      /
94f0: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
9500: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20  contains an "AS 
9510: 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20  <name>" phrase, 
9520: 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68  use <name> as th
9530: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
9540: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
9550: 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d  bStrDup(db, zNam
9560: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  e);.    }else if
9570: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  ( p->op==TK_DOT 
9580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
9590: 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74 29  & (pR=p->pRight)
95a0: 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e  !=0 && pR->token
95b0: 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e  .z && pR->token.
95c0: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  z[0] ){.      /*
95d0: 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   For columns of 
95e0: 74 68 65 20 66 72 6f 6d 20 41 2e 42 20 75 73 65  the from A.B use
95f0: 20 42 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a   B as the name *
9600: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
9610: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
9620: 62 2c 20 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f  b, "%T", &pR->to
9630: 6b 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ken);.    }else 
9640: 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26  if( p->span.z &&
9650: 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b   p->span.z[0] ){
9660: 0a 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68  .      /* Use th
9670: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
9680: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
9690: 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
96a0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e  name */.      zN
96b0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
96c0: 69 6e 74 66 28 64 62 2c 20 22 25 54 22 2c 20 26  intf(db, "%T", &
96d0: 70 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65  p->span);.    }e
96e0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  lse{.      /* If
96f0: 20 61 6c 6c 20 65 6c 73 65 20 66 61 69 6c 73 2c   all else fails,
9700: 20 6d 61 6b 65 20 75 70 20 61 20 6e 61 6d 65 20   make up a name 
9710: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
9720: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
9730: 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20  db, "column%d", 
9740: 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i+1);.    }.    
9750: 69 66 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 64 62  if( !zName || db
9760: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9770: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  {.      db->mall
9780: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
9790: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
97a0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  (zName);.      s
97b0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
97c0: 65 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 72  e(pTab);.      r
97d0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
97e0: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
97f0: 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f  e(zName);..    /
9800: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
9810: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75  column name is u
9820: 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e  nique.  If the n
9830: 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  ame is not uniqu
9840: 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64  e,.    ** append
9850: 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68   a integer to th
9860: 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69  e name so that i
9870: 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65  t becomes unique
9880: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61  ..    */.    nNa
9890: 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  me = strlen(zNam
98a0: 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e  e);.    for(j=cn
98b0: 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  t=0; j<i; j++){.
98c0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
98d0: 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d  3StrICmp(aCol[j]
98e0: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
98f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61  0 ){.        zNa
9900: 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20  me[nName] = 0;. 
9910: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73         zName = s
9920: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
9930: 2c 20 22 25 7a 3a 25 64 22 2c 20 7a 4e 61 6d 65  , "%z:%d", zName
9940: 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20  , ++cnt);.      
9950: 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    j = -1;.      
9960: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
9970: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9980: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e      }.    pCol->
9990: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a  zName = zName;..
99a0: 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 74      /* Get the t
99b0: 79 70 65 6e 61 6d 65 2c 20 74 79 70 65 20 61 66  ypename, type af
99c0: 66 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c  finity, and coll
99d0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
99e0: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  or the.    ** co
99f0: 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lumn..    */.   
9a00: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
9a10: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
9a20: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
9a30: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
9a40: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c  .    zType = sql
9a50: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
9a60: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
9a70: 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a  , p, 0, 0, 0));.
9a80: 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20      pCol->zType 
9a90: 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20 70 43 6f  = zType;.    pCo
9aa0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
9ab0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
9ac0: 79 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  y(p);.    pColl 
9ad0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
9ae0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
9af0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
9b00: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43  {.      pCol->zC
9b10: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  oll = sqlite3DbS
9b20: 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d  trDup(db, pColl-
9b30: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
9b40: 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79   }.  pTab->iPKey
9b50: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
9b60: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  pTab;.}../*.** P
9b70: 72 65 70 61 72 65 20 61 20 53 45 4c 45 43 54 20  repare a SELECT 
9b80: 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72  statement for pr
9b90: 6f 63 65 73 73 69 6e 67 20 62 79 20 64 6f 69 6e  ocessing by doin
9ba0: 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  g the following.
9bb0: 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a  ** things:.**.**
9bc0: 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75      (1)  Make su
9bd0: 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  re VDBE cursor n
9be0: 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
9bf0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65   assigned to eve
9c00: 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c  ry.**         el
9c10: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f  ement of the FRO
9c20: 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
9c30: 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20     (2)  Fill in 
9c40: 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  the pTabList->a[
9c50: 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e  ].pTab fields in
9c60: 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
9c70: 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  t .**         de
9c80: 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73  fines FROM claus
9c90: 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61  e.  When views a
9ca0: 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
9cb0: 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20  M clause,.**    
9cc0: 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69       fill pTabLi
9cd0: 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20  st->a[].pSelect 
9ce0: 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
9cf0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
9d00: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74  ent.**         t
9d10: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
9d20: 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79  he view.  A copy
9d30: 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
9d40: 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a  view's SELECT.**
9d50: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65           stateme
9d60: 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  nt so that we ca
9d70: 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20  n freely modify 
9d80: 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73  or delete that s
9d90: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
9da0: 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72      without worr
9db0: 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69  ying about messi
9dc0: 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73  ng up the presis
9dd0: 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  tent representat
9de0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ion.**         o
9df0: 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a  f the view..**.*
9e00: 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65  *    (3)  Add te
9e10: 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  rms to the WHERE
9e20: 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d   clause to accom
9e30: 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
9e40: 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
9e50: 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
9e60: 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
9e70: 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
9e80: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29  ns..**.**    (4)
9e90: 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
9ea0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
9eb0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
9ec0: 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
9ed0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
9ee0: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
9ef0: 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
9f00: 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
9f10: 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
9f20: 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
9f30: 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
9f40: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
9f50: 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
9f60: 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
9f70: 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
9f80: 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
9f90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e  *.** Return 0 on
9fa0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
9fb0: 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73  ere are problems
9fc0: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
9fd0: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70   message.** in p
9fe0: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
9ff0: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74   non-zero..*/.st
a000: 61 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c  atic int prepSel
a010: 65 63 74 53 74 6d 74 28 50 61 72 73 65 20 2a 70  ectStmt(Parse *p
a020: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
a030: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  ){.  int i, j, k
a040: 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20  , rc;.  SrcList 
a050: 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
a060: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
a070: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
a080: 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73  item *pFrom;.  s
a090: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a0a0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
a0b0: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d  p==0 || p->pSrc=
a0c0: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
a0d0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
a0e0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 54  turn 1;.  }.  pT
a0f0: 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
a100: 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
a110: 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61  pEList;..  /* Ma
a120: 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e  ke sure cursor n
a130: 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
a140: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
a150: 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a   entries in.  **
a160: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
a170: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
a180: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
a190: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
a1a0: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
a1b0: 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 0a  rse, p->pSrc);..
a1c0: 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
a1d0: 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
a1e0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
a1f0: 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
a200: 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
a210: 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
a220: 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
a230: 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
a240: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
a250: 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
a260: 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
a270: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
a280: 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
a290: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
a2a0: 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
a2b0: 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
a2c0: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
a2d0: 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
a2e0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
a2f0: 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21  if( pFrom->pTab!
a300: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
a310: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61  his statement ha
a320: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
a330: 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20  repared.  There 
a340: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20  is no need.     
a350: 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65   ** to go furthe
a360: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  r. */.      asse
a370: 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( i==0 );.    
a380: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
a390: 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  }.    if( pFrom-
a3a0: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
a3b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a3c0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
a3d0: 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
a3e0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
a3f0: 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
a400: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a410: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30  From->pSelect!=0
a420: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46   );.      if( pF
a430: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29  rom->zAlias==0 )
a440: 7b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  {.        pFrom-
a450: 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20 20  >zAlias =.      
a460: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
a470: 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  tf(db, "sqlite_s
a480: 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76  ubquery_%p_", (v
a490: 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c  oid*)pFrom->pSel
a4a0: 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ect);.      }.  
a4b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
a4c0: 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
a4d0: 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
a4e0: 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20  = pTab = .      
a4f0: 20 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53    sqlite3ResultS
a500: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
a510: 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73  e, pFrom->zAlias
a520: 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
a530: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
a540: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
a550: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
a560: 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  }.      /* The i
a570: 73 45 70 68 65 6d 20 66 6c 61 67 20 69 6e 64 69  sEphem flag indi
a580: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 54  cates that the T
a590: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  able structure h
a5a0: 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a  as been.      **
a5b0: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
a5c0: 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20 62  ocated and may b
a5d0: 65 20 66 72 65 65 64 20 61 74 20 61 6e 79 20 74  e freed at any t
a5e0: 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ime.  In other w
a5f0: 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70  ords,.      ** p
a600: 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  Tab is not point
a610: 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73 74  ing to a persist
a620: 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
a630: 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73  ure that defines
a640: 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f  .      ** part o
a650: 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f  f the schema. */
a660: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 45  .      pTab->isE
a670: 70 68 65 6d 20 3d 20 31 3b 0a 23 65 6e 64 69 66  phem = 1;.#endif
a680: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a690: 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
a6a0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
a6b0: 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
a6c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
a6d0: 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
a6e0: 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
a6f0: 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
a700: 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71  ab = .        sq
a710: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
a720: 28 70 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2d  (pParse,0,pFrom-
a730: 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44  >zName,pFrom->zD
a740: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20  atabase);.      
a750: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
a760: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
a770: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
a780: 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66  Tab->nRef++;.#if
a790: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
a7a0: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
a7b0: 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f  defined (SQLITE_
a7c0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
a7d0: 45 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  E).      if( pTa
a7e0: 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73  b->pSelect || Is
a7f0: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
a800: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72  .        /* We r
a810: 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65  each here if the
a820: 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20   named table is 
a830: 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20  a really a view 
a840: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
a850: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
a860: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
a870: 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20   pTab) ){.      
a880: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
a890: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a8a0: 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53 65  /* If pFrom->pSe
a8b0: 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e 73  lect!=0 it means
a8c0: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
a8d0: 77 69 74 68 20 61 0a 20 20 20 20 20 20 20 20 2a  with a.        *
a8e0: 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20 61 20  * view within a 
a8f0: 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45 43  view.  The SELEC
a900: 54 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20  T structure has 
a910: 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20  already been.   
a920: 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 62       ** copied b
a930: 79 20 74 68 65 20 6f 75 74 65 72 20 76 69 65 77  y the outer view
a940: 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70 20   so we can skip 
a950: 74 68 65 20 63 6f 70 79 20 73 74 65 70 20 68 65  the copy step he
a960: 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  re.        ** in
a970: 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77 2e   the inner view.
a980: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
a990: 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70      if( pFrom->p
a9a0: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
a9b0: 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53         pFrom->pS
a9c0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
a9d0: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
a9e0: 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b->pSelect);.   
a9f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
aa00: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
aa10: 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41  .  /* Process NA
aa20: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20  TURAL keywords, 
aa30: 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  and ON and USING
aa40: 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e   clauses of join
aa50: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  s..  */.  if( sq
aa60: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
aa70: 70 50 61 72 73 65 2c 20 70 29 20 29 20 72 65 74  pParse, p) ) ret
aa80: 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72  urn 1;..  /* For
aa90: 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20   every "*" that 
aaa0: 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f  occurs in the co
aab0: 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72  lumn list, inser
aac0: 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20  t the names of. 
aad0: 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   ** all columns 
aae0: 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20  in all tables.  
aaf0: 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41  And for every TA
ab00: 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65  BLE.* insert the
ab10: 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61   names.  ** of a
ab20: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41  ll columns in TA
ab30: 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72  BLE.  The parser
ab40: 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63   inserted a spec
ab50: 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ial expression. 
ab60: 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f   ** with the TK_
ab70: 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  ALL operator for
ab80: 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69   each "*" that i
ab90: 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63  t found in the c
aba0: 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a  olumn list..  **
abb0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
abc0: 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20  ode just has to 
abd0: 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c  locate the TK_AL
abe0: 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  L expressions an
abf0: 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61  d expand.  ** ea
ac00: 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69  ch one to the li
ac10: 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  st of all column
ac20: 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
ac30: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
ac40: 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63  irst loop just c
ac50: 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
ac60: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a  there are any "*
ac70: 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a  " operators.  **
ac80: 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e   that need expan
ac90: 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ding..  */.  for
aca0: 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
acb0: 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
acc0: 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69   Expr *pE = pELi
acd0: 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  st->a[k].pExpr;.
ace0: 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
acf0: 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a  TK_ALL ) break;.
ad00: 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
ad10: 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52  TK_DOT && pE->pR
ad20: 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67  ight && pE->pRig
ad30: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20  ht->op==TK_ALL. 
ad40: 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70          && pE->p
ad50: 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66  Left && pE->pLef
ad60: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62  t->op==TK_ID ) b
ad70: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  reak;.  }.  rc =
ad80: 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69   0;.  if( k<pELi
ad90: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
ada0: 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65   /*.    ** If we
adb0: 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61   get here it mea
adc0: 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ns the result se
add0: 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  t contains one o
ade0: 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a  r more "*".    *
adf0: 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  * operators that
ae00: 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
ae10: 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f  nded.  Loop thro
ae20: 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
ae30: 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ion.    ** in th
ae40: 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
ae50: 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65   expand them one
ae60: 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a   by one..    */.
ae70: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
ae80: 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45  ist_item *a = pE
ae90: 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70  List->a;.    Exp
aea0: 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b  rList *pNew = 0;
aeb0: 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
aec0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
aed0: 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67  gs;.    int long
aee0: 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26  Names = (flags &
aef0: 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
af00: 61 6d 65 73 29 21 3d 30 20 26 26 0a 20 20 20 20  ames)!=0 &&.    
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af20: 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54    (flags & SQLIT
af30: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
af40: 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d  ==0;..    for(k=
af50: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
af60: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; k++){.      
af70: 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e  Expr *pE = a[k].
af80: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
af90: 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20   pE->op!=TK_ALL 
afa0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 70  &&.           (p
afb0: 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
afc0: 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c   pE->pRight==0 |
afd0: 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  | pE->pRight->op
afe0: 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20  !=TK_ALL) ){.   
aff0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72       /* This par
b000: 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69  ticular expressi
b010: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
b020: 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
b030: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
b040: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
b050: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
b060: 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61  (pParse, pNew, a
b070: 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20  [k].pExpr, 0);. 
b080: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
b090: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
b0a0: 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
b0b0: 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d  -1].zName = a[k]
b0c0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
b0d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
b0e0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
b0f0: 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e   }.        a[k].
b100: 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20  pExpr = 0;.     
b110: 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
b120: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
b130: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
b140: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
b150: 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e  "*" or a "TABLE.
b160: 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  *" and needs to 
b170: 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  be.        ** ex
b180: 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20  panded. */.     
b190: 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e     int tableSeen
b1a0: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65   = 0;      /* Se
b1b0: 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c  t to 1 when TABL
b1c0: 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20  E matches */.   
b1d0: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d       char *zTNam
b1e0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
b1f0: 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66   text of name of
b200: 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20   TABLE */.      
b210: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
b220: 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66  _DOT && pE->pLef
b230: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  t ){.          z
b240: 54 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  TName = sqlite3N
b250: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
b260: 20 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b   &pE->pLeft->tok
b270: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  en);.        }el
b280: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se{.          zT
b290: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
b2a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
b2b0: 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
b2c0: 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
b2d0: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
b2e0: 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  From++){.       
b2f0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
b300: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
b310: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
b320: 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e  abName = pFrom->
b330: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
b340: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
b350: 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  0 || zTabName[0]
b360: 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20  ==0 ){ .        
b370: 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
b380: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
b390: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b3a0: 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
b3b0: 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20  (zTabName==0 || 
b3c0: 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c  zTabName[0]==0 |
b3d0: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
b3e0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43      sqlite3StrIC
b3f0: 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e  mp(zTName, zTabN
b400: 61 6d 65 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  ame)!=0) ){.    
b410: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
b420: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
b430: 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
b440: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
b450: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
b460: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
b470: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
b480: 70 45 78 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a  pExpr, *pRight;.
b490: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
b4a0: 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e   *zName = pTab->
b4b0: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a  aCol[j].zName;..
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
b4d0: 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61  f a column is ma
b4e0: 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27  rked as 'hidden'
b4f0: 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79   (currently only
b500: 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20   possible.      
b510: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72        ** for vir
b520: 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f  tual tables), do
b530: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20   not include it 
b540: 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a  in the expanded.
b550: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
b560: 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a  esult-set list..
b570: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
b580: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49             if( I
b590: 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70  sHiddenColumn(&p
b5a0: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b  Tab->aCol[j]) ){
b5b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
b5c0: 73 73 65 72 74 28 49 73 56 69 72 74 75 61 6c 28  ssert(IsVirtual(
b5d0: 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20  pTab));.        
b5e0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
b600: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
b610: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
b620: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
b630: 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d  st_item *pLeft =
b640: 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d   &pTabList->a[i-
b650: 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1];.            
b660: 20 20 69 66 28 20 28 70 4c 65 66 74 5b 31 5d 2e    if( (pLeft[1].
b670: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
b680: 54 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20  TURAL)!=0 &&.   
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78       columnIndex
b6b0: 28 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e  (pLeft->pTab, zN
b6c0: 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
b6d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
b6e0: 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c   a NATURAL join,
b6f0: 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63   omit the join c
b700: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
b710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b720: 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65   ** table on the
b730: 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20   right */.      
b740: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
b750: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
b760: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
b770: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c    if( sqlite3IdL
b780: 69 73 74 49 6e 64 65 78 28 70 4c 65 66 74 5b 31  istIndex(pLeft[1
b790: 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29  ].pUsing, zName)
b7a0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
b7b0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a         /* In a j
b7c0: 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47  oin with a USING
b7d0: 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f   clause, omit co
b7e0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  lumns in the.   
b7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
b800: 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f  using clause fro
b810: 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  m the table on t
b820: 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
b840: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
b850: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b860: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
b870: 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   pRight = sqlite
b880: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
b890: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
b8b0: 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61  pRight==0 ) brea
b8c0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  k;.            s
b8d0: 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50  etQuotedToken(pP
b8e0: 61 72 73 65 2c 20 26 70 52 69 67 68 74 2d 3e 74  arse, &pRight->t
b8f0: 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  oken, zName);.  
b900: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
b910: 61 62 4e 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e  abName && (longN
b920: 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74  ames || pTabList
b930: 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20  ->nSrc>1) ){.   
b940: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
b950: 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  *pLeft = sqlite3
b960: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
b970: 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  _ID, 0, 0, 0);. 
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
b990: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
b9a0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
b9b0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
b9c0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
b9d0: 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20     if( pExpr==0 
b9e0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
b9f0: 20 20 20 20 20 20 20 73 65 74 51 75 6f 74 65 64         setQuoted
ba00: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26 70  Token(pParse, &p
ba10: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61  Left->token, zTa
ba20: 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
ba30: 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26        setToken(&
ba40: 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 0a 20 20  pExpr->span, .  
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba60: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
ba70: 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  b, "%s.%s", zTab
ba80: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20  Name, zName));. 
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
baa0: 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31  pr->span.dyn = 1
bab0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
bac0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d  pExpr->token.z =
bad0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
bae0: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e    pExpr->token.n
baf0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
bb00: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
bb10: 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  .dyn = 0;.      
bb20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bb30: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
bb40: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
bb50: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
bb60: 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f  span = pExpr->to
bb70: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ken;.           
bb80: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64     pExpr->span.d
bb90: 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  yn = 0;.        
bba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
bbb0: 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
bbc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
bbd0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
bbe0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
bbf0: 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70  arse, pNew, pExp
bc00: 72 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29  r, &pExpr->span)
bc10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
bc20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
bc30: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
bc40: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
bc50: 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45  pParse, pNew, pE
bc60: 78 70 72 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f  xpr, &pRight->to
bc70: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ken);.          
bc80: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
bc90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bca0: 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e    if( !tableSeen
bcb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
bcc0: 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( zTName ){.    
bcd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
bce0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
bcf0: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
bd00: 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20  %s", zTName);.  
bd10: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
bd20: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
bd30: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
bd40: 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70  e, "no tables sp
bd50: 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  ecified");.     
bd60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
bd70: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
bd80: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
bd90: 65 33 5f 66 72 65 65 28 7a 54 4e 61 6d 65 29 3b  e3_free(zTName);
bda0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bdb0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
bdc0: 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29  stDelete(pEList)
bdd0: 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20  ;.    p->pEList 
bde0: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66  = pNew;.  }.  if
bdf0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
be00: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ->pEList->nExpr>
be10: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
be20: 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
be30: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
be40: 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
be50: 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
be60: 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ");.    rc = SQL
be70: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
be80: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
be90: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 63 20  ailed ){.    rc 
bea0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
beb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
bec0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 20 69 73 20  .}../*.** pE is 
bed0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
bee0: 65 78 70 72 65 73 73 69 6f 6e 20 77 68 69 63 68  expression which
bef0: 20 69 73 20 61 20 73 69 6e 67 6c 65 20 74 65 72   is a single ter
bf00: 6d 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59  m in.** ORDER BY
bf10: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
bf20: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  use..**.** If pE
bf30: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61 6e   evaluates to an
bf40: 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   integer constan
bf50: 74 20 69 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  t i, then return
bf60: 20 69 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61   i..** This is a
bf70: 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20  n indication to 
bf80: 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20  the caller that 
bf90: 69 74 20 73 68 6f 75 6c 64 20 73 6f 72 74 0a 2a  it should sort.*
bfa0: 2a 20 62 79 20 74 68 65 20 69 2d 74 68 20 63 6f  * by the i-th co
bfb0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 65 73 75  lumn of the resu
bfc0: 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  lt set..**.** If
bfd0: 20 70 45 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f   pE is a well-fo
bfe0: 72 6d 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20  rmed expression 
bff0: 61 6e 64 20 74 68 65 20 53 45 4c 45 43 54 20 73  and the SELECT s
c000: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e  tatement.** is n
c010: 6f 74 20 63 6f 6d 70 6f 75 6e 64 2c 20 74 68 65  ot compound, the
c020: 6e 20 72 65 74 75 72 6e 20 30 2e 20 20 54 68 69  n return 0.  Thi
c030: 73 20 69 6e 64 69 63 61 74 65 73 20 74 6f 20 74  s indicates to t
c040: 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 68 61  he.** caller tha
c050: 74 20 69 74 20 73 68 6f 75 6c 64 20 73 6f 72 74  t it should sort
c060: 20 62 79 20 74 68 65 20 76 61 6c 75 65 20 6f 66   by the value of
c070: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a   the ORDER BY.**
c080: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
c090: 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  ** If the SELECT
c0a0: 20 69 73 20 63 6f 6d 70 6f 75 6e 64 2c 20 74 68   is compound, th
c0b0: 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61  en attempt to ma
c0c0: 74 63 68 20 70 45 20 61 67 61 69 6e 73 74 0a 2a  tch pE against.*
c0d0: 2a 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  * result set col
c0e0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 6c 65 66 74  umns in the left
c0f0: 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
c100: 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a  tement.  Return.
c110: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 20 6f  ** the index i o
c120: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63  f the matching c
c130: 6f 6c 75 6d 6e 2c 20 61 73 20 61 6e 20 69 6e 64  olumn, as an ind
c140: 69 63 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 0a  ication to the .
c150: 2a 2a 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69  ** caller that i
c160: 74 20 73 68 6f 75 6c 64 20 73 6f 72 74 20 62 79  t should sort by
c170: 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e   the i-th column
c180: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a  .  If there is.*
c190: 2a 20 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74 75  * no match, retu
c1a0: 72 6e 20 2d 31 20 61 6e 64 20 6c 65 61 76 65 20  rn -1 and leave 
c1b0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
c1c0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 73   in pParse..*/.s
c1d0: 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f  tatic int matchO
c1e0: 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72  rderByTermToExpr
c1f0: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
c200: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
c210: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f  rsing context fo
c220: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
c230: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
c240: 65 6c 65 63 74 2c 20 20 20 2f 2a 20 54 68 65 20  elect,   /* The 
c250: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
c260: 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
c270: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
c280: 78 70 72 20 2a 70 45 2c 20 20 20 20 20 20 20 20  xpr *pE,        
c290: 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69    /* The specifi
c2a0: 63 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  c ORDER BY term 
c2b0: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20  */.  int idx,   
c2c0: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20          /* When 
c2d0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 69 73  ORDER BY term is
c2e0: 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 69   this */.  int i
c2f0: 73 43 6f 6d 70 6f 75 6e 64 2c 20 20 20 20 2f 2a  sCompound,    /*
c300: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
c310: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
c320: 43 54 20 2a 2f 0a 20 20 75 38 20 2a 70 48 61 73  CT */.  u8 *pHas
c330: 41 67 67 20 20 20 20 20 20 20 20 2f 2a 20 54 72  Agg        /* Tr
c340: 75 65 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e  ue if expression
c350: 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 65 67   contains aggreg
c360: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
c370: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
c380: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
c390: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
c3a0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
c3b0: 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20   /* The columns 
c3c0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
c3d0: 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t */.  NameConte
c3e0: 78 74 20 6e 63 3b 20 20 20 20 2f 2a 20 4e 61 6d  xt nc;    /* Nam
c3f0: 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 72 65  e context for re
c400: 73 6f 6c 76 69 6e 67 20 70 45 20 2a 2f 0a 0a 0a  solving pE */...
c410: 20 20 2f 2a 20 49 66 20 74 68 65 20 74 65 72 6d    /* If the term
c420: 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63   is an integer c
c430: 6f 6e 73 74 61 6e 74 2c 20 72 65 74 75 72 6e 20  onstant, return 
c440: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 61  the value of tha
c450: 74 0a 20 20 2a 2a 20 63 6f 6e 73 74 61 6e 74 20  t.  ** constant 
c460: 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53  */.  pEList = pS
c470: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
c480: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
c490: 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
c4a0: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 3c 3d  ) ){.    if( i<=
c4b0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
c4c0: 20 69 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c   i is too small,
c4d0: 20 6d 61 6b 65 20 69 74 20 74 6f 6f 20 62 69 67   make it too big
c4e0: 2e 20 20 54 68 61 74 20 77 61 79 20 74 68 65 20  .  That way the 
c4f0: 63 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a  calling.      **
c500: 20 66 75 6e 63 74 69 6f 6e 20 73 74 69 6c 6c 20   function still 
c510: 73 65 65 73 20 61 20 76 61 6c 75 65 20 74 68 61  sees a value tha
c520: 74 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67  t is out of rang
c530: 65 2c 20 62 75 74 20 64 6f 65 73 0a 20 20 20 20  e, but does.    
c540: 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 66 75 73 65    ** not confuse
c550: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
c560: 65 72 20 77 69 74 68 20 30 20 6f 72 20 2d 31 20  er with 0 or -1 
c570: 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 20  result code..   
c580: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 20 3d 20     */.      i = 
c590: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 3b  pEList->nExpr+1;
c5a0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
c5b0: 6e 20 69 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n i;.  }..  /* I
c5c0: 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20  f the term is a 
c5d0: 73 69 6d 70 6c 65 20 69 64 65 6e 74 69 66 69 65  simple identifie
c5e0: 72 20 74 68 61 74 20 74 72 79 20 74 6f 20 6d 61  r that try to ma
c5f0: 74 63 68 20 74 68 61 74 20 69 64 65 6e 74 69 66  tch that identif
c600: 69 65 72 0a 20 20 2a 2a 20 61 67 61 69 6e 73 74  ier.  ** against
c610: 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69   a column name i
c620: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
c630: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 2d  ..  */.  if( pE-
c640: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 28 70  >op==TK_ID || (p
c650: 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  E->op==TK_STRING
c660: 20 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 5b   && pE->token.z[
c670: 30 5d 21 3d 27 5c 27 27 29 20 29 7b 0a 20 20 20  0]!='\'') ){.   
c680: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c690: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 63  Parse->db;.    c
c6a0: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69  har *zCol = sqli
c6b0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
c6c0: 28 64 62 2c 20 26 70 45 2d 3e 74 6f 6b 65 6e 29  (db, &pE->token)
c6d0: 3b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 3d 3d  ;.    if( zCol==
c6e0: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
c6f0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
c700: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
c710: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
c720: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20        char *zAs 
c730: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
c740: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Name;.      if( 
c750: 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65  zAs!=0 && sqlite
c760: 33 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43  3StrICmp(zAs, zC
c770: 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
c780: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
c790: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Col);.        re
c7a0: 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20  turn i+1;.      
c7b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
c7c0: 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a  te3_free(zCol);.
c7d0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76    }..  /* Resolv
c7e0: 65 20 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 74  e all names in t
c7f0: 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
c800: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2f   expression.  */
c810: 0a 20 20 6d 65 6d 73 65 74 28 26 6e 63 2c 20 30  .  memset(&nc, 0
c820: 2c 20 73 69 7a 65 6f 66 28 6e 63 29 29 3b 0a 20  , sizeof(nc));. 
c830: 20 6e 63 2e 70 50 61 72 73 65 20 3d 20 70 50 61   nc.pParse = pPa
c840: 72 73 65 3b 0a 20 20 6e 63 2e 70 53 72 63 4c 69  rse;.  nc.pSrcLi
c850: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
c860: 72 63 3b 0a 20 20 6e 63 2e 70 45 4c 69 73 74 20  rc;.  nc.pEList 
c870: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 6e 63 2e 61  = pEList;.  nc.a
c880: 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 6e  llowAgg = 1;.  n
c890: 63 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66  c.nErr = 0;.  if
c8a0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
c8b0: 6f 6c 76 65 4e 61 6d 65 73 28 26 6e 63 2c 20 70  olveNames(&nc, p
c8c0: 45 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  E) ){.    if( is
c8d0: 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20  Compound ){.    
c8e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c    sqlite3ErrorCl
c8f0: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
c900: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
c910: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
c920: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
c930: 20 7d 0a 20 20 69 66 28 20 6e 63 2e 68 61 73 41   }.  if( nc.hasA
c940: 67 67 20 26 26 20 70 48 61 73 41 67 67 20 29 7b  gg && pHasAgg ){
c950: 0a 20 20 20 20 2a 70 48 61 73 41 67 67 20 3d 20  .    *pHasAgg = 
c960: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  1;.  }..  /* For
c970: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
c980: 43 54 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 74  CT, we need to t
c990: 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ry to match the 
c9a0: 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 65 78  ORDER BY.  ** ex
c9b0: 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 73 74  pression against
c9c0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
c9d0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
c9e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f  .  */.  if( isCo
c9f0: 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 66 6f  mpound ){.    fo
ca00: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
ca10: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
ca20: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
ca30: 78 70 72 43 6f 6d 70 61 72 65 28 70 45 4c 69 73  xprCompare(pELis
ca40: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  t->a[i].pExpr, p
ca50: 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  E) ){.        re
ca60: 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20  turn i+1;.      
ca70: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
ca80: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
ca90: 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f 52  * Analyze and OR
caa0: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
cab0: 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20 73  BY clause in a s
cac0: 69 6d 70 6c 65 20 53 45 4c 45 43 54 20 73 74 61  imple SELECT sta
cad0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 52 65 74 75 72  tement..** Retur
cae0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
caf0: 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a  errors seen..**.
cb00: 2a 2a 20 45 76 65 72 79 20 74 65 72 6d 20 6f 66  ** Every term of
cb10: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72   the ORDER BY or
cb20: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
cb30: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6e 0a   needs to be an.
cb40: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ** expression.  
cb50: 49 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  If any expressio
cb60: 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  n is an integer 
cb70: 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 0a 2a  constant, then.*
cb80: 2a 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  * that expressio
cb90: 6e 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  n is replaced by
cba0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
cbb0: 6e 67 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ng .** expressio
cbc0: 6e 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c  n from the resul
cbd0: 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t set..*/.static
cbe0: 20 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65   int processOrde
cbf0: 72 47 72 6f 75 70 42 79 28 0a 20 20 50 61 72 73  rGroupBy(.  Pars
cc00: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
cc10: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
cc20: 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72  text.  Leave err
cc30: 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65  or messages here
cc40: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
cc50: 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54  elect,      /* T
cc60: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
cc70: 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ent containing t
cc80: 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  he clause */.  E
cc90: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
cca0: 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y,   /* The ORDE
ccb0: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
ccc0: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72   clause to be pr
ccd0: 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ocessed */.  int
cce0: 20 69 73 4f 72 64 65 72 2c 20 20 20 20 20 20 20   isOrder,       
ccf0: 20 20 20 2f 2a 20 31 20 66 6f 72 20 4f 52 44 45     /* 1 for ORDE
cd00: 52 20 42 59 2e 20 20 30 20 66 6f 72 20 47 52 4f  R BY.  0 for GRO
cd10: 55 50 20 42 59 20 2a 2f 0a 20 20 75 38 20 2a 70  UP BY */.  u8 *p
cd20: 48 61 73 41 67 67 20 20 20 20 20 20 20 20 20 20  HasAgg          
cd30: 20 2f 2a 20 53 65 74 20 74 6f 20 54 52 55 45 20   /* Set to TRUE 
cd40: 69 66 20 61 6e 79 20 74 65 72 6d 20 63 6f 6e 74  if any term cont
cd50: 61 69 6e 73 20 61 6e 20 61 67 67 72 65 67 61 74  ains an aggregat
cd60: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
cd70: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
cd80: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
cd90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
cda0: 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ..  if( pOrderBy
cdb0: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ==0 || pParse->d
cdc0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
cdd0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
cde0: 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ( pOrderBy->nExp
cdf0: 72 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  r>SQLITE_MAX_COL
ce00: 55 4d 4e 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  UMN ){.    const
ce10: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 69   char *zType = i
ce20: 73 4f 72 64 65 72 20 3f 20 22 4f 52 44 45 52 22  sOrder ? "ORDER"
ce30: 20 3a 20 22 47 52 4f 55 50 22 3b 0a 20 20 20 20   : "GROUP";.    
ce40: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ce50: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
ce60: 79 20 74 65 72 6d 73 20 69 6e 20 25 73 20 42 59  y terms in %s BY
ce70: 20 63 6c 61 75 73 65 22 2c 20 7a 54 79 70 65 29   clause", zType)
ce80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
ce90: 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70    }.  pEList = p
cea0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
ceb0: 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
cec0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
ced0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
cee0: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
cef0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  r; i++){.    int
cf00: 20 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20   iCol;.    Expr 
cf10: 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  *pE = pOrderBy->
cf20: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
cf30: 69 43 6f 6c 20 3d 20 6d 61 74 63 68 4f 72 64 65  iCol = matchOrde
cf40: 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73  rByTermToExprLis
cf50: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
cf60: 74 2c 20 70 45 2c 20 69 2b 31 2c 20 30 2c 20 70  t, pE, i+1, 0, p
cf70: 48 61 73 41 67 67 29 3b 0a 20 20 20 20 69 66 28  HasAgg);.    if(
cf80: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
cf90: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
cfa0: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 70 45  .    if( iCol>pE
cfb0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
cfc0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
cfd0: 2a 7a 54 79 70 65 20 3d 20 69 73 4f 72 64 65 72  *zType = isOrder
cfe0: 20 3f 20 22 4f 52 44 45 52 22 20 3a 20 22 47 52   ? "ORDER" : "GR
cff0: 4f 55 50 22 3b 0a 20 20 20 20 20 20 73 71 6c 69  OUP";.      sqli
d000: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d010: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 22 25  se, .         "%
d020: 72 20 25 73 20 42 59 20 74 65 72 6d 20 6f 75 74  r %s BY term out
d030: 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75   of range - shou
d040: 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20  ld be ".        
d050: 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20   "between 1 and 
d060: 25 64 22 2c 20 69 2b 31 2c 20 7a 54 79 70 65 2c  %d", i+1, zType,
d070: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
d080: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
d090: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
d0a0: 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 43  Col>0 ){.      C
d0b0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
d0c0: 70 45 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  pE->pColl;.     
d0d0: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 45 2d   int flags = pE-
d0e0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
d0f0: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 73 71  ollate;.      sq
d100: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
d110: 70 45 29 3b 0a 20 20 20 20 20 20 70 45 20 3d 20  pE);.      pE = 
d120: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
d130: 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  b, pEList->a[iCo
d140: 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  l-1].pExpr);.   
d150: 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
d160: 5d 2e 70 45 78 70 72 20 3d 20 70 45 3b 0a 20 20  ].pExpr = pE;.  
d170: 20 20 20 20 69 66 28 20 70 45 20 26 26 20 70 43      if( pE && pC
d180: 6f 6c 6c 20 26 26 20 66 6c 61 67 73 20 29 7b 0a  oll && flags ){.
d190: 20 20 20 20 20 20 20 20 70 45 2d 3e 70 43 6f 6c          pE->pCol
d1a0: 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  l = pColl;.     
d1b0: 20 20 20 70 45 2d 3e 66 6c 61 67 73 20 7c 3d 20     pE->flags |= 
d1c0: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 7d 0a 20  flags;.      }. 
d1d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
d1e0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 0;.}../*.** An
d1f0: 61 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20  alyze and ORDER 
d200: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
d210: 6c 61 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43  lause in a SELEC
d220: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65  T statement.  Re
d230: 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
d240: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
d250: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  n..**.** The pro
d260: 63 65 73 73 69 6e 67 20 64 65 70 65 6e 64 73 20  cessing depends 
d270: 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 20 53  on whether the S
d280: 45 4c 45 43 54 20 69 73 20 73 69 6d 70 6c 65 20  ELECT is simple 
d290: 6f 72 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2a 20  or compound..** 
d2a0: 46 6f 72 20 61 20 73 69 6d 70 6c 65 20 53 45 4c  For a simple SEL
d2b0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 65  ECT statement, e
d2c0: 76 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  vry term of the 
d2d0: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
d2e0: 50 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 6e  P BY.** clause n
d2f0: 65 65 64 73 20 74 6f 20 62 65 20 61 6e 20 65 78  eeds to be an ex
d300: 70 72 65 73 73 69 6f 6e 2e 20 20 49 66 20 61 6e  pression.  If an
d310: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  y expression is 
d320: 61 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f  an integer.** co
d330: 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 61  nstant, then tha
d340: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
d350: 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20  replaced by the 
d360: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 2a  corresponding .*
d370: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  * expression fro
d380: 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  m the result set
d390: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6d 70  ..**.** For comp
d3a0: 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
d3b0: 65 6d 65 6e 74 73 2c 20 65 76 65 72 79 20 65 78  ements, every ex
d3c0: 70 72 65 73 73 69 6f 6e 20 6e 65 65 64 73 20 74  pression needs t
d3d0: 6f 20 62 65 20 6f 66 0a 2a 2a 20 74 79 70 65 20  o be of.** type 
d3e0: 54 4b 5f 43 4f 4c 55 4d 4e 20 77 69 74 68 20 61  TK_COLUMN with a
d3f0: 20 69 54 61 62 6c 65 20 76 61 6c 75 65 20 61 73   iTable value as
d400: 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 34 74   given in the 4t
d410: 68 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20  h parameter..** 
d420: 49 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  If any expressio
d430: 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c  n is an integer,
d440: 20 74 68 61 74 20 62 65 63 6f 6d 65 73 20 74 68   that becomes th
d450: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e  e column number.
d460: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 6d  .** Otherwise, m
d470: 61 74 63 68 20 74 68 65 20 65 78 70 72 65 73 73  atch the express
d480: 69 6f 6e 20 61 67 61 69 6e 73 74 20 72 65 73 75  ion against resu
d490: 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 66  lt set columns f
d4a0: 72 6f 6d 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2d  rom.** the left-
d4b0: 6d 6f 73 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  most SELECT..*/.
d4c0: 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65  static int proce
d4d0: 73 73 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42  ssCompoundOrderB
d4e0: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
d4f0: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
d500: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20  rsing context.  
d510: 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  Leave error mess
d520: 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 53  ages here */.  S
d530: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
d540: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
d550: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e  CT statement con
d560: 74 61 69 6e 69 6e 67 20 74 68 65 20 4f 52 44 45  taining the ORDE
d570: 52 20 42 59 20 2a 2f 0a 20 20 69 6e 74 20 69 54  R BY */.  int iT
d580: 61 62 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  able            
d590: 2f 2a 20 4f 75 74 70 75 74 20 74 61 62 6c 65 20  /* Output table 
d5a0: 66 6f 72 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  for compound SEL
d5b0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  ECT statements *
d5c0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
d5d0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
d5e0: 42 79 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  By;.  ExprList *
d5f0: 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65  pEList;.  sqlite
d600: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 6d 6f 72  3 *db;.  int mor
d610: 65 54 6f 44 6f 20 3d 20 31 3b 0a 0a 20 20 70 4f  eToDo = 1;..  pO
d620: 72 64 65 72 42 79 20 3d 20 70 53 65 6c 65 63 74  rderBy = pSelect
d630: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66  ->pOrderBy;.  if
d640: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ( pOrderBy==0 ) 
d650: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
d660: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e  pOrderBy->nExpr>
d670: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
d680: 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
d690: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
d6a0: 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73   "too many terms
d6b0: 20 69 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   in ORDER BY cla
d6c0: 75 73 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72  use");.    retur
d6d0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20  n 1;.  }.  db = 
d6e0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f  pParse->db;.  fo
d6f0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
d700: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
d710: 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
d720: 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  i].done = 0;.  }
d730: 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63  .  while( pSelec
d740: 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  t->pPrior ){.   
d750: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
d760: 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a  ct->pPrior;.  }.
d770: 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
d780: 20 26 26 20 6d 6f 72 65 54 6f 44 6f 20 29 7b 0a   && moreToDo ){.
d790: 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 30      moreToDo = 0
d7a0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
d7b0: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
d7c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
d7d0: 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  t iCol = -1;.   
d7e0: 20 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 44     Expr *pE, *pD
d7f0: 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  up;.      if( pO
d800: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
d810: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
d820: 20 20 20 20 70 45 20 3d 20 70 4f 72 64 65 72 42      pE = pOrderB
d830: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
d840: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
d850: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
d860: 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 64  E);.      if( !d
d870: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d880: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
d890: 74 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  t(pDup);.       
d8a0: 20 69 43 6f 6c 20 3d 20 6d 61 74 63 68 4f 72 64   iCol = matchOrd
d8b0: 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69  erByTermToExprLi
d8c0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
d8d0: 63 74 2c 20 70 44 75 70 2c 20 69 2b 31 2c 20 31  ct, pDup, i+1, 1
d8e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
d8f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
d900: 65 6c 65 74 65 28 70 44 75 70 29 3b 0a 20 20 20  elete(pDup);.   
d910: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
d920: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d930: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
d940: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
d950: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  t->pEList;.     
d960: 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29   if( pEList==0 )
d970: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
d980: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
d990: 20 20 69 66 28 20 69 43 6f 6c 3e 70 45 4c 69 73    if( iCol>pELis
d9a0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
d9b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d9c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
d9d0: 20 20 20 20 20 20 20 20 22 25 72 20 4f 52 44 45          "%r ORDE
d9e0: 52 20 42 59 20 74 65 72 6d 20 6f 75 74 20 6f 66  R BY term out of
d9f0: 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20   range - should 
da00: 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  be ".           
da10: 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25  "between 1 and %
da20: 64 22 2c 20 69 2b 31 2c 20 70 45 4c 69 73 74 2d  d", i+1, pEList-
da30: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >nExpr);.       
da40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
da50: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f   }.      if( iCo
da60: 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  l>0 ){.        p
da70: 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  E->op = TK_COLUM
da80: 4e 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 69  N;.        pE->i
da90: 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
daa0: 20 20 20 20 20 20 20 20 70 45 2d 3e 69 41 67 67          pE->iAgg
dab0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 70   = -1;.        p
dac0: 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  E->iColumn = iCo
dad0: 6c 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 45 2d  l-1;.        pE-
dae0: 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20  >pTab = 0;.     
daf0: 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
db00: 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  ].done = 1;.    
db10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
db20: 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 20   moreToDo = 1;. 
db30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
db40: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
db50: 63 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  ct->pNext;.  }. 
db60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
db70: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
db80: 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  ){.    if( pOrde
db90: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 3d 3d  rBy->a[i].done==
dba0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
dbb0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
dbc0: 65 2c 20 22 25 72 20 4f 52 44 45 52 20 42 59 20  e, "%r ORDER BY 
dbd0: 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61  term does not ma
dbe0: 74 63 68 20 61 6e 79 20 22 0a 20 20 20 20 20 20  tch any ".      
dbf0: 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 20 69 6e        "column in
dc00: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 22   the result set"
dc10: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 72 65  , i+1);.      re
dc20: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
dc30: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
dc40: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42  ./*.** Get a VDB
dc50: 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  E for the given 
dc60: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20  parser context. 
dc70: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
dc80: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
dc90: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
dca0: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
dcb0: 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d  LL and leave a m
dcc0: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
dcd0: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
dce0: 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20  e3GetVdbe(Parse 
dcf0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
dd00: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
dd10: 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  dbe;.  if( v==0 
dd20: 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73  ){.    v = pPars
dd30: 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74  e->pVdbe = sqlit
dd40: 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61  e3VdbeCreate(pPa
dd50: 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65  rse->db);.#ifnde
dd60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
dd70: 41 43 45 0a 20 20 20 20 69 66 28 20 76 20 29 7b  ACE.    if( v ){
dd80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
dd90: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54  beAddOp0(v, OP_T
dda0: 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  race);.    }.#en
ddb0: 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
ddc0: 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   v;.}.../*.** Co
ddd0: 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74  mpute the iLimit
dde0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65   and iOffset fie
ddf0: 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lds of the SELEC
de00: 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  T based on the.*
de10: 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  * pLimit and pOf
de20: 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73  fset expressions
de30: 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  .  pLimit and pO
de40: 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65  ffset hold the e
de50: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68  xpressions.** th
de60: 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  at appear in the
de70: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
de80: 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68  atement after th
de90: 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
dea0: 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20  ET.** keywords. 
deb0: 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73   Or NULL if thos
dec0: 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f  e keywords are o
ded0: 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61  mitted. iLimit a
dee0: 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61  nd iOffset .** a
def0: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d  re the integer m
df00: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e  emory register n
df10: 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74  umbers for count
df20: 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ers used to comp
df30: 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69  ute .** the limi
df40: 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49  t and offset.  I
df50: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69  f there is no li
df60: 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65  mit and/or offse
df70: 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d  t, then .** iLim
df80: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61  it and iOffset a
df90: 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  re negative..**.
dfa0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
dfb0: 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75  changes the valu
dfc0: 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64  es of iLimit and
dfd0: 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66   iOffset only if
dfe0: 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f  .** a limit or o
dff0: 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  ffset is defined
e000: 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70   by pLimit and p
e010: 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20  Offset.  iLimit 
e020: 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73  and.** iOffset s
e030: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
e040: 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70  preset to approp
e050: 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61  riate default va
e060: 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79  lues.** (usually
e070: 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20   but not always 
e080: 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  -1) prior to cal
e090: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
e0a0: 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c  e..** Only if pL
e0b0: 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73  imit!=0 or pOffs
e0c0: 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d  et!=0 do the lim
e0d0: 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74  it registers get
e0e0: 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20  .** redefined.  
e0f0: 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
e100: 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73  erator uses this
e110: 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72   property to for
e120: 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20  ce.** the reuse 
e130: 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69  of the same limi
e140: 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67  t and offset reg
e150: 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75  isters across mu
e160: 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54  ltiple.** SELECT
e170: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
e180: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
e190: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
e1a0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
e1b0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
e1c0: 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20  iBreak){.  Vdbe 
e1d0: 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c  *v = 0;.  int iL
e1e0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  imit = 0;.  int 
e1f0: 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61  iOffset;.  int a
e200: 64 64 72 31 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ddr1;..  /* .  *
e210: 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77  * "LIMIT -1" alw
e220: 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f  ays shows all ro
e230: 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f  ws.  There is so
e240: 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65  me.  ** contrave
e250: 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74  rsy about what t
e260: 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
e270: 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20  ior should be.. 
e280: 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   ** The current 
e290: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
e2a0: 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54  nterprets "LIMIT
e2b0: 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a   0" to mean.  **
e2c0: 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20   no rows..  */. 
e2d0: 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
e2e0: 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20  {.    p->iLimit 
e2f0: 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61  = iLimit = ++pPa
e300: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76  rse->nMem;.    v
e310: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
e320: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
e330: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
e340: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
e350: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d  rCode(pParse, p-
e360: 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29  >pLimit, iLimit)
e370: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e380: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
e390: 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29  stBeInt, iLimit)
e3a0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
e3b0: 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
e3c0: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 73 71 6c  nter"));.    sql
e3d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e3e0: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69  , OP_IfZero, iLi
e3f0: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
e400: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73  }.  if( p->pOffs
e410: 65 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4f 66  et ){.    p->iOf
e420: 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d  fset = iOffset =
e430: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
e440: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  .    if( p->pLim
e450: 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  it ){.      pPar
e460: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a  se->nMem++;   /*
e470: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74   Allocate an ext
e480: 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ra register for 
e490: 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a  limit+offset */.
e4a0: 20 20 20 20 7d 0a 20 20 20 20 76 20 3d 20 73 71      }.    v = sq
e4b0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
e4c0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
e4d0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
e4e0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e4f0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66  (pParse, p->pOff
e500: 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  set, iOffset);. 
e510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e520: 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
e530: 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a  eInt, iOffset);.
e540: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
e550: 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e  (v, "OFFSET coun
e560: 74 65 72 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ter"));.    addr
e570: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
e580: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
e590: 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  s, iOffset);.   
e5a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e5b0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
e5c0: 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  , 0, iOffset);. 
e5d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
e5e0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
e5f0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69  ;.    if( p->pLi
e600: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  mit ){.      sql
e610: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
e620: 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74  , OP_Add, iLimit
e630: 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73  , iOffset, iOffs
e640: 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62  et+1);.      Vdb
e650: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
e660: 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20  MIT+OFFSET"));. 
e670: 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
e680: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
e690: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d  , OP_IfPos, iLim
e6a0: 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  it);.      sqlit
e6b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e6c0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20  OP_Integer, -1, 
e6d0: 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20  iOffset+1);.    
e6e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
e6f0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
e700: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
e710: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 76  .** Allocate a v
e720: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20  irtual index to 
e730: 75 73 65 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e  use for sorting.
e740: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e750: 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64  createSortingInd
e760: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
e770: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 45 78 70  , Select *p, Exp
e780: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 29  rList *pOrderBy)
e790: 7b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  {.  if( pOrderBy
e7a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
e7b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
e7c0: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
e7d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 64 65  ==0 );.    pOrde
e7e0: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  rBy->iECursor = 
e7f0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
e800: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
e810: 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
e820: 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4f  rse->pVdbe, OP_O
e830: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72            pOrder
e860: 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f  By->iECursor, pO
e870: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 29  rderBy->nExpr+1)
e880: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
e890: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
e8a0: 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 70 2d   == -1 );.    p-
e8b0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
e8c0: 20 3d 20 61 64 64 72 3b 0a 20 20 7d 0a 7d 0a 0a   = addr;.  }.}..
e8d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e8e0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
e8f0: 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
e900: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
e910: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
e920: 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  nce for the iCol
e930: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
e940: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
e950: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
e960: 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
e970: 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
e980: 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
e990: 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
e9a0: 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
e9b0: 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
e9c0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
e9d0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
e9e0: 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
e9f0: 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
ea00: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
ea10: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
ea20: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
ea30: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
ea40: 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
ea50: 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
ea60: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
ea70: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
ea80: 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
ea90: 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
eaa0: 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
eab0: 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
eac0: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
ead0: 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
eae0: 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
eaf0: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
eb00: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b    if( pRet==0 ){
eb10: 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
eb20: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
eb30: 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
eb40: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29  ->a[iCol].pExpr)
eb50: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
eb60: 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Ret;.}.#endif /*
eb70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
eb80: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
eb90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
eba0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
ebb0: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  LECT./*.** This 
ebc0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
ebd0: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71  d to process a q
ebe0: 75 65 72 79 20 74 68 61 74 20 69 73 20 72 65 61  uery that is rea
ebf0: 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a  lly the union.**
ec00: 20 6f 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e   or intersection
ec10: 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   of two or more 
ec20: 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73  separate queries
ec30: 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e  ..**.** "p" poin
ec40: 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ts to the right-
ec50: 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20  most of the two 
ec60: 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75  queries.  the qu
ec70: 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65  ery on the.** le
ec80: 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e  ft is p->pPrior.
ec90: 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79    The left query
eca0: 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61   could also be a
ecb0: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a   compound query.
ecc0: 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  ** in which case
ecd0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
ece0: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63  ll be called rec
ecf0: 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a  ursively. .**.**
ed00: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
ed10: 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
ed20: 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65  are to be writte
ed30: 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61  n into a destina
ed40: 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20  tion.** of type 
ed50: 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d  eDest with param
ed60: 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  eter iParm..**.*
ed70: 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f  * Example 1:  Co
ed80: 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77  nsider a three-w
ed90: 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20  ay compound SQL 
eda0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
edb0: 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
edc0: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
edd0: 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49  CT b FROM t2 UNI
ede0: 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  ON SELECT c FROM
edf0: 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73   t3.**.** This s
ee00: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
ee10: 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73  ed up as follows
ee20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
ee30: 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20  CT c FROM t3.** 
ee40: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60       |.**      `
ee50: 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62  ----->  SELECT b
ee60: 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20   FROM t2.**     
ee70: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
ee80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60                 `
ee90: 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  ------>  SELECT 
eea0: 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20  a FROM t1.**.** 
eeb0: 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68  The arrows in th
eec0: 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20  e diagram above 
eed0: 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65  represent the Se
eee0: 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e  lect.pPrior poin
eef0: 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68  ter..** So if th
ef00: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
ef10: 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61  lled with p equa
ef20: 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72  l to the t3 quer
ef30: 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f  y, then.** pPrio
ef40: 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32  r will be the t2
ef50: 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77   query.  p->op w
ef60: 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20  ill be TK_UNION 
ef70: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
ef80: 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20  .** Notice that 
ef90: 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
efa0: 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73  ay SQLite parses
efb0: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
efc0: 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  s, the.** indivi
efd0: 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77  dual selects alw
efe0: 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c  ays group from l
eff0: 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f  eft to right..*/
f000: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
f010: 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  iSelect(.  Parse
f020: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
f030: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
f040: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
f050: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
f060: 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
f070: 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
f080: 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
f090: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
f0a0: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
f0b0: 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
f0c0: 6c 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  lts */.  char *a
f0d0: 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ff             /
f0e0: 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52  * If eDest is SR
f0f0: 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66  T_Union, the aff
f100: 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  inity string */.
f110: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
f120: 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75  LITE_OK;   /* Su
f130: 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20  ccess code from 
f140: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
f150: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
f160: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
f170: 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
f180: 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
f190: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f1b0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
f1c0: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
f1d0: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
f1e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
f1f0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
f200: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
f210: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
f220: 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f  erBy;   /* The O
f230: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
f240: 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20 61 53 65  n p */.  int aSe
f250: 74 50 32 5b 32 5d 3b 20 20 20 20 20 20 20 20 2f  tP2[2];        /
f260: 2a 20 53 65 74 20 50 32 20 76 61 6c 75 65 20 6f  * Set P2 value o
f270: 66 20 74 68 65 73 65 20 6f 70 20 74 6f 20 6e 75  f these op to nu
f280: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
f290: 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 74 50 32 20  */.  int nSetP2 
f2a0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
f2b0: 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e  mber of slots in
f2c0: 20 61 53 65 74 50 32 5b 5d 20 75 73 65 64 20 2a   aSetP2[] used *
f2d0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
f2e0: 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74  est;      /* Alt
f2f0: 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65  ernative data de
f300: 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  stination */..  
f310: 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 0a  dest = *pDest;..
f320: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
f330: 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
f340: 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61   BY or LIMIT cla
f350: 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c  use on prior SEL
f360: 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a  ECTs.  Only.  **
f370: 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74   the last (right
f380: 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e  -most) SELECT in
f390: 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
f3a0: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
f3b0: 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a   or LIMIT..  */.
f3c0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d    if( p==0 || p-
f3d0: 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
f3e0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
f3f0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f400: 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f  end;.  }.  pPrio
f410: 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
f420: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
f430: 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72  >pRightmost!=pPr
f440: 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ior );.  assert(
f450: 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
f460: 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f  ost==p->pRightmo
f470: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 50 72 69  st );.  if( pPri
f480: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
f490: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f4a0: 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45  Msg(pParse,"ORDE
f4b0: 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75  R BY clause shou
f4c0: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
f4d0: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
f4e0: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
f4f0: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
f500: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
f510: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
f520: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f  .  }.  if( pPrio
f530: 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  r->pLimit ){.   
f540: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f550: 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63  (pParse,"LIMIT c
f560: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
f570: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
f580: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
f590: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
f5a0: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
f5b0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
f5c0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
f5d0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
f5e0: 65 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 71  e have a valid q
f5f0: 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66  uery engine.  If
f600: 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e   not, create a n
f610: 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76  ew one..  */.  v
f620: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
f630: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
f640: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20   v==0 ){.    rc 
f650: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
f660: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
f670: 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65    }..  /* Create
f680: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
f690: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f6a0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
f6b0: 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44  */.  if( dest.eD
f6c0: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
f6d0: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
f6e0: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
f6f0: 20 20 61 73 73 65 72 74 28 20 6e 53 65 74 50 32    assert( nSetP2
f700: 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29 2f  <sizeof(aSetP2)/
f710: 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30 5d  sizeof(aSetP2[0]
f720: 29 20 29 3b 0a 20 20 20 20 61 53 65 74 50 32 5b  ) );.    aSetP2[
f730: 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 73 71 6c 69  nSetP2++] = sqli
f740: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f750: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
f760: 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c 20 30  l, dest.iParm, 0
f770: 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73  );.    dest.eDes
f780: 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
f790: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
f7a0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
f7b0: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
f7c0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
f7d0: 0a 20 20 2a 2f 0a 20 20 70 4f 72 64 65 72 42 79  .  */.  pOrderBy
f7e0: 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
f7f0: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
f800: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
f810: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  LL: {.      if( 
f820: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
f830: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
f840: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 73 73  = 0;.        ass
f850: 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c  ert( !pPrior->pL
f860: 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20  imit );.        
f870: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
f880: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
f890: 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66      pPrior->pOff
f8a0: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
f8b0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
f8c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
f8d0: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
f8e0: 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  st, 0, 0, 0, aff
f8f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c  );.        p->pL
f900: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
f910: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
f920: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
f930: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
f940: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f950: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
f960: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
f970: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
f980: 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
f990: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
f9a0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
f9b0: 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
f9c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69          if( p->i
f9d0: 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20  Limit>=0 ){.    
f9e0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
f9f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
fa00: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e  , OP_IfZero, p->
fa10: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20  iLimit);.       
fa20: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
fa30: 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69  v, "Jump ahead i
fa40: 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22  f LIMIT reached"
fa50: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
fa60: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
fa70: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
fa80: 20 70 2c 20 26 64 65 73 74 2c 20 30 2c 20 30 2c   p, &dest, 0, 0,
fa90: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
faa0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
fab0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66  rior;.        if
fac0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
fad0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
fae0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
faf0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61   }.        if( a
fb00: 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ddr ){.         
fb10: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
fb20: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
fb30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fb40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
fb50: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49        /* For UNI
fb60: 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52  ON ALL ... ORDER
fb70: 20 42 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   BY fall through
fb80: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73   to the next cas
fb90: 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
fba0: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20  ase TK_EXCEPT:. 
fbb0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
fbc0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e  : {.      int un
fbd0: 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75  ionTab;    /* Cu
fbe0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
fbf0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
fc00: 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  le holding resul
fc10: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f  t */.      int o
fc20: 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f  p = 0;      /* O
fc30: 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f  ne of the SRT_ o
fc40: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70  perations to app
fc50: 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20  ly to self */.  
fc60: 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b      int priorOp;
fc70: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f       /* The SRT_
fc80: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70   operation to ap
fc90: 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c  ply to prior sel
fca0: 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  ects */.      Ex
fcb0: 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
fcc0: 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76  fset; /* Saved v
fcd0: 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d  alues of p->nLim
fce0: 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65  it and p->nOffse
fcf0: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
fd00: 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  ddr;.      Selec
fd10: 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b  tDest uniondest;
fd20: 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20  ..      priorOp 
fd30: 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  = p->op==TK_ALL 
fd40: 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52  ? SRT_Table : SR
fd50: 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69  T_Union;.      i
fd60: 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70  f( dest.eDest==p
fd70: 72 69 6f 72 4f 70 20 26 26 20 70 4f 72 64 65 72  riorOp && pOrder
fd80: 42 79 3d 3d 30 20 26 26 20 21 70 2d 3e 70 4c 69  By==0 && !p->pLi
fd90: 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f 66 66 73  mit && !p->pOffs
fda0: 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  et ){.        /*
fdb0: 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20   We can reuse a 
fdc0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
fdd0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53  generated by a S
fde0: 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20  ELECT to our.   
fdf0: 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20       ** right.. 
fe00: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
fe10: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73    unionTab = des
fe20: 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  t.iParm;.      }
fe30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
fe40: 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
fe50: 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
fe60: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
fe70: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
fe80: 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
fe90: 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
fea0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
feb0: 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
fec0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
fed0: 20 20 20 69 66 28 20 70 72 6f 63 65 73 73 43 6f     if( processCo
fee0: 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50  mpoundOrderBy(pP
fef0: 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54 61  arse, p, unionTa
ff00: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
ff10: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
ff20: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
ff30: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
ff40: 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72 20   }.        addr 
ff50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ff60: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
ff70: 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61  hemeral, unionTa
ff80: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 0);.        i
ff90: 66 28 20 70 72 69 6f 72 4f 70 3d 3d 53 52 54 5f  f( priorOp==SRT_
ffa0: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
ffb0: 20 20 20 61 73 73 65 72 74 28 20 6e 53 65 74 50     assert( nSetP
ffc0: 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29  2<sizeof(aSetP2)
ffd0: 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30  /sizeof(aSetP2[0
ffe0: 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ]) );.          
fff0: 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d  aSetP2[nSetP2++]
10000 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
10010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10020 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
10030 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
10040 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1 );.          
10050 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
10060 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
10070 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f       p->pRightmo
10080 73 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20 31  st->usesEphm = 1
10090 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
100a0 20 20 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e      createSortin
100b0 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  gIndex(pParse, p
100c0 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
100d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
100e0 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
100f0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
10100 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
10110 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65  ements to our le
10120 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ft.      */.    
10130 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
10140 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  r->pOrderBy );. 
10150 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
10160 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f  ctDestInit(&unio
10170 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20  ndest, priorOp, 
10180 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20  unionTab);.     
10190 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
101a0 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
101b0 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 2c 20  or, &uniondest, 
101c0 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
101d0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
101e0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
101f0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
10200 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
10210 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
10220 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10230 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
10240 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
10250 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  {.         case 
10260 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d  TK_EXCEPT:  op =
10270 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62   SRT_Except;   b
10280 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
10290 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20  ase TK_UNION:   
102a0 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20  op = SRT_Union; 
102b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
102c0 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
102d0 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62      op = SRT_Tab
102e0 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  le;    break;.  
102f0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
10300 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
10310 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
10320 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 73 61 6c  ;.      p->disal
10330 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  lowOrderBy = pOr
10340 64 65 72 42 79 21 3d 30 3b 0a 20 20 20 20 20 20  derBy!=0;.      
10350 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
10360 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
10370 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
10380 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
10390 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
103a0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
103b0 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74   uniondest.eDest
103c0 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 72 63 20   = op;.      rc 
103d0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
103e0 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f  pParse, p, &unio
103f0 6e 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  ndest, 0, 0, 0, 
10400 61 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51  aff);.      /* Q
10410 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
10420 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
10430 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20  () might refill 
10440 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20  p->pOrderBy..   
10450 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f     ** Be sure to
10460 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65   delete p->pOrde
10470 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20  rBy, therefore, 
10480 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72  to avoid a memor
10490 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20  y leak. */.     
104a0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
104b0 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72  Delete(p->pOrder
104c0 42 79 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  By);.      p->pP
104d0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
104e0 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
104f0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
10500 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
10510 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b  lete(p->pLimit);
10520 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
10530 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
10540 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
10550 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
10560 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20  iLimit = -1;.   
10570 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
10580 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  -1;.      if( rc
10590 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
105a0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
105b0 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20  d;.      }...   
105c0 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
105d0 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65  e data in the te
105e0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e  mporary table in
105f0 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
10600 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
10610 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c  that we currentl
10620 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  y need..      */
10630 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
10640 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
10650 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62  orOp || unionTab
10660 21 3d 64 65 73 74 2e 69 50 61 72 6d 20 29 7b 0a  !=dest.iParm ){.
10670 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
10680 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
10690 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
106a0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
106b0 20 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74          if( dest
106c0 2e 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c  .eDest==SRT_Call
106d0 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
106e0 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
106f0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
10700 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
10710 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
10720 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
10730 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72  .          gener
10740 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
10750 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
10760 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
10770 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72     }.        iBr
10780 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
10790 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
107a0 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
107b0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
107c0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
107d0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
107e0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
107f0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
10800 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10810 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
10820 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65  , unionTab, iBre
10830 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74  ak);.        iSt
10840 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
10850 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
10860 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49  .        selectI
10870 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
10880 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75   p, p->pEList, u
10890 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69  nionTab, p->pELi
108a0 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
108b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108c0 20 20 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c     pOrderBy, -1,
108d0 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
108e0 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Break, 0);.     
108f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
10900 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
10910 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
10920 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10930 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
10940 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20  nTab, iStart);. 
10950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10960 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
10970 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
10980 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10990 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
109a0 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
109b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
109c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
109d0 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
109e0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61  : {.      int ta
109f0 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
10a00 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
10a10 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
10a20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
10a30 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
10a40 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
10a50 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73  electDest inters
10a60 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69  ectdest;.      i
10a70 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a  nt r1;..      /*
10a80 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
10a90 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
10aa0 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
10ab0 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
10ac0 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
10ad0 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
10ae0 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
10af0 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
10b00 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
10b10 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
10b20 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
10b30 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
10b40 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
10b50 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
10b60 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
10b70 20 20 20 20 20 69 66 28 20 70 72 6f 63 65 73 73       if( process
10b80 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28  CompoundOrderBy(
10b90 70 50 61 72 73 65 2c 20 70 2c 20 74 61 62 31 29  pParse, p, tab1)
10ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
10bb0 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
10bc0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
10bd0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
10be0 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e   createSortingIn
10bf0 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20 70  dex(pParse, p, p
10c00 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20 20 20 20  OrderBy);..     
10c10 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
10c20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10c30 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
10c40 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab1, 0);.      a
10c50 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
10c60 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
10c70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
10c80 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
10c90 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 69  dr;.      p->pRi
10ca0 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70 68  ghtmost->usesEph
10cb0 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  m = 1;.      ass
10cc0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
10cd0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
10ce0 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20   the SELECTs to 
10cf0 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65  our left into te
10d00 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
10d10 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ab1"..      */. 
10d20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
10d30 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65  ctDestInit(&inte
10d40 72 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55  rsectdest, SRT_U
10d50 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20  nion, tab1);.   
10d60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
10d70 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
10d80 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74  rior, &intersect
10d90 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61  dest, 0, 0, 0, a
10da0 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ff);.      if( r
10db0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
10dc0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
10dd0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
10de0 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
10df0 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
10e00 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
10e10 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
10e20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  */.      addr = 
10e30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10e40 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
10e50 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b  meral, tab2, 0);
10e60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10e70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
10e80 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
10e90 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
10ea0 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [1] = addr;.    
10eb0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
10ec0 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
10ed0 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
10ee0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
10ef0 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
10f00 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
10f10 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
10f20 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63  ;.      intersec
10f30 74 64 65 73 74 2e 69 50 61 72 6d 20 3d 20 74 61  tdest.iParm = ta
10f40 62 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  b2;.      rc = s
10f50 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
10f60 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65  rse, p, &interse
10f70 63 74 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c  ctdest, 0, 0, 0,
10f80 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e   aff);.      p->
10f90 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
10fa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10fb0 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d  prDelete(p->pLim
10fc0 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  it);.      p->pL
10fd0 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
10fe0 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
10ff0 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  = pOffset;.     
11000 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
11010 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
11020 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
11030 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  }..      /* Gene
11040 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
11050 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
11060 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
11070 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
11080 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
11090 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
110a0 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
110b0 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
110c0 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
110d0 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  ){.        Selec
110e0 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  t *pFirst = p;. 
110f0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46         while( pF
11100 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
11110 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
11120 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
11130 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
11140 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
11150 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
11160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42        }.      iB
11170 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
11180 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
11190 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
111a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
111b0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d  el(v);.      com
111c0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
111d0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
111e0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
111f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11200 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62  , OP_Rewind, tab
11210 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  1, iBreak);.    
11220 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
11230 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
11240 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d  ;.      iStart =
11250 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11260 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c  p2(v, OP_RowKey,
11270 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20   tab1, r1);.    
11280 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11290 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Op3(v, OP_NotFou
112a0 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c  nd, tab2, iCont,
112b0 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
112c0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
112d0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
112e0 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
112f0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
11300 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c  p->pEList, tab1,
11310 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
11320 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
11330 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42           pOrderB
11340 79 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69 43  y, -1, &dest, iC
11350 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b  ont, iBreak, 0);
11360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11370 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
11380 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
11390 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
113a0 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  2(v, OP_Next, ta
113b0 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  b1, iStart);.   
113c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
113d0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
113e0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
113f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11400 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
11410 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
11420 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11430 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
11440 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
11450 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11460 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
11470 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
11480 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
11490 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
114a0 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
114b0 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
114c0 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
114d0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
114e0 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
114f0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  );.  if( p->pELi
11500 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f  st->nExpr!=pPrio
11510 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  r->pEList->nExpr
11520 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
11530 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11540 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
11550 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
11560 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f  f %s".      " do
11570 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61   not have the sa
11580 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  me number of res
11590 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65  ult columns", se
115a0 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
115b0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
115c0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
115d0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
115e0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d    /* Set the num
115f0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
11600 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
11610 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d  es.  */.  nCol =
11620 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
11630 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 65 74  r;.  while( nSet
11640 50 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  P2 ){.    sqlite
11650 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
11660 20 61 53 65 74 50 32 5b 2d 2d 6e 53 65 74 50 32   aSetP2[--nSetP2
11670 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20  ], nCol);.  }.. 
11680 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c   /* Compute coll
11690 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
116a0 75 73 65 64 20 62 79 20 65 69 74 68 65 72 20 74  used by either t
116b0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
116c0 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e  se or.  ** by an
116d0 79 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  y temporary tabl
116e0 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70  es needed to imp
116f0 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f  lement the compo
11700 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a  und select..  **
11710 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49   Attach the KeyI
11720 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f  nfo structure to
11730 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74   all temporary t
11740 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74  ables.  Invoke t
11750 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59  he.  ** ORDER BY
11760 20 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74   processing if t
11770 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
11780 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a   BY clause..  **
11790 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
117a0 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
117b0 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
117c0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
117d0 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
117e0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
117f0 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
11800 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
11810 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
11820 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
11830 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
11840 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
11850 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11860 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
11870 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
11880 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
11890 20 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e   pOrderBy || p->
118a0 75 73 65 73 45 70 68 6d 20 29 7b 0a 20 20 20 20  usesEphm ){.    
118b0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
118d0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
118e0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
118f0 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
11900 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
11910 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
11920 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
11930 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
11940 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11950 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
11960 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73  through SELECT s
11970 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
11980 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20   int nKeyCol;   
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
119a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
119b0 69 65 73 20 69 6e 20 70 4b 65 79 49 6e 66 6f 2d  ies in pKeyInfo-
119c0 3e 61 43 6f 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43  >aCol[] */.    C
119d0 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b  ollSeq **apColl;
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
119f0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
11a00 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  ugh pKeyInfo->aC
11a10 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c  oll[] */.    Col
11a20 6c 53 65 71 20 2a 2a 61 43 6f 70 79 3b 20 20 20  lSeq **aCopy;   
11a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
11a40 63 6f 70 79 20 6f 66 20 70 4b 65 79 49 6e 66 6f  copy of pKeyInfo
11a50 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 0a 20 20  ->aColl[] */..  
11a60 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
11a70 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20  ghtmost==p );.  
11a80 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c    nKeyCol = nCol
11a90 20 2b 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70   + (pOrderBy ? p
11aa0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a  OrderBy->nExpr :
11ab0 20 30 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66   0);.    pKeyInf
11ac0 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
11ad0 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
11ae0 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
11af0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
11b00 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 4b 65  f(*pKeyInfo)+nKe
11b10 79 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  yCol*(sizeof(Col
11b20 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20  lSeq*) + 1));.  
11b30 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20    if( !pKeyInfo 
11b40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
11b50 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
11b60 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
11b70 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
11b80 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e      pKeyInfo->en
11b90 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e  c = ENC(pParse->
11ba0 64 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  db);.    pKeyInf
11bb0 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c  o->nField = nCol
11bc0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  ;..    for(i=0, 
11bd0 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d  apColl=pKeyInfo-
11be0 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  >aColl; i<nCol; 
11bf0 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a  i++, apColl++){.
11c00 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
11c10 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
11c20 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
11c30 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a  ;.      if( 0==*
11c40 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  apColl ){.      
11c50 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 50 61 72    *apColl = pPar
11c60 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
11c70 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
11c80 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ..    for(pLoop=
11c90 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
11ca0 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  pLoop->pPrior){.
11cb0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
11cc0 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
11cd0 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f    int addr = pLo
11ce0 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
11cf0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
11d00 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20   addr<0 ){.     
11d10 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69       /* If [0] i
11d20 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31  s unused then [1
11d30 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64  ] is also unused
11d40 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20  .  So we can.   
11d50 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
11d60 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73   safely abort as
11d70 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72   soon as the fir
11d80 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69  st unused slot i
11d90 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  s found */.     
11da0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
11db0 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
11dc0 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20  [1]<0 );.       
11dd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
11de0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
11df0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
11e00 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a  v, addr, nCol);.
11e10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11e20 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
11e30 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79  ddr, (char*)pKey
11e40 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
11e50 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  );.        pLoop
11e60 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
11e70 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  ] = -1;.      }.
11e80 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
11e90 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
11ea0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
11eb0 5f 69 74 65 6d 20 2a 70 4f 54 65 72 6d 20 3d 20  _item *pOTerm = 
11ec0 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 20  pOrderBy->a;.   
11ed0 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 45     int nOrderByE
11ee0 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
11ef0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  nExpr;.      int
11f00 20 61 64 64 72 3b 0a 20 20 20 20 20 20 75 38 20   addr;.      u8 
11f10 2a 70 53 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20  *pSortOrder;..  
11f20 20 20 20 20 2f 2a 20 52 65 75 73 65 20 74 68 65      /* Reuse the
11f30 20 73 61 6d 65 20 70 4b 65 79 49 6e 66 6f 20 66   same pKeyInfo f
11f40 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  or the ORDER BY 
11f50 61 73 20 77 61 73 20 75 73 65 64 20 61 62 6f 76  as was used abov
11f60 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74  e for.      ** t
11f70 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
11f80 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ct statements.  
11f90 45 78 63 65 70 74 20 77 65 20 68 61 76 65 20 74  Except we have t
11fa0 6f 20 63 68 61 6e 67 65 20 6f 75 74 20 74 68 65  o change out the
11fb0 0a 20 20 20 20 20 20 2a 2a 20 70 4b 65 79 49 6e  .      ** pKeyIn
11fc0 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75  fo->aColl[] valu
11fd0 65 73 2e 20 20 53 6f 6d 65 20 6f 66 20 74 68 65  es.  Some of the
11fe0 20 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65 73 20   aColl[] values 
11ff0 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
12000 20 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f 6e   reused when con
12010 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 70 4b  structing the pK
12020 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 4f  eyInfo for the O
12030 52 44 45 52 20 42 59 2c 20 73 6f 20 6d 61 6b 65  RDER BY, so make
12040 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79  .      ** a copy
12050 2e 20 20 53 75 66 66 69 63 69 65 6e 74 20 73 70  .  Sufficient sp
12060 61 63 65 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68  ace to hold both
12070 20 74 68 65 20 6e 43 6f 6c 20 65 6e 74 72 69 65   the nCol entrie
12080 73 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74  s for.      ** t
12090 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
120a0 63 74 20 61 6e 64 20 74 68 65 20 6e 4f 72 64 65  ct and the nOrde
120b0 72 62 79 45 78 70 72 20 65 6e 74 72 69 65 73 20  rbyExpr entries 
120c0 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  for the ORDER BY
120d0 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 61 6c  .      ** was al
120e0 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 2e 20 20  located above.  
120f0 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d  But we need to m
12100 6f 76 65 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ove the compound
12110 20 73 65 6c 65 63 74 0a 20 20 20 20 20 20 2a 2a   select.      **
12120 20 65 6e 74 72 69 65 73 20 6f 75 74 20 6f 66 20   entries out of 
12130 74 68 65 20 77 61 79 20 62 65 66 6f 72 65 20 63  the way before c
12140 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65 20  onstructing the 
12150 4f 52 44 45 52 20 42 59 20 65 6e 74 72 69 65 73  ORDER BY entries
12160 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 6f 76 65 20  ..      ** Move 
12170 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
12180 65 63 74 20 65 6e 74 72 69 65 73 20 69 6e 74 6f  ect entries into
12190 20 61 43 6f 70 79 5b 5d 20 77 68 65 72 65 20 74   aCopy[] where t
121a0 68 65 79 20 63 61 6e 20 62 65 0a 20 20 20 20 20  hey can be.     
121b0 20 2a 2a 20 61 63 63 65 73 73 65 64 20 61 6e 64   ** accessed and
121c0 20 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f 6e   reused when con
121d0 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 4f 52  structing the OR
121e0 44 45 52 20 42 59 20 65 6e 74 72 69 65 73 2e 0a  DER BY entries..
121f0 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
12200 20 6e 43 6f 6c 20 6d 69 67 68 74 20 62 65 20 67   nCol might be g
12210 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 6c  reater than or l
12220 65 73 73 20 74 68 61 6e 20 6e 4f 72 64 65 72 42  ess than nOrderB
12230 79 45 78 70 72 0a 20 20 20 20 20 20 2a 2a 20 77  yExpr.      ** w
12240 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 6d 65  e have to use me
12250 6d 6d 6f 76 65 28 29 20 77 68 65 6e 20 64 6f 69  mmove() when doi
12260 6e 67 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20  ng the copy..   
12270 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 43 6f 70     */.      aCop
12280 79 20 3d 20 26 70 4b 65 79 49 6e 66 6f 2d 3e 61  y = &pKeyInfo->a
12290 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 45 78 70  Coll[nOrderByExp
122a0 72 5d 3b 0a 20 20 20 20 20 20 70 53 6f 72 74 4f  r];.      pSortO
122b0 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  rder = pKeyInfo-
122c0 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
122d0 38 2a 29 26 61 43 6f 70 79 5b 6e 43 6f 6c 5d 3b  8*)&aCopy[nCol];
122e0 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 61  .      memmove(a
122f0 43 6f 70 79 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  Copy, pKeyInfo->
12300 61 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73 69 7a 65  aColl, nCol*size
12310 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a 0a  of(CollSeq*));..
12320 20 20 20 20 20 20 61 70 43 6f 6c 6c 20 3d 20 70        apColl = p
12330 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a  KeyInfo->aColl;.
12340 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
12350 3c 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 20 69  <nOrderByExpr; i
12360 2b 2b 2c 20 70 4f 54 65 72 6d 2b 2b 2c 20 61 70  ++, pOTerm++, ap
12370 43 6f 6c 6c 2b 2b 2c 20 70 53 6f 72 74 4f 72 64  Coll++, pSortOrd
12380 65 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45  er++){.        E
12390 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 54  xpr *pExpr = pOT
123a0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
123b0 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e      if( (pExpr->
123c0 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
123d0 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  llate) ){.      
123e0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
123f0 72 2d 3e 70 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20  r->pColl!=0 );. 
12400 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c           *apColl
12410 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b   = pExpr->pColl;
12420 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
12430 20 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c            *apCol
12440 6c 20 3d 20 61 43 6f 70 79 5b 70 45 78 70 72 2d  l = aCopy[pExpr-
12450 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20  >iColumn];.     
12460 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 53     }.        *pS
12470 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 54 65 72  ortOrder = pOTer
12480 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
12490 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
124a0 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  rt( p->pRightmos
124b0 74 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 61 73  t==p );.      as
124c0 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
124d0 6e 45 70 68 6d 5b 32 5d 3e 3d 30 20 29 3b 0a 20  nEphm[2]>=0 );. 
124e0 20 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 61       addr = p->a
124f0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3b 0a  ddrOpenEphm[2];.
12500 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12510 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
12520 72 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  r, p->pOrderBy->
12530 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 20 20  nExpr+2);.      
12540 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
12550 20 3d 20 6e 4f 72 64 65 72 42 79 45 78 70 72 3b   = nOrderByExpr;
12560 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12570 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
12580 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49  dr, (char*)pKeyI
12590 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
125a0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
125b0 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20  pKeyInfo = 0;.  
125c0 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
125d0 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20  Tail(pParse, p, 
125e0 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  v, p->pEList->nE
125f0 78 70 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  xpr, &dest);.   
12600 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
12610 66 72 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  free(pKeyInfo);.
12620 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63    }..multi_selec
12630 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e  t_end:.  pDest->
12640 69 4d 65 6d 20 3d 20 64 65 73 74 2e 69 4d 65 6d  iMem = dest.iMem
12650 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12660 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12670 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
12680 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64  SELECT */..#ifnd
12690 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
126a0 49 45 57 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44  IEW./* Forward D
126b0 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  eclarations */.s
126c0 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
126d0 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33  ExprList(sqlite3
126e0 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e  *, ExprList*, in
126f0 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  t, ExprList*);.s
12700 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
12710 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c  Select(sqlite3*,
12720 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20   Select *, int, 
12730 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a  ExprList *);../*
12740 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68  .** Scan through
12750 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
12760 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20  pExpr.  Replace 
12770 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20  every reference 
12780 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69  to.** a column i
12790 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
127a0 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70  Table with a cop
127b0 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e  y of the iColumn
127c0 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  -th.** entry in 
127d0 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65  pEList.  (But le
127e0 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ave references t
127f0 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75  o the ROWID colu
12800 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  mn .** unchanged
12810 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .).**.** This ro
12820 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66  utine is part of
12830 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
12840 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75  procedure.  A su
12850 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20  bquery.** whose 
12860 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65  result set is de
12870 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20  fined by pEList 
12880 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79  appears as entry
12890 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20   in the.** FROM 
128a0 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
128b0 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65  CT such that the
128c0 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73   VDBE cursor ass
128d0 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a  igned to that.**
128e0 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74   FORM clause ent
128f0 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54  ry is iTable.  T
12900 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
12910 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a   the necessary .
12920 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45  ** changes to pE
12930 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72  xpr so that it r
12940 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
12950 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  o the source tab
12960 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  le.** of the sub
12970 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65  query rather the
12980 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
12990 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
129a0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
129b0 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33  tExpr(.  sqlite3
129c0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
129d0 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
129e0 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e  rors to this con
129f0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
12a00 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
12a10 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
12a20 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
12a30 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ccurs */.  int i
12a40 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  Table,         /
12a50 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
12a60 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
12a70 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
12a80 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
12a90 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
12aa0 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
12ab0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
12ac0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
12ad0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
12ae0 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
12af0 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
12b00 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
12b10 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
12b20 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
12b30 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
12b40 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73  *pNew;.      ass
12b50 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26  ert( pEList!=0 &
12b60 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
12b70 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
12b80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12b90 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
12ba0 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
12bb0 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  ==0 && pExpr->pL
12bc0 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
12bd0 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61  pNew = pEList->a
12be0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
12bf0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
12c00 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b  sert( pNew!=0 );
12c10 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
12c20 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20   = pNew->op;.   
12c30 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
12c40 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20  ->pLeft==0 );.  
12c50 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
12c60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
12c70 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 4c 65 66  p(db, pNew->pLef
12c80 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
12c90 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  ( pExpr->pRight=
12ca0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
12cb0 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r->pRight = sqli
12cc0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
12cd0 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  New->pRight);.  
12ce0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
12cf0 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
12d00 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73       pExpr->pLis
12d10 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
12d20 69 73 74 44 75 70 28 64 62 2c 20 70 4e 65 77 2d  istDup(db, pNew-
12d30 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  >pList);.      p
12d40 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
12d50 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  New->iTable;.   
12d60 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
12d70 20 70 4e 65 77 2d 3e 70 54 61 62 3b 0a 20 20 20   pNew->pTab;.   
12d80 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
12d90 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d  n = pNew->iColum
12da0 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  n;.      pExpr->
12db0 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67  iAgg = pNew->iAg
12dc0 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  g;.      sqlite3
12dd0 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70  TokenCopy(db, &p
12de0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e  Expr->token, &pN
12df0 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ew->token);.    
12e00 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
12e10 70 79 28 64 62 2c 20 26 70 45 78 70 72 2d 3e 73  py(db, &pExpr->s
12e20 70 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e  pan, &pNew->span
12e30 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
12e40 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
12e50 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
12e60 4e 65 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  New->pSelect);. 
12e70 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67       pExpr->flag
12e80 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73 3b  s = pNew->flags;
12e90 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
12ea0 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62      substExpr(db
12eb0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
12ec0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
12ed0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64  .    substExpr(d
12ee0 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  b, pExpr->pRight
12ef0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
12f00 29 3b 0a 20 20 20 20 73 75 62 73 74 53 65 6c 65  );.    substSele
12f10 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 53  ct(db, pExpr->pS
12f20 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70  elect, iTable, p
12f30 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
12f40 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45  tExprList(db, pE
12f50 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62  xpr->pList, iTab
12f60 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
12f70 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
12f80 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
12f90 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
12fa0 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
12fb0 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
12fc0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
12fd0 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c  *pList,     /* L
12fe0 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
12ff0 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
13000 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
13010 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
13020 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
13030 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
13040 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
13050 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
13060 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
13070 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
13080 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
13090 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
130a0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
130b0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75  pr; i++){.    su
130c0 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73  bstExpr(db, pLis
130d0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
130e0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
130f0 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
13100 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20  d substSelect(. 
13110 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
13120 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
13130 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65  malloc errors he
13140 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  re */.  Select *
13150 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
13160 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13170 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b   in which to mak
13180 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
13190 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
131a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
131b0 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  le to be replace
131c0 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
131d0 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
131e0 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
131f0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 21 70 20   */.){.  if( !p 
13200 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73  ) return;.  subs
13210 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
13220 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  >pEList, iTable,
13230 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
13240 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
13250 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c  >pGroupBy, iTabl
13260 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
13270 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
13280 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61  p->pOrderBy, iTa
13290 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
132a0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
132b0 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65  >pHaving, iTable
132c0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
132d0 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57  stExpr(db, p->pW
132e0 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45  here, iTable, pE
132f0 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65  List);.  substSe
13300 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69  lect(db, p->pPri
13310 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  or, iTable, pELi
13320 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  st);.}.#endif /*
13330 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13340 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
13350 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13360 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54  MIT_VIEW./*.** T
13370 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
13380 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
13390 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72  subqueries in or
133a0 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20  der to speed.** 
133b0 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72  execution.  It r
133c0 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
133d0 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
133e0 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
133f0 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a  ing.** occurs..*
13400 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
13410 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
13420 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
13430 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
13440 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
13450 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
13460 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
13470 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
13480 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
13490 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
134a0 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
134b0 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
134c0 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
134d0 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
134e0 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
134f0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
13500 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
13510 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
13520 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
13530 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
13540 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
13550 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
13560 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
13570 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
13580 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
13590 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
135a0 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
135b0 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
135c0 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
135d0 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
135e0 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
135f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
13600 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
13610 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
13620 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
13630 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
13640 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
13650 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
13660 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
13670 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
13680 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
13690 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
136a0 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
136b0 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f  his simpificatio
136c0 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
136d0 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
136e0 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
136f0 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
13700 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
13710 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
13720 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
13730 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
13740 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
13750 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
13760 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
13770 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
13780 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
13790 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
137a0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
137b0 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
137c0 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
137d0 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
137e0 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
137f0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
13800 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
13810 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
13820 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  te or the outer 
13830 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
13840 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  oin..**.**   (3)
13850 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
13860 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
13870 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
13880 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f 72  t outer join, or
13890 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 73  .**        the s
138a0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 69  ubquery is not i
138b0 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20 28  tself a join.  (
138c0 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a 0a  Ticket #306).**.
138d0 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75  **   (4)  The su
138e0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
138f0 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75  STINCT or the ou
13900 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
13910 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
13920 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75 65   (5)  The subque
13930 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
13940 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
13950 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
13960 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
13970 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
13980 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65   (6)  The subque
13990 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
139a0 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
139b0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
139c0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
139d0 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
139e0 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65   (7)  The subque
139f0 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c  ry has a FROM cl
13a00 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38  ause..**.**   (8
13a10 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
13a20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
13a30 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
13a40 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
13a50 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29  oin..**.**   (9)
13a60 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
13a70 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
13a80 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
13a90 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
13aa0 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72  e.**        aggr
13ab0 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  egates..**.**  (
13ac0 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72  10)  The subquer
13ad0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
13ae0 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
13af0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
13b00 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
13b10 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a  use LIMIT..**.**
13b20 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71    (11)  The subq
13b30 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
13b40 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
13b50 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20  both have ORDER 
13b60 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  BY clauses..**.*
13b70 2a 20 20 28 31 32 29 20 20 54 68 65 20 73 75 62  *  (12)  The sub
13b80 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65  query is not the
13b90 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
13ba0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
13bb0 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   or the.**      
13bc0 20 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e    subquery has n
13bd0 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  o WHERE clause. 
13be0 20 28 61 64 64 65 64 20 62 79 20 74 69 63 6b 65   (added by ticke
13bf0 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 20 28  t #350).**.**  (
13c00 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  13)  The subquer
13c10 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72  y and outer quer
13c20 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
13c30 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20 28  e LIMIT.**.**  (
13c40 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  14)  The subquer
13c50 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f  y does not use O
13c60 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31 35  FFSET.**.**  (15
13c70 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  )  The outer que
13c80 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ry is not part o
13c90 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
13ca0 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20  ect or the.**   
13cb0 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f       subquery do
13cc0 65 73 20 6e 6f 74 20 68 61 76 65 20 62 6f 74 68  es not have both
13cd0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 61 6e 64   an ORDER BY and
13ce0 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e   a LIMIT clause.
13cf0 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
13d00 74 69 63 6b 65 74 20 23 32 33 33 39 29 0a 2a 2a  ticket #2339).**
13d10 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
13d20 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
13d30 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
13d40 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
13d50 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
13d60 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
13d70 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
13d80 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
13d90 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
13da0 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
13db0 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
13dc0 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
13dd0 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
13de0 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
13df0 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
13e00 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
13e10 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
13e20 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
13e30 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
13e40 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
13e50 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
13e60 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
13e70 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
13e80 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
13e90 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
13ea0 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
13eb0 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
13ec0 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
13ed0 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
13ee0 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
13ef0 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
13f00 75 65 72 79 28 0a 20 20 73 71 6c 69 74 65 33 20  uery(.  sqlite3 
13f10 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
13f20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
13f30 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
13f40 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
13f50 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
13f60 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
13f70 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
13f80 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
13f90 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
13fa0 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
13fb0 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
13fc0 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20  /.  int isAgg,  
13fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
13fe0 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
13ff0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
14000 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
14010 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nt subqueryIsAgg
14020 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
14030 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
14040 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
14050 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  ions */.){.  Sel
14060 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20  ect *pSub;      
14070 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75   /* The inner qu
14080 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79  ery or "subquery
14090 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  " */.  SrcList *
140a0 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
140b0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
140c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
140d0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
140e0 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
140f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
14100 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
14110 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
14120 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
14130 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
14140 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
14150 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
14160 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
14170 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
14180 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
14190 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
141a0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
141b0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
141c0 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
141d0 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
141e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
141f0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
14200 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
14210 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
14220 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
14230 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  uery */..  /* Ch
14240 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c  eck to see if fl
14250 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
14260 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30  itted.  Return 0
14270 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20   if not..  */.  
14280 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
14290 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
142a0 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
142b0 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d   pSrc && iFrom>=
142c0 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d  0 && iFrom<pSrc-
142d0 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69  >nSrc );.  pSubi
142e0 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
142f0 46 72 6f 6d 5d 3b 0a 20 20 70 53 75 62 20 3d 20  From];.  pSub = 
14300 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
14310 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  t;.  assert( pSu
14320 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  b!=0 );.  if( is
14330 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49  Agg && subqueryI
14340 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14360 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
14370 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75  (1)  */.  if( su
14380 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70  bqueryIsAgg && p
14390 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65  Src->nSrc>1 ) re
143a0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
143b0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
143c0 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72  (2)  */.  pSubSr
143d0 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
143e0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72    assert( pSubSr
143f0 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20  c );.  /* Prior 
14400 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32  to version 3.1.2
14410 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  , when LIMIT and
14420 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62   OFFSET had to b
14430 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e  e simple constan
14440 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62  ts,.  ** not arb
14450 69 74 72 61 72 79 20 65 78 70 72 65 73 73 73 69  itrary expresssi
14460 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20  ons, we allowed 
14470 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f  some combining o
14480 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  f LIMIT and OFFS
14490 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  ET.  ** because 
144a0 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f  they could be co
144b0 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c  mputed at compil
144c0 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65  e-time.  But whe
144d0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
144e0 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61  ET.  ** became a
144f0 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
14500 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f  ions, we were fo
14510 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74  rced to add rest
14520 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20  rictions (13).  
14530 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a  ** and (14). */.
14540 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
14550 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20  it && p->pLimit 
14560 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
14570 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
14580 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a  riction (13) */.
14590 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66    if( pSub->pOff
145a0 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  set ) return 0; 
145b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
145d0 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a  riction (14) */.
145e0 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d    if( p->pRightm
145f0 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  ost && pSub->pLi
14600 6d 69 74 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  mit && pSub->pOr
14610 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74  derBy ){.    ret
14620 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14650 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
14660 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
14670 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
14680 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146a0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
146b0 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
146c0 66 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73 74  f( (pSub->isDist
146d0 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 70 4c  inct || pSub->pL
146e0 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20 20  imit) .         
146f0 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
14700 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 20 20 20   || isAgg) ){   
14710 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
14720 63 74 69 6f 6e 73 20 28 34 29 28 35 29 28 38 29  ctions (4)(5)(8)
14730 28 39 29 20 2a 2f 0a 20 20 20 20 20 72 65 74 75  (9) */.     retu
14740 72 6e 20 30 3b 20 20 20 20 20 20 20 0a 20 20 7d  rn 0;       .  }
14750 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73 74  .  if( p->isDist
14760 69 6e 63 74 20 26 26 20 73 75 62 71 75 65 72 79  inct && subquery
14770 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
14780 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
14790 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f  triction (6)  */
147a0 0a 20 20 69 66 28 20 28 70 2d 3e 64 69 73 61 6c  .  if( (p->disal
147b0 6c 6f 77 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d  lowOrderBy || p-
147c0 3e 70 4f 72 64 65 72 42 79 29 20 26 26 20 70 53  >pOrderBy) && pS
147d0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
147e0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
147f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14810 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
14820 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a  riction (11) */.
14830 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69    }..  /* Restri
14840 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65  ction 3:  If the
14850 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
14860 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
14870 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a  he subquery is .
14880 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73    ** not used as
14890 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
148a0 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a  nd of an outer j
148b0 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f  oin.  Examples o
148c0 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20  f why this.  ** 
148d0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
148e0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
148f0 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
14900 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33  JOIN (t2 JOIN t3
14910 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
14920 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
14930 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
14940 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
14950 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
14960 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e  ER JOIN t2) JOIN
14970 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68   t3.  **.  ** wh
14980 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c  ich is not at al
14990 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  l the same thing
149a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
149b0 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20  bSrc->nSrc>1 && 
149c0 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74  (pSubitem->joint
149d0 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
149e0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
149f0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
14a00 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49  striction 12:  I
14a10 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
14a20 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
14a30 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
14a40 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d  ter.  ** join, m
14a50 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
14a60 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
14a70 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20  RE clause..  ** 
14a80 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77  An examples of w
14a90 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  hy this is not a
14aa0 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
14ab0 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
14ac0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45  T OUTER JOIN (SE
14ad0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57  LECT * FROM t2 W
14ae0 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a  HERE t2.x>0).  *
14af0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
14b00 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
14b10 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
14b20 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
14b30 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
14b40 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e  IN t2) WHERE t2.
14b50 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75  x>0.  **.  ** Bu
14b60 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73  t the t2.x>0 tes
14b70 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  t will always fa
14b80 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77  il on a NULL row
14b90 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20   of t2, which.  
14ba0 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63  ** effectively c
14bb0 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45  onverts the OUTE
14bc0 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49  R JOIN into an I
14bd0 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a  NNER JOIN..  */.
14be0 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d    if( (pSubitem-
14bf0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  >jointype & JT_O
14c00 55 54 45 52 29 21 3d 30 20 26 26 20 70 53 75 62  UTER)!=0 && pSub
14c10 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a 20  ->pWhere!=0 ){. 
14c20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
14c30 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
14c40 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
14c50 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69  t means flatteni
14c60 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 20  ng is permitted 
14c70 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46 72  for the.  ** iFr
14c80 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
14c90 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
14ca0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
14cb0 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f  y..  */..  /* Mo
14cc0 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52  ve all of the FR
14cd0 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  OM elements of t
14ce0 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
14cf0 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52   the.  ** the FR
14d00 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
14d10 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
14d20 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73  efore doing this
14d30 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  , remember.  ** 
14d40 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
14d50 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  r for the origin
14d60 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  al outer query F
14d70 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20  ROM element in. 
14d80 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68   ** iParent.  Th
14d90 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72  e iParent cursor
14da0 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
14db0 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74  sed.  Subsequent
14dc0 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   code.  ** will 
14dd0 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  scan expressions
14de0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61   looking for iPa
14df0 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
14e00 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  and replace.  **
14e10 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65   those reference
14e20 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f  s with expressio
14e30 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20  ns that resolve 
14e40 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
14e50 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e  FROM.  ** elemen
14e60 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f  ts we are now co
14e70 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20  pying in..  */. 
14e80 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69   iParent = pSubi
14e90 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
14ea0 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
14eb0 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  c = pSubSrc->nSr
14ec0 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74  c;.    int joint
14ed0 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ype = pSubitem->
14ee0 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20 20 73  jointype;..    s
14ef0 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
14f00 65 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  e(pSubitem->pTab
14f10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
14f20 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ree(pSubitem->zD
14f30 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
14f40 6c 69 74 65 33 5f 66 72 65 65 28 70 53 75 62 69  lite3_free(pSubi
14f50 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
14f60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
14f70 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
14f80 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  .    pSubitem->p
14f90 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  Tab = 0;.    pSu
14fa0 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
14fb0 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 69 74   = 0;.    pSubit
14fc0 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  em->zName = 0;. 
14fd0 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c     pSubitem->zAl
14fe0 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ias = 0;.    if(
14ff0 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20   nSubSrc>1 ){.  
15000 20 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d 20      int extra = 
15010 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20 20  nSubSrc - 1;.   
15020 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53     for(i=1; i<nS
15030 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
15040 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69       pSrc = sqli
15050 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
15060 28 64 62 2c 20 70 53 72 63 2c 20 30 2c 20 30 29  (db, pSrc, 0, 0)
15070 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
15080 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc==0 ){.       
15090 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a     p->pSrc = 0;.
150a0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
150b0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
150c0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
150d0 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
150e0 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
150f0 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69  rc-1; i-extra>=i
15100 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  From; i--){.    
15110 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d      pSrc->a[i] =
15120 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61   pSrc->a[i-extra
15130 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
15140 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
15150 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
15160 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69       pSrc->a[i+i
15170 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d  From] = pSubSrc-
15180 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  >a[i];.      mem
15190 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
151a0 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
151b0 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
151c0 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
151d0 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65  [iFrom].jointype
151e0 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d   = jointype;.  }
151f0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e  ..  /* Now begin
15200 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75   substituting su
15210 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65  bquery result se
15220 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  t expressions fo
15230 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  r .  ** referenc
15240 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
15250 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
15260 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a  uery..  ** .  **
15270 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
15280 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
15290 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
152a0 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
152b0 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
152c0 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a   WHERE a>b;.  **
152d0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
152e0 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
152f0 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
15300 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
15310 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20        /.  **    
15320 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
15330 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
15340 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
15350 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15360 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  _/.  **.  ** We 
15370 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
15380 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
15390 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
153a0 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
153b0 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65 20 73  ee.  ** "a" we s
153c0 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20  ubstitute "x*3" 
153d0 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
153e0 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75  we see "b" we su
153f0 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e  bstitute "y+10".
15400 0a 20 20 2a 2f 0a 20 20 70 4c 69 73 74 20 3d 20  .  */.  pList = 
15410 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72  p->pEList;.  for
15420 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
15430 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
15440 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20  Expr *pExpr;.   
15450 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
15460 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45  .zName==0 && (pE
15470 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
15480 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a  ].pExpr)->span.z
15490 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69  !=0 ){.      pLi
154a0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
154b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73   .             s
154c0 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
154d0 64 62 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72  db, (char*)pExpr
154e0 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d  ->span.z, pExpr-
154f0 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a  >span.n);.    }.
15500 20 20 7d 0a 20 20 73 75 62 73 74 45 78 70 72 4c    }.  substExprL
15510 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ist(db, p->pELis
15520 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  t, iParent, pSub
15530 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 69 66 28  ->pEList);.  if(
15540 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75   isAgg ){.    su
15550 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
15560 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61  p->pGroupBy, iPa
15570 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
15580 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
15590 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  pr(db, p->pHavin
155a0 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
155b0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  ->pEList);.  }. 
155c0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
155d0 72 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  rBy ){.    asser
155e0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
155f0 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  0 );.    p->pOrd
15600 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
15610 64 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d  derBy;.    pSub-
15620 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
15630 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f   }else if( p->pO
15640 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 75  rderBy ){.    su
15650 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
15660 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61  p->pOrderBy, iPa
15670 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
15680 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  st);.  }.  if( p
15690 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  Sub->pWhere ){. 
156a0 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69     pWhere = sqli
156b0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
156c0 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  Sub->pWhere);.  
156d0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65 72  }else{.    pWher
156e0 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
156f0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
15700 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
15710 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20  >pHaving==0 );. 
15720 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
15730 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70  p->pWhere;.    p
15740 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
15750 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e;.    substExpr
15760 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
15770 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
15780 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
15790 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
157a0 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 2d 3e  3ExprAnd(db, p->
157b0 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20  pHaving, .      
157c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
157e0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75  3ExprDup(db, pSu
157f0 62 2d 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20 20  b->pHaving));.  
15800 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
15810 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
15820 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
15830 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
15840 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75  (db, pSub->pGrou
15850 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pBy);.  }else{. 
15860 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
15870 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72   p->pWhere, iPar
15880 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
15890 74 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72  t);.    p->pWher
158a0 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
158b0 6e 64 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  nd(db, p->pWhere
158c0 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 7d 0a 0a  , pWhere);.  }..
158d0 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e    /* The flatten
158e0 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74  ed query is dist
158f0 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74  inct if either t
15900 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a  he inner or the.
15910 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
15920 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
15930 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74 69   */.  p->isDisti
15940 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
15950 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44  nct || pSub->isD
15960 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 0a 20  istinct;..  /*. 
15970 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46   ** SELECT ... F
15980 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
15990 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62  LIMIT a OFFSET b
159a0 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54  ) LIMIT x OFFSET
159b0 20 79 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e   y;.  **.  ** On
159c0 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20  e is tempted to 
159d0 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64  try to add a and
159e0 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68   b to combine th
159f0 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74  e limits.  But t
15a00 68 69 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  his.  ** does no
15a10 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72  t work if either
15a20 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69   limit is negati
15a30 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ve..  */.  if( p
15a40 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
15a50 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
15a60 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
15a70 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSub->pLimit = 
15a80 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e  0;.  }..  /* Fin
15a90 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68  ially, delete wh
15aa0 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68  at is left of th
15ab0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72  e subquery and r
15ac0 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65  eturn.  ** succe
15ad0 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
15ae0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
15af0 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  Sub);.  return 1
15b00 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
15b10 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
15b20 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  /../*.** Analyze
15b30 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
15b40 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
15b50 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  an argument to s
15b60 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61  ee if it.** is a
15b70 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
15b80 71 75 65 72 79 2e 20 52 65 74 75 72 6e 20 4f 52  query. Return OR
15b90 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 4f 52 44  DERBY_MIN or ORD
15ba0 45 52 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20  ERBY_MAX if .** 
15bb0 69 74 20 69 73 2c 20 6f 72 20 30 20 6f 74 68 65  it is, or 0 othe
15bc0 72 77 69 73 65 2e 20 41 74 20 70 72 65 73 65 6e  rwise. At presen
15bd0 74 2c 20 61 20 71 75 65 72 79 20 69 73 20 63 6f  t, a query is co
15be0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 0a 2a  nsidered to be.*
15bf0 2a 20 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20  * a min()/max() 
15c00 71 75 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  query if:.**.** 
15c10 20 20 31 2e 20 54 68 65 72 65 20 69 73 20 61 20    1. There is a 
15c20 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e  single object in
15c30 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
15c40 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65  ..**.**   2. The
15c50 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 65  re is a single e
15c60 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
15c70 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64   result set, and
15c80 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 65   it is.**      e
15c90 69 74 68 65 72 20 6d 69 6e 28 78 29 20 6f 72 20  ither min(x) or 
15ca0 6d 61 78 28 78 29 2c 20 77 68 65 72 65 20 78 20  max(x), where x 
15cb0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65  is a column refe
15cc0 72 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rence..*/.static
15cd0 20 69 6e 74 20 6d 69 6e 4d 61 78 51 75 65 72 79   int minMaxQuery
15ce0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15cf0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 45 78  Select *p){.  Ex
15d00 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70  pr *pExpr;.  Exp
15d10 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
15d20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66  p->pEList;..  if
15d30 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
15d40 3d 31 20 29 20 72 65 74 75 72 6e 20 4f 52 44 45  =1 ) return ORDE
15d50 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45  RBY_NORMAL;.  pE
15d60 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  xpr = pEList->a[
15d70 30 5d 2e 70 45 78 70 72 3b 0a 20 20 70 45 4c 69  0].pExpr;.  pELi
15d80 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
15d90 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  t;.  if( pExpr->
15da0 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
15db0 49 4f 4e 20 7c 7c 20 70 45 4c 69 73 74 3d 3d 30  ION || pEList==0
15dc0 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   || pEList->nExp
15dd0 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
15de0 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61  .  if( pEList->a
15df0 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54  [0].pExpr->op!=T
15e00 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 20 72  K_AGG_COLUMN ) r
15e10 65 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4e 4f  eturn ORDERBY_NO
15e20 52 4d 41 4c 3b 0a 20 20 69 66 28 20 70 45 78 70  RMAL;.  if( pExp
15e30 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20  r->token.n!=3 ) 
15e40 72 65 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4e  return ORDERBY_N
15e50 4f 52 4d 41 4c 3b 0a 20 20 69 66 28 20 73 71 6c  ORMAL;.  if( sql
15e60 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
15e70 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
15e80 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29  .z,"min",3)==0 )
15e90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4f 52 44  {.    return ORD
15ea0 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73  ERBY_MIN;.  }els
15eb0 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
15ec0 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78  NICmp((char*)pEx
15ed0 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78  pr->token.z,"max
15ee0 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ",3)==0 ){.    r
15ef0 65 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4d 41  eturn ORDERBY_MA
15f00 58 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  X;.  }.  return 
15f10 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
15f20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
15f30 75 74 69 6e 65 20 72 65 73 6f 6c 76 65 73 20 61  utine resolves a
15f40 6e 79 20 6e 61 6d 65 73 20 75 73 65 64 20 69 6e  ny names used in
15f50 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
15f60 6f 66 20 74 68 65 0a 2a 2a 20 73 75 70 70 6c 69  of the.** suppli
15f70 65 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ed SELECT statem
15f80 65 6e 74 2e 20 49 66 20 74 68 65 20 53 45 4c 45  ent. If the SELE
15f90 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
15fa0 6e 67 20 72 65 73 6f 6c 76 65 64 0a 2a 2a 20 69  ng resolved.** i
15fb0 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2c 20  s a sub-select, 
15fc0 74 68 65 6e 20 70 4f 75 74 65 72 4e 43 20 69 73  then pOuterNC is
15fd0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
15fe0 65 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 0a 2a  e NameContext .*
15ff0 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  * of the parent 
16000 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69 6e 74 20 73  SELECT..*/.int s
16010 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f  qlite3SelectReso
16020 6c 76 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  lve(.  Parse *pP
16030 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
16040 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
16050 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
16060 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
16070 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
16080 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
16090 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  ded. */.  NameCo
160a0 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20  ntext *pOuterNC 
160b0 20 2f 2a 20 54 68 65 20 6f 75 74 65 72 20 6e 61   /* The outer na
160c0 6d 65 20 63 6f 6e 74 65 78 74 2e 20 4d 61 79 20  me context. May 
160d0 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20  be NULL. */.){. 
160e0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
160f0 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  t;          /* R
16100 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20  esult set. */.  
16110 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
16120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
16130 72 2d 6c 6f 6f 70 20 76 61 72 69 61 62 6c 65 20  r-loop variable 
16140 75 73 65 64 20 69 6e 20 6d 75 6c 74 69 70 6c 65  used in multiple
16150 20 70 6c 61 63 65 73 20 2a 2f 0a 20 20 4e 61 6d   places */.  Nam
16160 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
16170 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
16180 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 2a 2f   name-context */
16190 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
161a0 6f 75 70 42 79 3b 20 20 20 20 20 20 20 20 2f 2a  oupBy;        /*
161b0 20 54 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c   The group by cl
161c0 61 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  ause */..  /* If
161d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   this routine ha
161e0 73 20 72 75 6e 20 62 65 66 6f 72 65 2c 20 72 65  s run before, re
161f0 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
16200 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73  . */.  if( p->is
16210 52 65 73 6f 6c 76 65 64 20 29 7b 0a 20 20 20 20  Resolved ){.    
16220 61 73 73 65 72 74 28 20 21 70 4f 75 74 65 72 4e  assert( !pOuterN
16230 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C );.    return 
16240 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
16250 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 3d   p->isResolved =
16260 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   1;..  /* If the
16270 72 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  re have already 
16280 62 65 65 6e 20 65 72 72 6f 72 73 2c 20 64 6f 20  been errors, do 
16290 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69 66  nothing. */.  if
162a0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  ( pParse->nErr>0
162b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
162c0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
162d0 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74  ..  /* Prepare t
162e0 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
162f0 65 6e 74 2e 20 54 68 69 73 20 63 61 6c 6c 20 77  ent. This call w
16300 69 6c 6c 20 61 6c 6c 6f 63 61 74 65 20 61 6c 6c  ill allocate all
16310 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 72 65   cursors.  ** re
16320 71 75 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65  quired to handle
16330 20 74 68 65 20 74 61 62 6c 65 73 20 61 6e 64 20   the tables and 
16340 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 74 68  subqueries in th
16350 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20  e FROM clause.. 
16360 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 70 53 65   */.  if( prepSe
16370 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c  lectStmt(pParse,
16380 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   p) ){.    retur
16390 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
163a0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76    }..  /* Resolv
163b0 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
163c0 73 20 69 6e 20 74 68 65 20 4c 49 4d 49 54 20 61  s in the LIMIT a
163d0 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  nd OFFSET clause
163e0 73 2e 20 54 68 65 73 65 0a 20 20 2a 2a 20 61 72  s. These.  ** ar
163f0 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  e not allowed to
16400 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 61   refer to any na
16410 6d 65 73 2c 20 73 6f 20 70 61 73 73 20 61 6e 20  mes, so pass an 
16420 65 6d 70 74 79 20 4e 61 6d 65 43 6f 6e 74 65 78  empty NameContex
16430 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  t..  */.  memset
16440 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
16450 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 50  (sNC));.  sNC.pP
16460 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
16470 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
16480 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
16490 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c  C, p->pLimit) ||
164a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
164b0 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
164c0 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29  sNC, p->pOffset)
164d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
164e0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
164f0 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68  ..  /* Set up th
16500 65 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e  e local name-con
16510 74 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20  text to pass to 
16520 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
16530 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65 73 6f 6c  () to.  ** resol
16540 76 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ve the expressio
16550 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 73  n-list..  */.  s
16560 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b  NC.allowAgg = 1;
16570 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
16580 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 73 4e 43  = p->pSrc;.  sNC
16590 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74 65 72 4e  .pNext = pOuterN
165a0 43 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  C;..  /* Resolve
165b0 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65   names in the re
165c0 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 70  sult set. */.  p
165d0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
165e0 74 3b 0a 20 20 69 66 28 20 21 70 45 4c 69 73 74  t;.  if( !pEList
165f0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
16600 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 69 3d  _ERROR;.  for(i=
16610 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
16620 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
16630 70 72 20 2a 70 58 20 3d 20 70 45 4c 69 73 74 2d  pr *pX = pEList-
16640 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
16650 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
16660 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
16670 43 2c 20 70 58 29 20 29 7b 0a 20 20 20 20 20 20  C, pX) ){.      
16680 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
16690 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ROR;.    }.  }..
166a0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
166b0 65 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66  e no aggregate f
166c0 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20  unctions in the 
166d0 72 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64 20  result-set, and 
166e0 6e 6f 20 47 52 4f 55 50 20 42 59 20 0a 20 20 2a  no GROUP BY .  *
166f0 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f  * expression, do
16700 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72 65   not allow aggre
16710 67 61 74 65 73 20 69 6e 20 61 6e 79 20 6f 66 20  gates in any of 
16720 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
16730 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73  sions..  */.  as
16740 73 65 72 74 28 20 21 70 2d 3e 69 73 41 67 67 20  sert( !p->isAgg 
16750 29 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20  );.  pGroupBy = 
16760 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 69  p->pGroupBy;.  i
16770 66 28 20 70 47 72 6f 75 70 42 79 20 7c 7c 20 73  f( pGroupBy || s
16780 4e 43 2e 68 61 73 41 67 67 20 29 7b 0a 20 20 20  NC.hasAgg ){.   
16790 20 70 2d 3e 69 73 41 67 67 20 3d 20 31 3b 0a 20   p->isAgg = 1;. 
167a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 4e 43 2e   }else{.    sNC.
167b0 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20  allowAgg = 0;.  
167c0 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 48 41 56  }..  /* If a HAV
167d0 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70 72  ING clause is pr
167e0 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 72  esent, then ther
167f0 65 20 6d 75 73 74 20 62 65 20 61 20 47 52 4f 55  e must be a GROU
16800 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a  P BY clause..  *
16810 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69  /.  if( p->pHavi
16820 6e 67 20 26 26 20 21 70 47 72 6f 75 70 42 79 20  ng && !pGroupBy 
16830 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
16840 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
16850 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
16860 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
16870 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20  fore HAVING");. 
16880 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16890 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
168a0 2a 20 41 64 64 20 74 68 65 20 65 78 70 72 65 73  * Add the expres
168b0 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 74 68 65  sion list to the
168c0 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62 65   name-context be
168d0 66 6f 72 65 20 70 61 72 73 69 6e 67 20 74 68 65  fore parsing the
168e0 0a 20 20 2a 2a 20 6f 74 68 65 72 20 65 78 70 72  .  ** other expr
168f0 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 53  essions in the S
16900 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
16910 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74   This is so that
16920 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
16930 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
16940 6c 61 75 73 65 20 28 65 74 63 2e 29 20 63 61 6e  lause (etc.) can
16950 20 72 65 66 65 72 20 74 6f 20 65 78 70 72 65 73   refer to expres
16960 73 69 6f 6e 73 20 62 79 0a 20 20 2a 2a 20 61 6c  sions by.  ** al
16970 69 61 73 65 73 20 69 6e 20 74 68 65 20 72 65 73  iases in the res
16980 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20  ult set..  **.  
16990 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20  ** Minor point: 
169a0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
169b0 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ase, then the ex
169c0 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65  pression will be
169d0 0a 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74  .  ** re-evaluat
169e0 65 64 20 66 6f 72 20 65 61 63 68 20 72 65 66 65  ed for each refe
169f0 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20 2a  rence to it..  *
16a00 2f 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d  /.  sNC.pEList =
16a10 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
16a20 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
16a30 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20  olveNames(&sNC, 
16a40 70 2d 3e 70 57 68 65 72 65 29 20 7c 7c 0a 20 20  p->pWhere) ||.  
16a50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 52 65     sqlite3ExprRe
16a60 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
16a70 20 70 2d 3e 70 48 61 76 69 6e 67 29 20 29 7b 0a   p->pHaving) ){.
16a80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16a90 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
16aa0 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  f( p->pPrior==0 
16ab0 29 7b 0a 20 20 20 20 69 66 28 20 70 72 6f 63 65  ){.    if( proce
16ac0 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  ssOrderGroupBy(p
16ad0 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
16ae0 64 65 72 42 79 2c 20 31 2c 20 26 73 4e 43 2e 68  derBy, 1, &sNC.h
16af0 61 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20  asAgg) ){.      
16b00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
16b10 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ROR;.    }.  }. 
16b20 20 69 66 28 20 70 72 6f 63 65 73 73 4f 72 64 65   if( processOrde
16b30 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
16b40 20 70 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c   p, pGroupBy, 0,
16b50 20 26 73 4e 43 2e 68 61 73 41 67 67 29 20 29 7b   &sNC.hasAgg) ){
16b60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16b70 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
16b80 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
16b90 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
16ba0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16bb0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
16bc0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
16bd0 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
16be0 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  e does not conta
16bf0 69 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  in aggregate fun
16c00 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
16c10 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
16c20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
16c30 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
16c40 20 20 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20    .    for(i=0, 
16c50 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e  pItem=pGroupBy->
16c60 61 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  a; i<pGroupBy->n
16c70 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
16c80 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 45  ++){.      if( E
16c90 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16ca0 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Item->pExpr, EP_
16cb0 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Agg) ){.        
16cc0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16cd0 70 50 61 72 73 65 2c 20 22 61 67 67 72 65 67 61  pParse, "aggrega
16ce0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  te functions are
16cf0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20   not allowed in 
16d00 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 74  ".            "t
16d10 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
16d20 73 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  se");.        re
16d30 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
16d40 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
16d50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
16d60 69 73 20 69 73 20 6f 6e 65 20 53 45 4c 45 43 54  is is one SELECT
16d70 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2c 20   of a compound, 
16d80 62 65 20 73 75 72 65 20 74 6f 20 72 65 73 6f 6c  be sure to resol
16d90 76 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 69 6e  ve names.  ** in
16da0 20 74 68 65 20 6f 74 68 65 72 20 53 45 4c 45 43   the other SELEC
16db0 54 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  Ts..  */.  if( p
16dc0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
16dd0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 65  return sqlite3Se
16de0 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72  lectResolve(pPar
16df0 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 70  se, p->pPrior, p
16e00 4f 75 74 65 72 4e 43 29 3b 0a 20 20 7d 65 6c 73  OuterNC);.  }els
16e10 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
16e20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
16e30 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
16e40 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
16e50 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lator..**.** The
16e60 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
16e70 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20  ulator is a set 
16e80 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  of memory cells 
16e90 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74  that hold.** int
16ea0 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
16eb0 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74  s while calculat
16ec0 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65  ing an aggregate
16ed0 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
16ee0 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73  ne simply stores
16ef0 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66   NULLs in all of
16f00 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65   those memory ce
16f10 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lls..*/.static v
16f20 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c  oid resetAccumul
16f30 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
16f40 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
16f50 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
16f60 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
16f70 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
16f80 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
16f90 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20  c *pFunc;.  if( 
16fa0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b  pAggInfo->nFunc+
16fb0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
16fc0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  n==0 ){.    retu
16fd0 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  rn;.  }.  for(i=
16fe0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
16ff0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
17000 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17010 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
17020 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  0, pAggInfo->aCo
17030 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a  l[i].iMem);.  }.
17040 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67    for(pFunc=pAgg
17050 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30  Info->aFunc, i=0
17060 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
17070 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b  unc; i++, pFunc+
17080 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
17090 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
170a0 4e 75 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d 3e  Null, 0, pFunc->
170b0 69 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  iMem);.    if( p
170c0 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e  Func->iDistinct>
170d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
170e0 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45   *pE = pFunc->pE
170f0 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
17100 45 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  E->pList==0 || p
17110 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  E->pList->nExpr!
17120 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
17130 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
17140 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
17150 69 6e 20 61 67 67 72 65 67 61 74 65 20 6d 75 73  in aggregate mus
17160 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 22 0a  t be followed ".
17170 20 20 20 20 20 20 20 20 20 20 20 22 62 79 20 61             "by a
17180 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a  n expression");.
17190 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69          pFunc->i
171a0 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
171b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
171c0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
171d0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
171e0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
171f0 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a  se, pE->pList);.
17200 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17210 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
17220 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
17230 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c  Func->iDistinct,
17240 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
17250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17260 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
17270 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
17280 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20  DOFF);.      }. 
17290 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
172a0 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f  * Invoke the OP_
172b0 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f  AggFinalize opco
172c0 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67  de for every agg
172d0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a  regate function.
172e0 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66  ** in the AggInf
172f0 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  o structure..*/.
17300 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61  static void fina
17310 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
17320 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
17330 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
17340 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
17350 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
17360 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
17370 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
17380 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  F;.  for(i=0, pF
17390 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
173a0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
173b0 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
173c0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
173d0 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
173e0 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c  ->pList;.    sql
173f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17400 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70  , OP_AggFinal, p
17410 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f  F->iMem, pList ?
17420 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
17430 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
17440 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
17450 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  d*)pF->pFunc, P4
17460 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d  _FUNCDEF);.  }.}
17470 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
17480 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d  he accumulator m
17490 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
174a0 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73  an aggregate bas
174b0 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72  ed on.** the cur
174c0 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
174d0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
174e0 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d  void updateAccum
174f0 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
17500 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
17510 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
17520 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
17530 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
17540 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
17550 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63  unc *pF;.  struc
17560 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
17570 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e  C;..  pAggInfo->
17580 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
17590 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
175a0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
175b0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
175c0 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
175d0 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
175e0 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30  int addrNext = 0
175f0 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67  ;.    int regAgg
17600 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
17610 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
17620 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 66  r->pList;.    if
17630 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
17640 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e   nArg = pList->n
17650 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41  Expr;.      regA
17660 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  gg = sqlite3GetT
17670 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
17680 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71   nArg);.      sq
17690 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
176a0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
176b0 69 73 74 2c 20 72 65 67 41 67 67 29 3b 0a 20 20  ist, regAgg);.  
176c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
176d0 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Arg = 0;.      r
176e0 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d  egAgg = 0;.    }
176f0 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69  .    if( pF->iDi
17700 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
17710 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71     addrNext = sq
17720 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
17730 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73  el(v);.      ass
17740 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a  ert( nArg==1 );.
17750 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
17760 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69  ct(pParse, pF->i
17770 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65  Distinct, addrNe
17780 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a  xt, 1, regAgg);.
17790 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
177a0 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c  ->pFunc->needCol
177b0 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 43 6f  lSeq ){.      Co
177c0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
177d0 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
177e0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
177f0 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  tem;.      int j
17800 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17810 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20  pList!=0 );  /* 
17820 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e  pList!=0 if pF->
17830 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53  pFunc->needCollS
17840 65 71 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20  eq is true */.  
17850 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
17860 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43  em=pList->a; !pC
17870 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a  oll && j<nArg; j
17880 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
17890 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
178a0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
178b0 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
178c0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
178d0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
178e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
178f0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
17900 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
17910 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
17920 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
17930 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20  _CollSeq, 0, 0, 
17940 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
17950 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
17960 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
17970 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
17980 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67  _AggStep, 0, reg
17990 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20  Agg, pF->iMem,. 
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179b0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
179c0 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
179d0 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
179e0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 6e  dbeChangeP5(v, n
179f0 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
17a00 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
17a10 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
17a20 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28  , nArg);.    if(
17a30 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20   addrNext ){.   
17a40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
17a50 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
17a60 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20  drNext);.    }. 
17a70 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43   }.  for(i=0, pC
17a80 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b  =pAggInfo->aCol;
17a90 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63   i<pAggInfo->nAc
17aa0 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20  cumulator; i++, 
17ab0 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  pC++){.    sqlit
17ac0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
17ad0 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43  e, pC->pExpr, pC
17ae0 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70  ->iMem);.  }.  p
17af0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
17b00 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 6e  ode = 0;.}..#ifn
17b10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17b20 54 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a 20 54 68  TRIGGER./*.** Th
17b30 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
17b40 73 65 64 20 77 68 65 6e 20 61 20 53 45 4c 45 43  sed when a SELEC
17b50 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75  T statement is u
17b60 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a  sed to create a.
17b70 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
17b80 6c 65 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67  le for iterating
17b90 20 74 68 72 6f 75 67 68 20 77 68 65 6e 20 72 75   through when ru
17ba0 6e 6e 69 6e 67 20 61 6e 20 49 4e 53 54 45 41 44  nning an INSTEAD
17bb0 20 4f 46 0a 2a 2a 20 55 50 44 41 54 45 20 6f 72   OF.** UPDATE or
17bc0 20 49 4e 53 54 45 41 44 20 4f 46 20 44 45 4c 45   INSTEAD OF DELE
17bd0 54 45 20 74 72 69 67 67 65 72 2e 20 0a 2a 2a 0a  TE trigger. .**.
17be0 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  ** If possible, 
17bf0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
17c00 6d 65 6e 74 20 69 73 20 6d 6f 64 69 66 69 65 64  ment is modified
17c10 20 73 6f 20 74 68 61 74 20 4e 55 4c 4c 20 76 61   so that NULL va
17c20 6c 75 65 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  lues.** are stor
17c30 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ed in the tempor
17c40 61 72 79 20 74 61 62 6c 65 20 66 6f 72 20 61 6c  ary table for al
17c50 6c 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68  l columns for wh
17c60 69 63 68 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72  ich the .** corr
17c70 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
17c80 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69   argument mask i
17c90 73 20 6e 6f 74 20 73 65 74 2e 20 49 66 20 6d 61  s not set. If ma
17ca0 73 6b 20 74 61 6b 65 73 20 74 68 65 0a 2a 2a 20  sk takes the.** 
17cb0 73 70 65 63 69 61 6c 20 76 61 6c 75 65 20 30 78  special value 0x
17cc0 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 61  ffffffff, then a
17cd0 6c 6c 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70  ll columns are p
17ce0 6f 70 75 6c 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  opulated..*/.voi
17cf0 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4d  d sqlite3SelectM
17d00 61 73 6b 28 50 61 72 73 65 20 2a 70 50 61 72 73  ask(Parse *pPars
17d10 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 75 33  e, Select *p, u3
17d20 32 20 6d 61 73 6b 29 7b 0a 20 20 69 66 28 20 70  2 mask){.  if( p
17d30 20 26 26 20 21 70 2d 3e 70 50 72 69 6f 72 20 26   && !p->pPrior &
17d40 26 20 21 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  & !p->isDistinct
17d50 20 26 26 20 6d 61 73 6b 21 3d 30 78 66 66 66 66   && mask!=0xffff
17d60 66 66 66 66 20 29 7b 0a 20 20 20 20 45 78 70 72  ffff ){.    Expr
17d70 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
17d80 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c    int i;.    sql
17d90 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
17da0 65 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b  e(pParse, p, 0);
17db0 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  .    pEList = p-
17dc0 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72  >pEList;.    for
17dd0 28 69 3d 30 3b 20 70 45 4c 69 73 74 20 26 26 20  (i=0; pEList && 
17de0 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  i<pEList->nExpr 
17df0 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20  && i<32; i++){. 
17e00 20 20 20 20 20 69 66 28 20 21 28 6d 61 73 6b 26       if( !(mask&
17e10 28 28 75 33 32 29 31 3c 3c 69 29 29 20 29 7b 0a  ((u32)1<<i)) ){.
17e20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17e30 78 70 72 44 65 6c 65 74 65 28 70 45 4c 69 73 74  xprDelete(pEList
17e40 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
17e50 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61         pEList->a
17e60 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69  [i].pExpr = sqli
17e70 74 65 33 45 78 70 72 28 70 50 61 72 73 65 2d 3e  te3Expr(pParse->
17e80 64 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20  db, TK_NULL, 0, 
17e90 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
17ea0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
17eb0 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
17ec0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 67  e code for the g
17ed0 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74  iven SELECT stat
17ee0 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
17ef0 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
17f00 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69  tributed in vari
17f10 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69  ous ways dependi
17f20 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e  ng on the.** con
17f30 74 65 6e 74 73 20 6f 66 20 74 68 65 20 53 65 6c  tents of the Sel
17f40 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
17f50 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
17f60 61 72 67 75 6d 65 6e 74 20 70 44 65 73 74 0a 2a  argument pDest.*
17f70 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  * as follows:.**
17f80 0a 2a 2a 20 20 20 20 20 70 44 65 73 74 2d 3e 65  .**     pDest->e
17f90 44 65 73 74 20 20 20 20 52 65 73 75 6c 74 0a 2a  Dest    Result.*
17fa0 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *     ----------
17fb0 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
17fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17fe0 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 61 6c  -.**     SRT_Cal
17ff0 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20  lback    Invoke 
18000 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  the callback for
18010 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65   each row of the
18020 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20   result..**.**  
18030 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20     SRT_Mem      
18040 20 20 20 53 74 6f 72 65 20 66 69 72 73 74 20 72     Store first r
18050 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20  esult in memory 
18060 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61 72  cell pDest->iPar
18070 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
18080 53 65 74 20 20 20 20 20 20 20 20 20 53 74 6f 72  Set         Stor
18090 65 20 6e 6f 6e 2d 6e 75 6c 6c 20 72 65 73 75 6c  e non-null resul
180a0 74 73 20 61 73 20 6b 65 79 73 20 6f 66 20 74 61  ts as keys of ta
180b0 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
180c0 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  . .**           
180d0 20 20 20 20 20 20 20 20 20 20 41 70 70 6c 79 20            Apply 
180e0 74 68 65 20 61 66 66 69 6e 69 74 79 20 70 44 65  the affinity pDe
180f0 73 74 2d 3e 61 66 66 69 6e 69 74 79 20 62 65 66  st->affinity bef
18100 6f 72 65 20 73 74 6f 72 69 6e 67 20 74 68 65 6d  ore storing them
18110 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
18120 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72  Union       Stor
18130 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b  e results as a k
18140 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ey in a temporar
18150 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
18160 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
18170 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20  SRT_Except      
18180 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66  Remove results f
18190 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rom the temporar
181a0 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
181b0 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
181c0 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20  SRT_Table       
181d0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e  Store results in
181e0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
181f0 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 0a 2a 2a   pDest->iParm.**
18200 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 70 68 65  .**     SRT_Ephe
18210 6d 54 61 62 20 20 20 20 43 72 65 61 74 65 20 61  mTab    Create a
18220 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
18230 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 61  e pDest->iParm a
18240 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20  nd store.**     
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18260 74 68 65 20 72 65 73 75 6c 74 20 74 68 65 72 65  the result there
18270 2e 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20  . The cursor is 
18280 6c 65 66 74 20 6f 70 65 6e 20 61 66 74 65 72 0a  left open after.
18290 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
182a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 69 6e 67         returning
182b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
182c0 53 75 62 72 6f 75 74 69 6e 65 20 20 46 6f 72 20  Subroutine  For 
182d0 65 61 63 68 20 72 6f 77 20 72 65 74 75 72 6e 65  each row returne
182e0 64 2c 20 70 75 73 68 20 74 68 65 20 72 65 73 75  d, push the resu
182f0 6c 74 73 20 6f 6e 74 6f 20 74 68 65 0a 2a 2a 20  lts onto the.** 
18300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18310 20 20 20 20 76 64 62 65 20 73 74 61 63 6b 20 61      vdbe stack a
18320 6e 64 20 63 61 6c 6c 20 74 68 65 20 73 75 62 72  nd call the subr
18330 6f 75 74 69 6e 65 20 28 76 69 61 20 4f 50 5f 47  outine (via OP_G
18340 6f 73 75 62 29 0a 2a 2a 20 20 20 20 20 20 20 20  osub).**        
18350 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74 20               at 
18360 61 64 64 72 65 73 73 20 70 44 65 73 74 2d 3e 69  address pDest->i
18370 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
18380 53 52 54 5f 45 78 69 73 74 73 20 20 20 20 20 20  SRT_Exists      
18390 53 74 6f 72 65 20 61 20 31 20 69 6e 20 6d 65 6d  Store a 1 in mem
183a0 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e  ory cell pDest->
183b0 69 50 61 72 6d 20 69 66 20 74 68 65 20 72 65 73  iParm if the res
183c0 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
183d0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69             set i
183e0 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a  s not empty..**.
183f0 2a 2a 20 20 20 20 20 53 52 54 5f 44 69 73 63 61  **     SRT_Disca
18400 72 64 20 20 20 20 20 54 68 72 6f 77 20 74 68 65  rd     Throw the
18410 20 72 65 73 75 6c 74 73 20 61 77 61 79 2e 0a 2a   results away..*
18420 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65 6c  *.** See the sel
18430 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66  ectInnerLoop() f
18440 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 20 63 61  unction for a ca
18450 6e 6f 6e 69 63 61 6c 20 6c 69 73 74 69 6e 67 20  nonical listing 
18460 6f 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 77  of the .** allow
18470 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65  ed values of eDe
18480 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61  st and their mea
18490 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  nings..**.** Thi
184a0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
184b0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
184c0 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
184d0 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
184e0 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
184f0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
18500 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
18510 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
18520 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
18530 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
18540 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
18550 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
18560 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
18570 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
18580 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
18590 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  o that..**.** Th
185a0 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e  e pParent, paren
185b0 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65  tTab, and *pPare
185c0 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61 72 65  ntAgg fields are
185d0 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68   filled in if th
185e0 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20  is.** SELECT is 
185f0 61 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69  a subquery.  Thi
18600 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72  s routine may tr
18610 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69  y to combine thi
18620 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68  s SELECT.** with
18630 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66   its parent to f
18640 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  orm a single fla
18650 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20  t query.  In so 
18660 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a  doing, it might.
18670 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ** change the pa
18680 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20  rent query from 
18690 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  a non-aggregate 
186a0 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  to an aggregate 
186b0 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68  query..** For th
186c0 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70  at reason, the p
186d0 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69  ParentAgg flag i
186e0 73 20 70 61 73 73 65 64 20 61 73 20 61 20 70 6f  s passed as a po
186f0 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20  inter, so it.** 
18700 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  can be changed..
18710 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a  **.** Example 1:
18720 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f     The meaning o
18730 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 61  f the pParent pa
18740 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  rameter..**.**  
18750 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
18760 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20  t1 JOIN (SELECT 
18770 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  x, count(*) FROM
18780 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a   t2) JOIN t3;.**
18790 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20      \           
187a0 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
187b0 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
187c0 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a  ____/        /.*
187d0 2a 20 20 20 20 20 5c 20 20 20 20 20 20 20 20 20  *     \         
187e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a               /.*
18810 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  *      \________
18820 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
18830 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
18840 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
18850 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18860 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74   is called for t
18870 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 66  he outer query f
18880 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74  irst.   For that
18890 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e   call,.** pParen
188a0 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20  t will be NULL. 
188b0 20 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63   During the proc
188c0 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75  essing of the ou
188d0 74 65 72 20 71 75 65 72 79 2c 20 74 68 69 73 20  ter query, this 
188e0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
188f0 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
18900 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  y to handle the 
18910 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74  subquery.  For t
18920 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20  he recursive.** 
18930 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69  call, pParent wi
18940 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ll point to the 
18950 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
18960 63 61 75 73 65 20 74 68 65 20 73 75 62 71 75 65  cause the subque
18970 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63  ry is.** the sec
18980 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61  ond element in a
18990 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c   three-way join,
189a0 20 74 68 65 20 70 61 72 65 6e 74 54 61 62 20 70   the parentTab p
189b0 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a  arameter will.**
189c0 20 62 65 20 31 20 28 74 68 65 20 32 6e 64 20 76   be 1 (the 2nd v
189d0 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65  alue of a 0-inde
189e0 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69  xed array.).*/.i
189f0 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
18a00 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
18a10 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
18a20 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
18a30 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
18a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18a50 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
18a60 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
18a70 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
18a80 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 2f 2a  t *pDest,     /*
18a90 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
18aa0 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
18ab0 74 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ts */.  Select *
18ac0 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 2f  pParent,       /
18ad0 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
18ae0 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
18af0 69 73 20 61 20 73 75 62 2d 71 75 65 72 79 20 2a  is a sub-query *
18b00 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54 61  /.  int parentTa
18b10 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  b,         /* In
18b20 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  dex in pParent->
18b30 70 53 72 63 20 6f 66 20 74 68 69 73 20 71 75 65  pSrc of this que
18b40 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61  ry */.  int *pPa
18b50 72 65 6e 74 41 67 67 2c 20 20 20 20 20 20 20 2f  rentAgg,       /
18b60 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e  * True if pParen
18b70 74 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  t uses aggregate
18b80 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
18b90 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20  char *aff       
18ba0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65         /* If eDe
18bb0 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c  st is SRT_Union,
18bc0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
18bd0 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ring */.){.  int
18be0 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
18bf0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
18c00 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49  ters */.  WhereI
18c10 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
18c20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20   /* Return from 
18c30 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
18c40 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  n() */.  Vdbe *v
18c50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18c60 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d  /* The virtual m
18c70 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e  achine under con
18c80 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
18c90 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20  nt isAgg;       
18ca0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
18cb0 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c  r select lists l
18cc0 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a  ike "count(*)" *
18cd0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
18ce0 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69  List;      /* Li
18cf0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
18d00 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53   extract. */.  S
18d10 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
18d20 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ;     /* List of
18d30 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63   tables to selec
18d40 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72  t from */.  Expr
18d50 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
18d60 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
18d70 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
18d80 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
18d90 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
18da0 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
18db0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
18dc0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
18dd0 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
18de0 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
18df0 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
18e00 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
18e10 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
18e20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
18e30 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
18e40 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69   NULL */.  int i
18e50 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
18e60 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
18e70 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
18e80 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
18e90 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20    int distinct; 
18ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
18eb0 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  e to use for the
18ec0 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f   distinct set */
18ed0 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20  .  int rc = 1;  
18ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
18ef0 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f  ue to return fro
18f00 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
18f10 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72  */.  int addrSor
18f20 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41  tIndex;     /* A
18f30 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f  ddress of an OP_
18f40 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
18f50 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 41  struction */.  A
18f60 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b  ggInfo sAggInfo;
18f70 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
18f80 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67  tion used by agg
18f90 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
18fa0 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20  /.  int iEnd;   
18fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
18fc0 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64  dress of the end
18fd0 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
18fe0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
18ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19000 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
19010 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20  tion */..  db = 
19020 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
19030 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ( p==0 || db->ma
19040 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
19050 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
19060 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
19070 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
19080 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
19090 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
190a0 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
190b0 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
190c0 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
190d0 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20  (sAggInfo));..  
190e0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
190f0 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 49 67  rderBy;.  if( Ig
19100 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
19110 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  Dest) ){.    p->
19120 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20  pOrderBy = 0;.. 
19130 20 20 20 2f 2a 20 49 6e 20 74 68 65 73 65 20 63     /* In these c
19140 61 73 65 73 20 74 68 65 20 44 49 53 54 49 4e 43  ases the DISTINC
19150 54 20 6f 70 65 72 61 74 6f 72 20 6d 61 6b 65 73  T operator makes
19160 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 74   no difference t
19170 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73  o the.    ** res
19180 75 6c 74 73 2c 20 73 6f 20 72 65 6d 6f 76 65 20  ults, so remove 
19190 69 74 20 69 66 20 69 74 20 77 65 72 65 20 73 70  it if it were sp
191a0 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a  ecified..    */.
191b0 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
191c0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
191d0 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
191e0 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
191f0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
19200 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
19210 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
19220 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
19230 61 72 64 29 3b 0a 20 20 20 20 70 2d 3e 69 73 44  ard);.    p->isD
19240 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 7d  istinct = 0;.  }
19250 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
19260 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72  lectResolve(pPar
19270 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20  se, p, 0) ){.   
19280 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
19290 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65  ;.  }.  p->pOrde
192a0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
192b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
192c0 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
192d0 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65  LECT.  /* If the
192e0 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75  re is are a sequ
192f0 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c  ence of queries,
19300 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20   do the earlier 
19310 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f  ones first..  */
19320 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
19330 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   ){.    if( p->p
19340 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a  Rightmost==0 ){.
19350 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c        Select *pL
19360 6f 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d 20 30  oop, *pRight = 0
19370 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20  ;.      int cnt 
19380 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  = 0;.      for(p
19390 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
193a0 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
193b0 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20  or, cnt++){.    
193c0 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68      pLoop->pRigh
193d0 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  tmost = p;.     
193e0 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20     pLoop->pNext 
193f0 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
19400 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70    pRight = pLoop
19410 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19420 69 66 28 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  if( SQLITE_MAX_C
19430 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3e 30  OMPOUND_SELECT>0
19440 20 26 26 20 63 6e 74 3e 53 51 4c 49 54 45 5f 4d   && cnt>SQLITE_M
19450 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
19460 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  CT ){.        sq
19470 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
19480 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
19490 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e  terms in compoun
194a0 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20  d SELECT");.    
194b0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
194c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
194d0 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
194e0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  ct(pParse, p, pD
194f0 65 73 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 23  est, aff);.  }.#
19500 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
19510 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66   local copies of
19520 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   the parameters 
19530 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a  for this query..
19540 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20    */.  pTabList 
19550 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68  = p->pSrc;.  pWh
19560 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
19570 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
19580 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
19590 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
195a0 67 3b 0a 20 20 69 73 41 67 67 20 3d 20 70 2d 3e  g;.  isAgg = p->
195b0 69 73 41 67 67 3b 0a 20 20 69 73 44 69 73 74 69  isAgg;.  isDisti
195c0 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
195d0 6e 63 74 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  nct;.  pEList = 
195e0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
195f0 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74   pEList==0 ) got
19600 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
19610 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74   /* .  ** Do not
19620 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f   even attempt to
19630 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f   generate any co
19640 64 65 20 69 66 20 77 65 20 68 61 76 65 20 61 6c  de if we have al
19650 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20  ready seen.  ** 
19660 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68  errors before th
19670 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74  is routine start
19680 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  s..  */.  if( pP
19690 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67  arse->nErr>0 ) g
196a0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
196b0 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
196c0 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
196d0 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
196e0 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
196f0 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
19700 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66  output..  */.#if
19710 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19720 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
19730 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c  checkForMultiCol
19740 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70  umnSelectError(p
19750 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45  Parse, pDest, pE
19760 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
19770 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
19780 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  end;.  }.#endif.
19790 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69  .  /* ORDER BY i
197a0 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f  s ignored for so
197b0 6d 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e  me destinations.
197c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 67 6e 6f  .  */.  if( Igno
197d0 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
197e0 73 74 29 20 29 7b 0a 20 20 20 20 70 4f 72 64 65  st) ){.    pOrde
197f0 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rBy = 0;.  }..  
19800 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
19810 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing code..  */. 
19820 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
19830 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
19840 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73  f( v==0 ) goto s
19850 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
19860 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
19870 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69  or all sub-queri
19880 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
19890 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21  lause.  */.#if !
198a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
198b0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
198c0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
198d0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f  _OMIT_VIEW).  fo
198e0 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
198f0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
19900 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
19910 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
19920 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65   = 0;.    int ne
19930 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
19940 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
19950 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
19960 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
19970 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65  i];.    SelectDe
19980 73 74 20 64 65 73 74 3b 0a 0a 20 20 20 20 69 66  st dest;..    if
19990 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
199a0 3d 3d 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69 73  ==0 || pItem->is
199b0 50 6f 70 75 6c 61 74 65 64 20 29 20 63 6f 6e 74  Populated ) cont
199c0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49  inue;.    if( pI
199d0 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 7b  tem->zName!=0 ){
199e0 0a 20 20 20 20 20 20 7a 53 61 76 65 64 41 75 74  .      zSavedAut
199f0 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
19a00 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
19a10 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  .      pParse->z
19a20 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49  AuthContext = pI
19a30 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  tem->zName;.    
19a40 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e    needRestoreCon
19a50 74 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65  text = 1;.    }e
19a60 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65 65 64 52  lse{.      needR
19a70 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20  estoreContext = 
19a80 30 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66  0;.    }.#if def
19a90 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
19aa0 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
19ab0 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20  EXPR_DEPTH>0.   
19ac0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61   /* Increment Pa
19ad0 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74  rse.nHeight by t
19ae0 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  he height of the
19af0 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73   largest express
19b00 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20  ion.    ** tree 
19b10 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 74 68  refered to by th
19b20 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73  is, the parent s
19b30 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64  elect. The child
19b40 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d   select.    ** m
19b50 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65  ay contain expre
19b60 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61  ssion trees of a
19b70 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53  t most.    ** (S
19b80 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
19b90 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67  EPTH-Parse.nHeig
19ba0 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73  ht) height. This
19bb0 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a   is a bit.    **
19bc0 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69   more conservati
19bd0 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72  ve than necessar
19be0 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69  y, but much easi
19bf0 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e  er than enforcin
19c00 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63  g.    ** an exac
19c10 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a  t limit..    */.
19c20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
19c30 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65  ght += sqlite3Se
19c40 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
19c50 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
19c60 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
19c70 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45  nit(&dest, SRT_E
19c80 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e  phemTab, pItem->
19c90 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  iCursor);.    sq
19ca0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
19cb0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  se, pItem->pSele
19cc0 63 74 2c 20 26 64 65 73 74 2c 20 70 2c 20 69 2c  ct, &dest, p, i,
19cd0 20 26 69 73 41 67 67 2c 20 30 29 3b 0a 20 20 20   &isAgg, 0);.   
19ce0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
19cf0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 67  ailed ){.      g
19d00 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
19d10 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65      }.#if define
19d20 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c  d(SQLITE_TEST) |
19d30 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  | SQLITE_MAX_EXP
19d40 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 50  R_DEPTH>0.    pP
19d50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
19d60 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
19d70 70 72 48 65 69 67 68 74 28 70 29 3b 0a 23 65 6e  prHeight(p);.#en
19d80 64 69 66 0a 20 20 20 20 69 66 28 20 6e 65 65 64  dif.    if( need
19d90 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 29  RestoreContext )
19da0 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
19db0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
19dc0 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
19dd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
19de0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
19df0 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e      pWhere = p->
19e00 70 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28 20  pWhere;.    if( 
19e10 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
19e20 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
19e30 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
19e40 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
19e50 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
19e60 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
19e70 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
19e80 76 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73 74  ving;.    isDist
19e90 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
19ea0 69 6e 63 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  inct;.  }.#endif
19eb0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
19ec0 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
19ed0 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72 20  e of a min() or 
19ee0 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 62  max() function b
19ef0 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e  y itself.  ** in
19f00 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
19f10 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 69 66  .  */.#if 0.  if
19f20 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75  ( simpleMinMaxQu
19f30 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ery(pParse, p, p
19f40 44 65 73 74 29 20 29 7b 0a 20 20 20 20 72 63 20  Dest) ){.    rc 
19f50 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  = 0;.    goto se
19f60 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
19f70 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ndif..  /* Check
19f80 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
19f90 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74 68  is a subquery th
19fa0 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74 74  at can be "flatt
19fb0 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20 70  ened" into its p
19fc0 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66  arent..  ** If f
19fd0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20 70  lattening is a p
19fe0 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f  ossiblity, do so
19ff0 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65   and return imme
1a000 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a  diately.  .  */.
1a010 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a020 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70  MIT_VIEW.  if( p
1a030 50 61 72 65 6e 74 20 26 26 20 70 50 61 72 65 6e  Parent && pParen
1a040 74 41 67 67 20 26 26 0a 20 20 20 20 20 20 66 6c  tAgg &&.      fl
1a050 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 64 62  attenSubquery(db
1a060 2c 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e  , pParent, paren
1a070 74 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41 67  tTab, *pParentAg
1a080 67 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20  g, isAgg) ){.   
1a090 20 69 66 28 20 69 73 41 67 67 20 29 20 2a 70 50   if( isAgg ) *pP
1a0a0 61 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20  arentAgg = 1;.  
1a0b0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
1a0c0 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  d;.  }.#endif.. 
1a0d0 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c   /* If possible,
1a0e0 20 72 65 77 72 69 74 65 20 74 68 65 20 71 75 65   rewrite the que
1a0f0 72 79 20 74 6f 20 75 73 65 20 47 52 4f 55 50 20  ry to use GROUP 
1a100 42 59 20 69 6e 73 74 65 61 64 20 6f 66 20 44 49  BY instead of DI
1a110 53 54 49 4e 43 54 2e 0a 20 20 2a 2a 20 47 52 4f  STINCT..  ** GRO
1a120 55 50 20 42 59 20 6d 61 79 20 75 73 65 20 61 6e  UP BY may use an
1a130 20 69 6e 64 65 78 2c 20 44 49 53 54 49 4e 43 54   index, DISTINCT
1a140 20 6e 65 76 65 72 20 64 6f 65 73 2e 0a 20 20 2a   never does..  *
1a150 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73  /.  if( p->isDis
1a160 74 69 6e 63 74 20 26 26 20 21 70 2d 3e 69 73 41  tinct && !p->isA
1a170 67 67 20 26 26 20 21 70 2d 3e 70 47 72 6f 75 70  gg && !p->pGroup
1a180 42 79 20 29 7b 0a 20 20 20 20 70 2d 3e 70 47 72  By ){.    p->pGr
1a190 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
1a1a0 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
1a1b0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  ->pEList);.    p
1a1c0 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
1a1d0 6f 75 70 42 79 3b 0a 20 20 20 20 70 2d 3e 69 73  oupBy;.    p->is
1a1e0 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
1a1f0 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30    isDistinct = 0
1a200 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1a210 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
1a220 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
1a230 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20   this sorting.  
1a240 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65  ** index might e
1a250 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73  nd up being unus
1a260 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63  ed if the data c
1a270 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72  an be .  ** extr
1a280 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72  acted in pre-sor
1a290 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74  ted order.  If t
1a2a0 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c  hat is the case,
1a2b0 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f   then the.  ** O
1a2c0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
1a2d0 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c  instruction will
1a2e0 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61   be changed to a
1a2f0 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20  n OP_Noop once. 
1a300 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75   ** we figure ou
1a310 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69  t that the sorti
1a320 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  ng index is not 
1a330 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61 64 64  needed.  The add
1a340 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20  rSortIndex.  ** 
1a350 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
1a360 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74   to facilitate t
1a370 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f  hat change..  */
1a380 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
1a390 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
1a3a0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b  pKeyInfo;.    pK
1a3b0 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
1a3c0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
1a3d0 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  rse, pOrderBy);.
1a3e0 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45      pOrderBy->iE
1a3f0 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
1a400 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e  >nTab++;.    p->
1a410 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
1a420 3d 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  = addrSortIndex 
1a430 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  =.      sqlite3V
1a440 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1a450 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
1a460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a470 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72            pOrder
1a480 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f  By->iECursor, pO
1a490 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c  rderBy->nExpr+2,
1a4a0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1a4c0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
1a4d0 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
1a4e0 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  FF);.  }else{.  
1a4f0 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20    addrSortIndex 
1a500 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
1a510 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
1a520 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
1a530 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
1a540 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
1a550 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  ..  */.  if( pDe
1a560 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
1a570 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
1a580 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a590 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
1a5a0 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61  eral, pDest->iPa
1a5b0 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
1a5c0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  r);.  }..  /* Se
1a5d0 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
1a5e0 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c   */.  iEnd = sql
1a5f0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1a600 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  l(v);.  computeL
1a610 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
1a620 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
1a630 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72  .  /* Open a vir
1a640 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73  tual index to us
1a650 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
1a660 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ct set..  */.  i
1a670 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b  f( isDistinct ){
1a680 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
1a690 65 79 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65  eyInfo;.    asse
1a6a0 72 74 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72  rt( isAgg || pGr
1a6b0 6f 75 70 42 79 20 29 3b 0a 20 20 20 20 64 69 73  oupBy );.    dis
1a6c0 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
1a6d0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79  nTab++;.    pKey
1a6e0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
1a6f0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
1a700 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  e, p->pEList);. 
1a710 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a720 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
1a730 70 68 65 6d 65 72 61 6c 2c 20 64 69 73 74 69 6e  phemeral, distin
1a740 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a760 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
1a770 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
1a780 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b  NDOFF);.  }else{
1a790 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
1a7a0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67  -1;.  }..  /* Ag
1a7b0 67 72 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d  gregate and non-
1a7c0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
1a7d0 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 64 69  s are handled di
1a7e0 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69  fferently */.  i
1a7f0 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72  f( !isAgg && pGr
1a800 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
1a810 2f 2a 20 54 68 69 73 20 63 61 73 65 20 69 73 20  /* This case is 
1a820 66 6f 72 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74  for non-aggregat
1a830 65 20 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2a  e queries.    **
1a840 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
1a850 61 73 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a  ase scan.    */.
1a860 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
1a870 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
1a880 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
1a890 20 70 57 68 65 72 65 2c 20 26 70 4f 72 64 65 72   pWhere, &pOrder
1a8a0 42 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  By, 0);.    if( 
1a8b0 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
1a8c0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
1a8d0 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20    /* If sorting 
1a8e0 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63  index that was c
1a8f0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  reated by a prio
1a900 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  r OP_OpenEphemer
1a910 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72  al .    ** instr
1a920 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20  uction ended up 
1a930 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64  not being needed
1a940 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68  , then change th
1a950 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
1a960 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  al.    ** into a
1a970 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a  n OP_Noop..    *
1a980 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 6f  /.    if( addrSo
1a990 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f  rtIndex>=0 && pO
1a9a0 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
1a9b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1a9c0 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
1a9d0 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 31 29 3b  drSortIndex, 1);
1a9e0 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
1a9f0 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a  enEphm[2] = -1;.
1aa00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73      }..    /* Us
1aa10 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
1aa20 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f  nner loop.    */
1aa30 0a 20 20 20 20 61 73 73 65 72 74 28 21 69 73 44  .    assert(!isD
1aa40 69 73 74 69 6e 63 74 29 3b 0a 20 20 20 20 73 65  istinct);.    se
1aa50 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
1aa60 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
1aa70 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
1aa80 20 2d 31 2c 20 70 44 65 73 74 2c 0a 20 20 20 20   -1, pDest,.    
1aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aaa0 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
1aab0 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
1aac0 6b 2c 20 61 66 66 29 3b 0a 0a 20 20 20 20 2f 2a  k, aff);..    /*
1aad0 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   End the databas
1aae0 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
1aaf0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57   */.    sqlite3W
1ab00 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
1ab10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1ab20 20 54 68 69 73 20 69 73 20 74 68 65 20 70 72 6f   This is the pro
1ab30 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
1ab40 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f  egate queries */
1ab50 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
1ab60 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65   sNC;    /* Name
1ab70 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f   context for pro
1ab80 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74  cessing aggregat
1ab90 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
1aba0 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20  .    int iAMem; 
1abb0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1abc0 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
1abd0 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e  r storing curren
1abe0 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  t GROUP BY */.  
1abf0 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20    int iBMem;    
1ac00 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
1ac10 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70  em address for p
1ac20 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59  revious GROUP BY
1ac30 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65   */.    int iUse
1ac40 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Flag;       /* M
1ac50 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69  em address holdi
1ac60 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69  ng flag indicati
1ac70 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  ng that at least
1ac80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ac90 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20           ** one 
1aca0 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74  row of the input
1acb0 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
1acc0 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  or has been.    
1acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ace0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64      ** processed
1acf0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f   */.    int iAbo
1ad00 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d  rtFlag;     /* M
1ad10 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68  em address which
1ad20 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62   causes query ab
1ad30 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20  ort if positive 
1ad40 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70  */.    int group
1ad50 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f  BySort;    /* Ro
1ad60 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75  ws come from sou
1ad70 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20  rce in GROUP BY 
1ad80 6f 72 64 65 72 20 2a 2f 0a 0a 0a 20 20 20 20 2f  order */...    /
1ad90 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1ada0 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 61  variables hold a
1adb0 64 64 72 65 73 73 65 73 20 6f 72 20 6c 61 62 65  ddresses or labe
1adc0 6c 73 20 66 6f 72 20 70 61 72 74 73 20 6f 66 20  ls for parts of 
1add0 74 68 65 0a 20 20 20 20 2a 2a 20 76 69 72 74 75  the.    ** virtu
1ade0 61 6c 20 6d 61 63 68 69 6e 65 20 70 72 6f 67 72  al machine progr
1adf0 61 6d 20 77 65 20 61 72 65 20 70 75 74 74 69 6e  am we are puttin
1ae00 67 20 74 6f 67 65 74 68 65 72 20 2a 2f 0a 20 20  g together */.  
1ae10 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74    int addrOutput
1ae20 52 6f 77 3b 20 20 20 20 20 20 2f 2a 20 53 74 61  Row;      /* Sta
1ae30 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65  rt of subroutine
1ae40 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
1ae50 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20  result row */.  
1ae60 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f    int addrSetAbo
1ae70 72 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74  rt;       /* Set
1ae80 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20   the abort flag 
1ae90 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
1aea0 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 69 61    int addrInitia
1aeb0 6c 69 7a 65 4c 6f 6f 70 3b 20 2f 2a 20 53 74 61  lizeLoop; /* Sta
1aec0 72 74 20 6f 66 20 63 6f 64 65 20 74 68 61 74 20  rt of code that 
1aed0 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20  initializes the 
1aee0 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  input loop */.  
1aef0 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c    int addrTopOfL
1af00 6f 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70  oop;      /* Top
1af10 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f   of the input lo
1af20 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  op */.    int ad
1af30 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 3b  drGroupByChange;
1af40 20 20 2f 2a 20 43 6f 64 65 20 74 68 61 74 20 72    /* Code that r
1af50 75 6e 73 20 77 68 65 6e 20 61 6e 79 20 47 52 4f  uns when any GRO
1af60 55 50 20 42 59 20 74 65 72 6d 20 63 68 61 6e 67  UP BY term chang
1af70 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  es */.    int ad
1af80 64 72 50 72 6f 63 65 73 73 52 6f 77 3b 20 20 20  drProcessRow;   
1af90 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70 72 6f    /* Code to pro
1afa0 63 65 73 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  cess a single in
1afb0 70 75 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69  put row */.    i
1afc0 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20  nt addrEnd;     
1afd0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
1afe0 20 61 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67 20   all processing 
1aff0 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53  */.    int addrS
1b000 6f 72 74 69 6e 67 49 64 78 3b 20 20 20 20 20 2f  ortingIdx;     /
1b010 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  * The OP_OpenEph
1b020 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73  emeral for the s
1b030 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  orting index */.
1b040 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65      int addrRese
1b050 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  t;          /* S
1b060 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65  ubroutine for re
1b070 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75  setting the accu
1b080 6d 75 6c 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20  mulator */..    
1b090 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65  addrEnd = sqlite
1b0a0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1b0b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  );..    /* Conve
1b0c0 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  rt TK_COLUMN nod
1b0d0 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  es into TK_AGG_C
1b0e0 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65  OLUMN and make e
1b0f0 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a  ntries in.    **
1b100 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c   sAggInfo for al
1b110 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  l TK_AGG_FUNCTIO
1b120 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65  N nodes in expre
1b130 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20  ssions of the.  
1b140 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
1b150 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ement..    */.  
1b160 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
1b170 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
1b180 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
1b190 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
1b1a0 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
1b1b0 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41  List;.    sNC.pA
1b1c0 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e  ggInfo = &sAggIn
1b1d0 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f  fo;.    sAggInfo
1b1e0 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20  .nSortingColumn 
1b1f0 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72  = pGroupBy ? pGr
1b200 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a  oupBy->nExpr+1 :
1b210 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
1b220 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
1b230 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
1b240 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
1b250 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
1b260 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1b270 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
1b280 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29  (&sNC, pOrderBy)
1b290 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
1b2a0 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
1b2b0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1b2c0 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48  regates(&sNC, pH
1b2d0 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20  aving);.    }.  
1b2e0 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75    sAggInfo.nAccu
1b2f0 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e  mulator = sAggIn
1b300 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  fo.nColumn;.    
1b310 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
1b320 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  nfo.nFunc; i++){
1b330 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b340 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
1b350 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e  (&sNC, sAggInfo.
1b360 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e  aFunc[i].pExpr->
1b370 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
1b380 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1b390 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
1b3a0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f  lect_end;..    /
1b3b0 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  * Processing for
1b3c0 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
1b3d0 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72   GROUP BY is ver
1b3e0 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a  y different and.
1b3f0 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65      ** much more
1b400 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67   complex than ag
1b410 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74  gregates without
1b420 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20   a GROUP BY..   
1b430 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
1b440 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65  upBy ){.      Ke
1b450 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
1b460 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f    /* Keying info
1b470 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
1b480 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20  group by clause 
1b490 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65  */..      /* Cre
1b4a0 61 74 65 20 6c 61 62 65 6c 73 20 74 68 61 74 20  ate labels that 
1b4b0 77 65 20 77 69 6c 6c 20 62 65 20 6e 65 65 64 69  we will be needi
1b4c0 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ng.      */.    
1b4d0 20 0a 20 20 20 20 20 20 61 64 64 72 49 6e 69 74   .      addrInit
1b4e0 69 61 6c 69 7a 65 4c 6f 6f 70 20 3d 20 73 71 6c  ializeLoop = sql
1b4f0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1b500 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72  l(v);.      addr
1b510 47 72 6f 75 70 42 79 43 68 61 6e 67 65 20 3d 20  GroupByChange = 
1b520 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1b530 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61  abel(v);.      a
1b540 64 64 72 50 72 6f 63 65 73 73 52 6f 77 20 3d 20  ddrProcessRow = 
1b550 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1b560 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 20 20  abel(v);..      
1b570 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
1b580 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
1b590 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61   we might need a
1b5a0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
1b5b0 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65  o.      ** imple
1b5c0 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61  ment it.  Alloca
1b5d0 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20  te that sorting 
1b5e0 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69  index now.  If i
1b5f0 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20  t turns out.    
1b600 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
1b610 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65  not need it afte
1b620 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70 65 6e 45  r all, the OpenE
1b630 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
1b640 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69  tion.      ** wi
1b650 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
1b660 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20  into a Noop.  . 
1b670 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41       */.      sA
1b680 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1b690 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
1b6a0 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  ++;.      pKeyIn
1b6b0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
1b6c0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1b6d0 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20   pGroupBy);.    
1b6e0 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78    addrSortingIdx
1b6f0 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   =.          sql
1b700 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1b710 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
1b720 61 6c 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  al, sAggInfo.sor
1b730 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20  tingIdx,.       
1b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b750 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
1b760 69 6e 67 43 6f 6c 75 6d 6e 2c 20 30 2c 0a 20 20  ingColumn, 0,.  
1b770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b780 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
1b790 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
1b7a0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20  FO_HANDOFF);..  
1b7b0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
1b7c0 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
1b7d0 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50  ns used by GROUP
1b7e0 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72   BY aggregate pr
1b7f0 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a  ocessing.      *
1b800 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67  /.      iUseFlag
1b810 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1b820 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46  m;.      iAbortF
1b830 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
1b840 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 4d 65  nMem;.      iAMe
1b850 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
1b860 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
1b870 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
1b880 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
1b890 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73     iBMem = pPars
1b8a0 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
1b8b0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
1b8c0 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
1b8d0 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
1b8e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b8f0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41  P_Integer, 0, iA
1b900 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
1b910 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1b920 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c   "clear abort fl
1b930 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
1b940 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b950 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
1b960 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
1b970 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1b980 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75  , "indicate accu
1b990 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29  mulator empty"))
1b9a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1b9b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b9c0 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 49 6e 69  Goto, 0, addrIni
1b9d0 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 0a 20  tializeLoop);.. 
1b9e0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
1b9f0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
1ba00 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e  at outputs a sin
1ba10 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
1ba20 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
1ba30 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75  et.  This subrou
1ba40 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73  tine first looks
1ba50 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67   at the iUseFlag
1ba60 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20  .  If iUseFlag. 
1ba70 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20       ** is less 
1ba80 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1ba90 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f   zero, the subro
1baa0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1bab0 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74  .  If.      ** t
1bac0 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61  he processing ca
1bad0 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72  lls for the quer
1bae0 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73  y to abort, this
1baf0 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
1bb00 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20    ** increments 
1bb10 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d  the iAbortFlag m
1bb20 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62  emory location b
1bb30 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
1bb40 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
1bb50 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20  r to signal the 
1bb60 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e  caller to abort.
1bb70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1bb80 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73  addrSetAbort = s
1bb90 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1bba0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
1bbb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bbc0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1bbd0 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   1, iAbortFlag);
1bbe0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1bbf0 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72  nt((v, "set abor
1bc00 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
1bc10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bc20 70 32 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p2(v, OP_Return,
1bc30 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64   0, 0);.      ad
1bc40 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71  drOutputRow = sq
1bc50 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1bc60 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
1bc70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1bc80 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55  (v, OP_IfPos, iU
1bc90 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70  seFlag, addrOutp
1bca0 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20  utRow+2);.      
1bcb0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1bcc0 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20  "Groupby result 
1bcd0 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20  generator entry 
1bce0 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20  point"));.      
1bcf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bd00 32 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  2(v, OP_Return, 
1bd10 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 69 6e  0, 0);.      fin
1bd20 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
1bd30 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
1bd40 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
1bd50 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
1bd60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1bd70 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
1bd80 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75  aving, addrOutpu
1bd90 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a  tRow+1, SQLITE_J
1bda0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1bdb0 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74    }.      select
1bdc0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
1bdd0 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
1bde0 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a  0, 0, pOrderBy,.
1bdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be00 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20        distinct, 
1be10 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
1be20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
1be30 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64  rOutputRow+1, ad
1be40 64 72 53 65 74 41 62 6f 72 74 2c 20 61 66 66 29  drSetAbort, aff)
1be50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1be60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1be70 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20  Return, 0, 0);. 
1be80 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1be90 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62  ((v, "end groupb
1bea0 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
1beb0 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
1bec0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1bed0 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
1bee0 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70   reset the group
1bef0 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a  -by accumulator.
1bf00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
1bf10 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74  ddrReset = sqlit
1bf20 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1bf30 72 28 76 29 3b 0a 20 20 20 20 20 20 72 65 73 65  r(v);.      rese
1bf40 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
1bf50 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
1bf60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1bf70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
1bf80 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20  eturn, 0, 0);.. 
1bf90 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20       /* Begin a 
1bfa0 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65  loop that will e
1bfb0 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63  xtract all sourc
1bfc0 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20  e rows in GROUP 
1bfd0 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20  BY order..      
1bfe0 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e  ** This might in
1bff0 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61  volve two separa
1c000 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e  te loops with an
1c010 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77   OP_Sort in betw
1c020 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a  een, or.      **
1c030 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73   it might be a s
1c040 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20  ingle loop that 
1c050 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f  uses an index to
1c060 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61   extract informa
1c070 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tion.      ** in
1c080 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72   the right order
1c090 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a   to begin with..
1c0a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
1c0b0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1c0c0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 49 6e  eLabel(v, addrIn
1c0d0 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20  itializeLoop);. 
1c0e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c0f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1c100 75 62 2c 20 30 2c 20 61 64 64 72 52 65 73 65 74  ub, 0, addrReset
1c110 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
1c120 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
1c130 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
1c140 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70  List, pWhere, &p
1c150 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20  GroupBy, 0);.   
1c160 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
1c170 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
1c180 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 47  nd;.      if( pG
1c190 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20  roupBy==0 ){.   
1c1a0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69       /* The opti
1c1b0 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f  mizer is able to
1c1c0 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
1c1d0 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20   group by order 
1c1e0 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  so.        ** we
1c1f0 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
1c200 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70  sort.  The OP_Op
1c210 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  enEphemeral tabl
1c220 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  e will be.      
1c230 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c    ** cancelled l
1c240 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20  ater because we 
1c250 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73  still need to us
1c260 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20  e the pKeyInfo. 
1c270 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1c280 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
1c290 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
1c2a0 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
1c2b0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
1c2c0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
1c2d0 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69  are coming out i
1c2e0 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f  n undetermined o
1c2f0 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74  rder.  We have t
1c300 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a  o push.        *
1c310 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20  * each row into 
1c320 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c  a sorting index,
1c330 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66   terminate the f
1c340 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20  irst loop,.     
1c350 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20     ** then loop 
1c360 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67  over the sorting
1c370 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20   index in order 
1c380 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75  to get the outpu
1c390 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
1c3a0 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20  sorted order.   
1c3b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1c3c0 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20  int regBase;.   
1c3d0 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f       int regReco
1c3e0 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rd;.        int 
1c3f0 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e  nCol;.        in
1c400 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20  t nGroupBy;..   
1c410 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
1c420 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47   = 1;.        nG
1c430 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
1c440 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
1c450 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42    nCol = nGroupB
1c460 79 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 6a  y + 1;.        j
1c470 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20   = nGroupBy+1;. 
1c480 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1c490 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
1c4a0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
1c4b0 20 20 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f      if( sAggInfo
1c4c0 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72  .aCol[i].iSorter
1c4d0 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20  Column>=j ){.   
1c4e0 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b           nCol++;
1c4f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  .            j++
1c500 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1c510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c520 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65  regBase = sqlite
1c530 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
1c540 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  arse, nCol);.   
1c550 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1c560 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
1c570 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72  rse, pGroupBy, r
1c580 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20  egBase);.       
1c590 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c5a0 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
1c5b0 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  e, sAggInfo.sort
1c5c0 69 6e 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e  ingIdx,regBase+n
1c5d0 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
1c5e0 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31    j = nGroupBy+1
1c5f0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
1c600 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
1c610 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
1c620 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
1c630 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
1c640 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  = &sAggInfo.aCol
1c650 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
1c660 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
1c670 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20  Column>=j ){.   
1c680 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1c690 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1c6a0 6e 28 76 2c 20 70 43 6f 6c 2d 3e 70 54 61 62 2c  n(v, pCol->pTab,
1c6b0 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20   pCol->iColumn, 
1c6c0 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 0a 20 20  pCol->iTable,.  
1c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6f0 20 20 20 6a 20 2b 20 72 65 67 42 61 73 65 29 3b     j + regBase);
1c700 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  .            j++
1c710 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1c720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c730 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
1c740 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
1c750 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
1c760 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1c770 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
1c780 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  d, regBase, nCol
1c790 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
1c7a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c7b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
1c7c0 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66  xInsert, sAggInf
1c7d0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65  o.sortingIdx, re
1c7e0 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
1c7f0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1c800 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1c810 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
1c820 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1c830 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
1c840 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
1c850 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
1c860 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
1c870 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  fo);.        sql
1c880 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1c890 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67 49  , OP_Sort, sAggI
1c8a0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
1c8b0 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
1c8c0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1c8d0 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74  , "GROUP BY sort
1c8e0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67  "));.        sAg
1c8f0 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67  gInfo.useSorting
1c900 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Idx = 1;.      }
1c910 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75  ..      /* Evalu
1c920 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ate the current 
1c930 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
1c940 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20  nd store in b0, 
1c950 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20  b1, b2....      
1c960 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79  ** (b0 is memory
1c970 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b   location iBMem+
1c980 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31  0, b1 is iBMem+1
1c990 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a  , and so forth).
1c9a0 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f        ** Then co
1c9b0 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e  mpare the curren
1c9c0 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
1c9d0 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f   against the GRO
1c9e0 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20  UP BY terms.    
1c9f0 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72    ** from the pr
1ca00 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65  evious row curre
1ca10 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61  ntly stored in a
1ca20 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20  0, a1, a2....   
1ca30 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
1ca40 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69  TopOfLoop = sqli
1ca50 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1ca60 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72  dr(v);.      for
1ca70 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79  (j=0; j<pGroupBy
1ca80 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
1ca90 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70         if( group
1caa0 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
1cab0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cac0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
1cad0 6d 6e 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  mn, sAggInfo.sor
1cae0 74 69 6e 67 49 64 78 2c 20 6a 2c 20 69 42 4d 65  tingIdx, j, iBMe
1caf0 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  m+j);.        }e
1cb00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
1cb10 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f  AggInfo.directMo
1cb20 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  de = 1;.        
1cb30 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1cb40 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  e(pParse, pGroup
1cb50 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20  By->a[j].pExpr, 
1cb60 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
1cb70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1cb80 20 20 66 6f 72 28 6a 3d 70 47 72 6f 75 70 42 79    for(j=pGroupBy
1cb90 2d 3e 6e 45 78 70 72 2d 31 3b 20 6a 3e 3d 30 3b  ->nExpr-1; j>=0;
1cba0 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69   j--){.        i
1cbb0 66 28 20 6a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( j==0 ){.     
1cbc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1cbd0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c  AddOp3(v, OP_Eq,
1cbe0 20 69 41 4d 65 6d 2b 6a 2c 20 61 64 64 72 50 72   iAMem+j, addrPr
1cbf0 6f 63 65 73 73 52 6f 77 2c 20 69 42 4d 65 6d 2b  ocessRow, iBMem+
1cc00 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  j);.        }els
1cc10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
1cc20 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1cc30 2c 20 4f 50 5f 4e 65 2c 20 69 41 4d 65 6d 2b 6a  , OP_Ne, iAMem+j
1cc40 2c 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61  , addrGroupByCha
1cc50 6e 67 65 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  nge, iBMem+j);. 
1cc60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1cc70 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1cc80 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 76 6f 69  geP4(v, -1, (voi
1cc90 64 2a 29 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  d*)pKeyInfo->aCo
1cca0 6c 6c 5b 6a 5d 2c 20 50 34 5f 43 4f 4c 4c 53 45  ll[j], P4_COLLSE
1ccb0 51 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  Q);.        sqli
1ccc0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1ccd0 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  v, SQLITE_NULLEQ
1cce0 55 41 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  UAL);.      }.. 
1ccf0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
1cd00 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
1cd10 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f  whenever the GRO
1cd20 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20  UP BY changes.. 
1cd30 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 20 69       ** Change i
1cd40 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  n the GROUP BY a
1cd50 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74  re detected by t
1cd60 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
1cd70 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e  .      ** block.
1cd80 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20    If there were 
1cd90 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73  no changes, this
1cda0 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65   block is skippe
1cdb0 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
1cdc0 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63    ** This code c
1cdd0 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72  opies current gr
1cde0 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20  oup by terms in 
1cdf0 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20  b0,b1,b2,....   
1ce00 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30     ** over to a0
1ce10 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e  ,a1,a2.  It then
1ce20 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75   calls the outpu
1ce30 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  t subroutine.   
1ce40 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73     ** and resets
1ce50 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
1ce60 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
1ce70 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74  ters in preparat
1ce80 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  ion.      ** for
1ce90 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20   the next GROUP 
1cea0 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20  BY batch..      
1ceb0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1cec0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1ced0 28 76 2c 20 61 64 64 72 47 72 6f 75 70 42 79 43  (v, addrGroupByC
1cee0 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 66 6f  hange);.      fo
1cef0 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
1cf00 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
1cf10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1cf20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1cf30 4d 6f 76 65 2c 20 69 42 4d 65 6d 2b 6a 2c 20 69  Move, iBMem+j, i
1cf40 41 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 7d  AMem+j);.      }
1cf50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1cf60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1cf70 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 4f 75 74  osub, 0, addrOut
1cf80 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
1cf90 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1cfa0 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29  output one row")
1cfb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1cfc0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1cfd0 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c  _IfPos, iAbortFl
1cfe0 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  ag, addrEnd);.  
1cff0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1d000 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74  (v, "check abort
1d010 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
1d020 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d030 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  2(v, OP_Gosub, 0
1d040 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
1d050 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1d060 28 76 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d  (v, "reset accum
1d070 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  ulator"));..    
1d080 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
1d090 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
1d0a0 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20  lators based on 
1d0b0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20  the content of. 
1d0c0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72       ** the curr
1d0d0 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f  ent row.      */
1d0e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d0f0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1d100 2c 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77  , addrProcessRow
1d110 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41  );.      updateA
1d120 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
1d130 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
1d140 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d150 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1d160 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61  eger, 1, iUseFla
1d170 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
1d180 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63  mment((v, "indic
1d190 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63 75  ate data in accu
1d1a0 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
1d1b0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65     /* End of the
1d1c0 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20   loop.      */. 
1d1d0 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
1d1e0 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
1d1f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d200 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73 41  2(v, OP_Next, sA
1d210 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1d220 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70  x, addrTopOfLoop
1d230 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1d240 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1d250 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
1d260 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d270 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
1d280 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49  (v, addrSortingI
1d290 64 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  dx, 1);.      }.
1d2a0 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  .      /* Output
1d2b0 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f   the final row o
1d2c0 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  f result.      *
1d2d0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
1d2e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d2f0 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 4f 75  Gosub, 0, addrOu
1d300 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
1d310 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1d320 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f  "output final ro
1d330 77 22 29 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  w"));.      .   
1d340 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f   } /* endif pGro
1d350 75 70 42 79 20 2a 2f 0a 20 20 20 20 65 6c 73 65  upBy */.    else
1d360 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
1d370 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a  t *pMinMax = 0;.
1d380 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
1d390 70 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  pDel = 0;.      
1d3a0 75 38 20 66 6c 61 67 3b 0a 0a 20 20 20 20 20 20  u8 flag;..      
1d3b0 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
1d3c0 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20  query is of one 
1d3d0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1d3e0 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 2a 2a   forms:.      **
1d3f0 0a 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45  .      **   SELE
1d400 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e  CT min(x) FROM .
1d410 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 53 45  ...      **   SE
1d420 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d  LECT max(x) FROM
1d430 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20   ....      **.  
1d440 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c      ** If it is,
1d450 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f   then ask the co
1d460 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f  de in where.c to
1d470 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74   attempt to sort
1d480 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a   results.      *
1d490 2a 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61  * as if there wa
1d4a0 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78  s an "ORDER ON x
1d4b0 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78  " or "ORDER ON x
1d4c0 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a   DESC" clause. .
1d4d0 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72        ** If wher
1d4e0 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70  e.c is able to p
1d4f0 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20 73  roduce results s
1d500 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72  orted in this or
1d510 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  der, then.      
1d520 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64 65  ** add vdbe code
1d530 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
1d540 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
1d550 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a  loop after the .
1d560 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69        ** first i
1d570 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20  teration (since 
1d580 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
1d590 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
1d5a0 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 67 75 61  is .      ** gua
1d5b0 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61  ranteed to opera
1d5c0 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69  te on the row wi
1d5d0 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f  th the minimum o
1d5e0 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20  r maximum .     
1d5f0 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20   ** value of x, 
1d600 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71  the only row req
1d610 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 2a 2a  uired)..      **
1d620 0a 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63  .      ** A spec
1d630 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65  ial flag must be
1d640 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
1d650 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 74  e3WhereBegin() t
1d660 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20  o slightly.     
1d670 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76   ** modify behav
1d680 69 6f 75 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  iour as follows:
1d690 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1d6a0 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75  **   + If the qu
1d6b0 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54  ery is a "SELECT
1d6c0 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74   min(x)", then t
1d6d0 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79  he loop coded by
1d6e0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68  .      **     wh
1d6f0 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74  ere.c should not
1d700 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e   iterate over an
1d710 79 20 76 61 6c 75 65 73 20 77 69 74 68 20 61 20  y values with a 
1d720 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20  NULL value.     
1d730 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20   **     for x.. 
1d740 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1d750 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a     + The optimiz
1d760 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  er code in where
1d770 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74 68  .c (the thing th
1d780 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63 68  at decides which
1d790 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e  .      **     in
1d7a0 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74  dex or indices t
1d7b0 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c  o use) should pl
1d7c0 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74 20  ace a different 
1d7d0 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20  priority on .   
1d7e0 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66     **     satisf
1d7f0 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20  ying the 'ORDER 
1d800 42 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20  BY' clause than 
1d810 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72  it does in other
1d820 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20 2a 2a   cases..      **
1d830 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f       Refer to co
1d840 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20  de and comments 
1d850 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64  in where.c for d
1d860 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 2a 2f  etails..      */
1d870 0a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69  .      flag = mi
1d880 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72 73 65  nMaxQuery(pParse
1d890 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , p);.      if( 
1d8a0 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  flag ){.        
1d8b0 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 20 3d  pDel = pMinMax =
1d8c0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1d8d0 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  Dup(db, p->pELis
1d8e0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 70  t->a[0].pExpr->p
1d8f0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69  List);.        i
1d900 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64  f( pMinMax && !d
1d910 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1d920 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69  ){.          pMi
1d930 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  nMax->a[0].sortO
1d940 72 64 65 72 20 3d 20 28 28 66 6c 61 67 3d 3d 4f  rder = ((flag==O
1d950 52 44 45 52 42 59 5f 4d 49 4e 29 3f 30 3a 31 29  RDERBY_MIN)?0:1)
1d960 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e  ;.          pMin
1d970 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  Max->a[0].pExpr-
1d980 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
1d990 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d9a0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   }..      /* Thi
1d9b0 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74  s case runs if t
1d9c0 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73  he aggregate has
1d9d0 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
1d9e0 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  use.  The.      
1d9f0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ** processing is
1da00 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69   much simpler si
1da10 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  nce there is onl
1da20 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20  y a single row. 
1da30 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75       ** of outpu
1da40 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
1da50 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
1da60 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
1da70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 57 49  Info);.      pWI
1da80 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
1da90 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
1daa0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
1dab0 2c 20 26 70 4d 69 6e 4d 61 78 2c 20 66 6c 61 67  , &pMinMax, flag
1dac0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
1dad0 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
1dae0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
1daf0 74 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20  tDelete(pDel);. 
1db00 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
1db10 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
1db20 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
1db30 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
1db40 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
1db50 20 20 69 66 28 20 21 70 4d 69 6e 4d 61 78 20 26    if( !pMinMax &
1db60 26 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  & flag ){.      
1db70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1db80 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1db90 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  0, pWInfo->iBrea
1dba0 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  k);.        Vdbe
1dbb0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28  Comment((v, "%s(
1dbc0 29 20 62 79 20 69 6e 64 65 78 22 2c 20 28 66 6c  ) by index", (fl
1dbd0 61 67 3d 3d 4f 52 44 45 52 42 59 5f 4d 49 4e 3f  ag==ORDERBY_MIN?
1dbe0 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a  "min":"max")));.
1dbf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1dc00 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
1dc10 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 66 69 6e  Info);.      fin
1dc20 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
1dc30 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
1dc40 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 4f 72 64  nfo);.      pOrd
1dc50 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
1dc60 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
1dc70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1dc80 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1dc90 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45  , pHaving, addrE
1dca0 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nd, SQLITE_JUMPI
1dcb0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
1dcc0 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
1dcd0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
1dce0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30   p->pEList, 0, 0
1dcf0 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  , 0, -1, .      
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd10 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20  pDest, addrEnd, 
1dd20 61 64 64 72 45 6e 64 2c 20 61 66 66 29 3b 0a 0a  addrEnd, aff);..
1dd30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1dd40 72 4c 69 73 74 44 65 6c 65 74 65 28 70 44 65 6c  rListDelete(pDel
1dd50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1dd60 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1dd70 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29  abel(v, addrEnd)
1dd80 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e  ;.    .  } /* en
1dd90 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75  dif aggregate qu
1dda0 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ery */..  /* If 
1ddb0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
1ddc0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
1ddd0 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72  n we need to sor
1dde0 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  t the results.  
1ddf0 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d  ** and send them
1de00 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
1de10 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a   one by one..  *
1de20 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
1de30 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
1de40 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c  SortTail(pParse,
1de50 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e   p, v, pEList->n
1de60 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20  Expr, pDest);.  
1de70 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1de80 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1de90 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
1dea0 20 61 20 73 75 62 71 75 65 72 79 2c 20 77 65 20   a subquery, we 
1deb0 68 61 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74  have now convert
1dec0 65 64 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ed the subquery 
1ded0 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70  into a.  ** temp
1dee0 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 53 6f  orary table.  So
1def0 20 73 65 74 20 74 68 65 20 53 72 63 4c 69 73 74   set the SrcList
1df00 5f 69 74 65 6d 2e 69 73 50 6f 70 75 6c 61 74 65  _item.isPopulate
1df10 64 20 66 6c 61 67 20 74 6f 20 70 72 65 76 65 6e  d flag to preven
1df20 74 0a 20 20 2a 2a 20 74 68 69 73 20 73 75 62 71  t.  ** this subq
1df30 75 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67 20  uery from being 
1df40 65 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 20  evaluated again 
1df50 61 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68 65  and to force the
1df60 20 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65   use of.  ** the
1df70 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1df80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
1df90 72 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65  rent ){.    asse
1dfa0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  rt( pParent->pSr
1dfb0 63 2d 3e 6e 53 72 63 3e 70 61 72 65 6e 74 54 61  c->nSrc>parentTa
1dfc0 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
1dfd0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e   pParent->pSrc->
1dfe0 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65  a[parentTab].pSe
1dff0 6c 65 63 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70  lect==p );.    p
1e000 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b  Parent->pSrc->a[
1e010 70 61 72 65 6e 74 54 61 62 5d 2e 69 73 50 6f 70  parentTab].isPop
1e020 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  ulated = 1;.  }.
1e030 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4a 75 6d  #endif..  /* Jum
1e040 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
1e050 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20  his query.  */. 
1e060 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1e070 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64  lveLabel(v, iEnd
1e080 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c  );..  /* The SEL
1e090 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66  ECT was successf
1e0a0 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65  ully coded.   Se
1e0b0 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
1e0c0 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69  e to 0.  ** to i
1e0d0 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72  ndicate no error
1e0e0 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30  s..  */.  rc = 0
1e0f0 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20  ;..  /* Control 
1e100 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66  jumps to here if
1e110 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
1e120 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20  ountered above, 
1e130 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63  or upon.  ** suc
1e140 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f  cessful coding o
1e150 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20  f the SELECT..  
1e160 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 0a  */.select_end:..
1e170 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f    /* Identify co
1e180 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65  lumn names if we
1e190 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74   will be using t
1e1a0 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61 63  hem in a callbac
1e1b0 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74  k.  This.  ** st
1e1c0 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ep is skipped if
1e1d0 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67   the output is g
1e1e0 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68  oing to some oth
1e1f0 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  er destination..
1e200 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
1e210 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73  QLITE_OK && pDes
1e220 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  t->eDest==SRT_Ca
1e230 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65  llback ){.    ge
1e240 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
1e250 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
1e260 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st, pEList);.  }
1e270 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
1e280 28 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b  (sAggInfo.aCol);
1e290 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1e2a0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b  sAggInfo.aFunc);
1e2b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e2c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1e2d0 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
1e2e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e2f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1e330 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
1e340 6f 64 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ode is used for 
1e350 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
1e360 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65  gging only.  The
1e370 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20 66 6f   code.** that fo
1e380 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61  llows does not a
1e390 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c 20  ppear in normal 
1e3a0 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  builds..**.** Th
1e3b0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
1e3c0 20 75 73 65 64 20 74 6f 20 70 72 69 6e 74 20 6f   used to print o
1e3d0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ut the content o
1e3e0 66 20 61 6c 6c 20 6f 72 20 70 61 72 74 20 6f 66  f all or part of
1e3f0 20 61 20 0a 2a 2a 20 70 61 72 73 65 20 73 74 72   a .** parse str
1e400 75 63 74 75 72 65 73 20 73 75 63 68 20 61 73 20  uctures such as 
1e410 53 65 6c 65 63 74 20 6f 72 20 45 78 70 72 2e 20  Select or Expr. 
1e420 20 53 75 63 68 20 70 72 69 6e 74 6f 75 74 73 20   Such printouts 
1e430 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f  are useful.** fo
1e440 72 20 68 65 6c 70 69 6e 67 20 74 6f 20 75 6e 64  r helping to und
1e450 65 72 73 74 61 6e 64 20 77 68 61 74 20 69 73 20  erstand what is 
1e460 68 61 70 70 65 6e 69 6e 67 20 69 6e 73 69 64 65  happening inside
1e470 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
1e480 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68  tor.** during th
1e490 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63  e execution of c
1e4a0 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54 20 73 74  omplex SELECT st
1e4b0 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
1e4c0 54 68 65 73 65 20 72 6f 75 74 69 6e 65 20 61 72  These routine ar
1e4d0 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 6e 79  e not called any
1e4e0 77 68 65 72 65 20 66 72 6f 6d 20 77 69 74 68 69  where from withi
1e4f0 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20  n the normal.** 
1e500 63 6f 64 65 20 62 61 73 65 2e 20 20 54 68 65 6e  code base.  Then
1e510 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 74 6f   are intended to
1e520 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
1e530 77 69 74 68 69 6e 20 74 68 65 20 64 65 62 75 67  within the debug
1e540 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20 74  ger.** or from t
1e550 65 6d 70 6f 72 61 72 79 20 22 70 72 69 6e 74 66  emporary "printf
1e560 22 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73  " statements ins
1e570 65 72 74 65 64 20 66 6f 72 20 64 65 62 75 67 67  erted for debugg
1e580 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ing..*/.void sql
1e590 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 45 78  ite3PrintExpr(Ex
1e5a0 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  pr *p){.  if( p-
1e5b0 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 2d 3e 74  >token.z && p->t
1e5c0 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a 20 20 20 20  oken.n>0 ){.    
1e5d0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1e5e0 74 66 28 22 28 25 2e 2a 73 22 2c 20 70 2d 3e 74  tf("(%.*s", p->t
1e5f0 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74 6f 6b 65 6e  oken.n, p->token
1e600 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  .z);.  }else{.  
1e610 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1e620 69 6e 74 66 28 22 28 25 64 22 2c 20 70 2d 3e 6f  intf("(%d", p->o
1e630 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  p);.  }.  if( p-
1e640 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 73 71  >pLeft ){.    sq
1e650 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1e660 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  (" ");.    sqlit
1e670 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70  e3PrintExpr(p->p
1e680 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Left);.  }.  if(
1e690 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20   p->pRight ){.  
1e6a0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1e6b0 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73  intf(" ");.    s
1e6c0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
1e6d0 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  p->pRight);.  }.
1e6e0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1e6f0 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76 6f 69  intf(")");.}.voi
1e700 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78  d sqlite3PrintEx
1e710 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
1e720 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1e730 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1e740 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1e750 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  ){.    sqlite3Pr
1e760 69 6e 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61  intExpr(pList->a
1e770 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
1e780 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  if( i<pList->nEx
1e790 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  pr-1 ){.      sq
1e7a0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1e7b0 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20  (", ");.    }.  
1e7c0 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
1e7d0 50 72 69 6e 74 53 65 6c 65 63 74 28 53 65 6c 65  PrintSelect(Sele
1e7e0 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65 6e  ct *p, int inden
1e7f0 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  t){.  sqlite3Deb
1e800 75 67 50 72 69 6e 74 66 28 22 25 2a 73 53 45 4c  ugPrintf("%*sSEL
1e810 45 43 54 28 25 70 29 20 22 2c 20 69 6e 64 65 6e  ECT(%p) ", inden
1e820 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73 71 6c  t, "", p);.  sql
1e830 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
1e840 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  t(p->pEList);.  
1e850 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1e860 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66 28 20  tf("\n");.  if( 
1e870 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 63  p->pSrc ){.    c
1e880 68 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a 20 20  har *zPrefix;.  
1e890 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a 50 72    int i;.    zPr
1e8a0 65 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b 0a 20  efix = "FROM";. 
1e8b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
1e8c0 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  >pSrc->nSrc; i++
1e8d0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1e8e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1e8f0 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e  tem = &p->pSrc->
1e900 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[i];.      sqli
1e910 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1e920 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b 36 2c  %*s ", indent+6,
1e930 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20   zPrefix);.     
1e940 20 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a 20   zPrefix = "";. 
1e950 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1e960 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
1e970 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1e980 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a 20 20  rintf("(\n");.  
1e990 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 69        sqlite3Pri
1e9a0 6e 74 53 65 6c 65 63 74 28 70 49 74 65 6d 2d 3e  ntSelect(pItem->
1e9b0 70 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e 74 2b  pSelect, indent+
1e9c0 31 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  10);.        sql
1e9d0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1e9e0 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74 2b 38  "%*s)", indent+8
1e9f0 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , "");.      }el
1ea00 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e  se if( pItem->zN
1ea10 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
1ea20 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1ea30 66 28 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  f("%s", pItem->z
1ea40 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
1ea50 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1ea60 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
1ea70 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1ea80 74 66 28 22 28 74 61 62 6c 65 3a 20 25 73 29 22  tf("(table: %s)"
1ea90 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
1eaa0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
1eab0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1eac0 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
1ead0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1eae0 69 6e 74 66 28 22 20 41 53 20 25 73 22 2c 20 70  intf(" AS %s", p
1eaf0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
1eb00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1eb10 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
1eb20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  -1 ){.        sq
1eb30 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1eb40 28 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (",");.      }. 
1eb50 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
1eb60 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
1eb70 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
1eb80 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
1eb90 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1eba0 74 66 28 22 25 2a 73 20 57 48 45 52 45 20 22 2c  tf("%*s WHERE ",
1ebb0 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
1ebc0 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
1ebd0 70 72 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  pr(p->pWhere);. 
1ebe0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1ebf0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
1ec00 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70  .  if( p->pGroup
1ec10 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
1ec20 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
1ec30 73 20 47 52 4f 55 50 20 42 59 20 22 2c 20 69 6e  s GROUP BY ", in
1ec40 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
1ec50 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
1ec60 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 29  ist(p->pGroupBy)
1ec70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
1ec80 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
1ec90 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61    }.  if( p->pHa
1eca0 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  ving ){.    sqli
1ecb0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1ecc0 25 2a 73 20 48 41 56 49 4e 47 20 22 2c 20 69 6e  %*s HAVING ", in
1ecd0 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
1ece0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
1ecf0 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  p->pHaving);.   
1ed00 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1ed10 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
1ed20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
1ed30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1ed40 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
1ed50 4f 52 44 45 52 20 42 59 20 22 2c 20 69 6e 64 65  ORDER BY ", inde
1ed60 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
1ed70 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
1ed80 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  t(p->pOrderBy);.
1ed90 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1eda0 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
1edb0 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68  }.}./* End of th
1edc0 65 20 73 74 72 75 63 74 75 72 65 20 64 65 62 75  e structure debu
1edd0 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a  g printing code.
1ede0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1edf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ee00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ee10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ee20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23  *************/.#
1ee30 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
1ee40 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
1ee50 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1ee60 44 45 42 55 47 29 20 2a 2f 0a                    DEBUG) */.