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

Artifact 3dc81bc22d54b4b08a825f926587e1f96ded57c3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 33 39 30  select.c,v 1.390
0200: 20 32 30 30 38 2f 30 31 2f 30 36 20 30 30 3a 32   2008/01/06 00:2
0210: 35 3a 32 32 20 64 72 68 20 45 78 70 20 24 0a 2a  5:22 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: 20 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 29 7b 0a 20 20 56 64  ement */.){.  Vd
3080: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
3090: 70 56 64 62 65 3b 0a 20 20 73 71 6c 69 74 65 33  pVdbe;.  sqlite3
30a0: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
30b0: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
30c0: 79 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  y, 0);.  sqlite3
30d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
30e0: 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64 65  _Sequence, pOrde
30f0: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30  rBy->iECursor, 0
3100: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3110: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 75 6c  AddOp2(v, OP_Pul
3120: 6c 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  l, pOrderBy->nEx
3130: 70 72 20 2b 20 31 2c 20 30 29 3b 0a 20 20 73 71  pr + 1, 0);.  sq
3140: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3150: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
3160: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
3170: 72 20 2b 20 32 2c 20 30 29 3b 0a 20 20 73 71 6c  r + 2, 0);.  sql
3180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3190: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
31a0: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
31b0: 6f 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53  or, 0);.  if( pS
31c0: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3e 3d 30  elect->iLimit>=0
31d0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
31e0: 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64  1, addr2;.    ad
31f0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
3200: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
3210: 4d 65 6d 5a 65 72 6f 2c 20 70 53 65 6c 65 63 74  MemZero, pSelect
3220: 2d 3e 69 4c 69 6d 69 74 2b 31 2c 20 30 29 3b 0a  ->iLimit+1, 0);.
3230: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3240: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
3250: 6d 6d 2c 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69  mm, pSelect->iLi
3260: 6d 69 74 2b 31 2c 20 2d 31 29 3b 0a 20 20 20 20  mit+1, -1);.    
3270: 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
3280: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3290: 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Goto, 0, 0);.   
32a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
32b0: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
32c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
32d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4c 61 73 74  ddOp2(v, OP_Last
32e0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
32f0: 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  rsor, 0);.    sq
3300: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3310: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 4f  v, OP_Delete, pO
3320: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
3330: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
3340: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3350: 20 61 64 64 72 32 29 3b 0a 20 20 20 20 70 53 65   addr2);.    pSe
3360: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d  lect->iLimit = -
3370: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
3380: 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c  Add code to impl
3390: 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54  ement the OFFSET
33a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
33b0: 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64  codeOffset(.  Vd
33c0: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
33d0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
33e0: 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f   into this VM */
33f0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
3400: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
3410: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
3420: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
3430: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
3440: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
3450: 73 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74  skip the current
3460: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
3470: 20 6e 50 6f 70 20 20 20 20 20 20 20 20 20 20 2f   nPop          /
3480: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  * Number of time
3490: 73 20 74 6f 20 70 6f 70 20 73 74 61 63 6b 20 77  s to pop stack w
34a0: 68 65 6e 20 6a 75 6d 70 69 6e 67 20 2a 2f 0a 29  hen jumping */.)
34b0: 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73  {.  if( p->iOffs
34c0: 65 74 3e 3d 30 20 26 26 20 69 43 6f 6e 74 69 6e  et>=0 && iContin
34d0: 75 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ue!=0 ){.    int
34e0: 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c 69 74   addr;.    sqlit
34f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3500: 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f  OP_AddImm, p->iO
3510: 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20  ffset, -1);.    
3520: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
3530: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
3540: 66 4d 65 6d 4e 65 67 2c 20 70 2d 3e 69 4f 66 66  fMemNeg, p->iOff
3550: 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  set, 0);.    if(
3560: 20 6e 50 6f 70 3e 30 20 29 7b 0a 20 20 20 20 20   nPop>0 ){.     
3570: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3580: 70 32 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 50  p2(v, OP_Pop, nP
3590: 6f 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  op, 0);.    }.  
35a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35b0: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
35c0: 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  0, iContinue);. 
35d0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
35e0: 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45 54 20  v, "skip OFFSET 
35f0: 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20 20  records"));.    
3600: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
3610: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
3620: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  }.}../*.** Add c
3630: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 68  ode that will ch
3640: 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
3650: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
3660: 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74  nts of the.** st
3670: 61 63 6b 20 61 72 65 20 64 69 73 74 69 6e 63 74  ack are distinct
3680: 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72  .  iTab is a sor
3690: 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
36a0: 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79  holds previously
36b0: 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61  .** seen combina
36c0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76  tions of the N v
36d0: 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e  alues.  A new en
36e0: 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69  try is made in i
36f0: 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75  Tab.** if the cu
3700: 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61  rrent N values a
3710: 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20  re new..**.** A 
3720: 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65  jump to addrRepe
3730: 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74  at is made and t
3740: 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72  he N+1 values ar
3750: 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
3760: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68  e.** stack if th
3770: 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73  e top N elements
3780: 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63   are not distinc
3790: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
37a0: 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 5f 4f  d codeDistinct_O
37b0: 4c 44 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  LD(.  Vdbe *v,  
37c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
37d0: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
37e0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
37f0: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
3800: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
3810: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
3820: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
3830: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
3840: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
3850: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
3860: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
3870: 20 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   N              
3880: 2f 2a 20 54 68 65 20 74 6f 70 20 4e 20 65 6c 65  /* The top N ele
3890: 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 74 61  ments of the sta
38a0: 63 6b 20 6d 75 73 74 20 62 65 20 64 69 73 74 69  ck must be disti
38b0: 6e 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nct */.){.  sqli
38c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
38d0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
38e0: 2d 4e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  -N, 0);.  sqlite
38f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3900: 50 5f 44 69 73 74 69 6e 63 74 2c 20 69 54 61 62  P_Distinct, iTab
3910: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
3920: 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a  rentAddr(v)+3);.
3930: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3940: 4f 70 32 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 4e  Op2(v, OP_Pop, N
3950: 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  +1, 0);.  sqlite
3960: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3970: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 52  P_Goto, 0, addrR
3980: 65 70 65 61 74 29 3b 0a 20 20 56 64 62 65 43 6f  epeat);.  VdbeCo
3990: 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20  mment((v, "skip 
39a0: 69 6e 64 69 73 74 69 6e 63 74 20 72 65 63 6f 72  indistinct recor
39b0: 64 73 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  ds"));.  sqlite3
39c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
39d0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62  _IdxInsert, iTab
39e0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , 0);.}../*.** A
39f0: 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  dd code that wil
3a00: 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  l check to make 
3a10: 73 75 72 65 20 74 68 65 20 74 6f 70 20 4e 20 65  sure the top N e
3a20: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  lements of the.*
3a30: 2a 20 73 74 61 63 6b 20 61 72 65 20 64 69 73 74  * stack are dist
3a40: 69 6e 63 74 2e 20 20 69 54 61 62 20 69 73 20 61  inct.  iTab is a
3a50: 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
3a60: 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f  hat holds previo
3a70: 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d  usly.** seen com
3a80: 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  binations of the
3a90: 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65   N values.  A ne
3aa0: 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20  w entry is made 
3ab0: 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68  in iTab.** if th
3ac0: 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75  e current N valu
3ad0: 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a  es are new..**.*
3ae0: 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72  * A jump to addr
3af0: 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61  Repeat is made a
3b00: 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65  nd the N+1 value
3b10: 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f  s are popped fro
3b20: 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69  m the.** stack i
3b30: 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d  f the top N elem
3b40: 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73  ents are not dis
3b50: 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  tinct..*/.static
3b60: 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e   void codeDistin
3b70: 63 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  ct(.  Vdbe *v,  
3b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
3b90: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
3ba0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
3bb0: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
3bc0: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
3bd0: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
3be0: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
3bf0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
3c00: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
3c10: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
3c20: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
3c30: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
3c40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
3c50: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
3c60: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem           /*
3c70: 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a   First element *
3c80: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  /.){.  sqlite3Vd
3c90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
3ca0: 65 67 4d 61 6b 65 52 65 63 2c 20 69 4d 65 6d 2c  egMakeRec, iMem,
3cb0: 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   N);.  sqlite3Vd
3cc0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44  beAddOp2(v, OP_D
3cd0: 69 73 74 69 6e 63 74 2c 20 69 54 61 62 2c 20 73  istinct, iTab, s
3ce0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
3cf0: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 73  tAddr(v)+3);.  s
3d00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3d10: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
3d20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3d30: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
3d40: 6f 2c 20 30 2c 20 61 64 64 72 52 65 70 65 61 74  o, 0, addrRepeat
3d50: 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
3d60: 28 28 76 2c 20 22 73 6b 69 70 20 69 6e 64 69 73  ((v, "skip indis
3d70: 74 69 6e 63 74 20 72 65 63 6f 72 64 73 22 29 29  tinct records"))
3d80: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3d90: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
3da0: 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 30 29 3b  nsert, iTab, 0);
3db0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
3dc0: 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
3dd0: 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43  age when a SELEC
3de0: 54 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e  T is used within
3df0: 20 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e   a subexpression
3e00: 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22  .** (example:  "
3e10: 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  a IN (SELECT * F
3e20: 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74  ROM table)") but
3e30: 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61   it has more tha
3e40: 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f  n 1 result.** co
3e50: 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69  lumn.  We do thi
3e60: 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e  s in a subroutin
3e70: 65 20 62 65 63 61 75 73 65 20 74 68 65 20 65 72  e because the er
3e80: 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 6d 75  ror occurs in mu
3e90: 6c 74 69 70 6c 65 0a 2a 2a 20 70 6c 61 63 65 73  ltiple.** places
3ea0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3eb0: 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c  checkForMultiCol
3ec0: 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 0a  umnSelectError(.
3ed0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3ee0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
3ef0: 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65  context. */.  Se
3f00: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
3f10: 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
3f20: 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73 75  n of SELECT resu
3f30: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  lts */.  int nEx
3f40: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pr            /*
3f50: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
3f60: 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  t columns return
3f70: 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a  ed by SELECT */.
3f80: 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  ){.  int eDest =
3f90: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20   pDest->eDest;. 
3fa0: 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26 20   if( nExpr>1 && 
3fb0: 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20  (eDest==SRT_Mem 
3fc0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65  || eDest==SRT_Se
3fd0: 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t) ){.    sqlite
3fe0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3ff0: 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  , "only a single
4000: 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20   result allowed 
4010: 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20  for ".       "a 
4020: 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70  SELECT that is p
4030: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
4040: 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75  sion");.    retu
4050: 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 1;.  }else{. 
4060: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4070: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
4080: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
4090: 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68   the code for th
40a0: 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20  e inside of the 
40b0: 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
40c0: 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a   a SELECT..**.**
40d0: 20 49 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e   If srcTab and n
40e0: 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20  Column are both 
40f0: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
4100: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
4110: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
4120: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
4130: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
4140: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43  this row.  If nC
4150: 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20  olumn>0.** then 
4160: 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66  data is pulled f
4170: 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70  rom srcTab and p
4180: 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e  EList is used on
4190: 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a  ly to get the.**
41a0: 20 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 65   datatypes for e
41b0: 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ach column..*/.s
41c0: 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
41d0: 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72  InnerLoop(.  Par
41e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
41f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
4200: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
4210: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
4220: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
4230: 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73  omplete select s
4240: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
4250: 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  oded */.  ExprLi
4260: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
4270: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c    /* List of val
4280: 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61 63  ues being extrac
4290: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  ted */.  int src
42a0: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
42b0: 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72   /* Pull data fr
42c0: 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  om this table */
42d0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
42e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
42f0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
4300: 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  in the source ta
4310: 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
4320: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
4330: 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
4340: 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73   sort results us
4350: 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a  ing this key */.
4360: 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20    int distinct, 
4370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
4380: 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72  >=0, make sure r
4390: 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 69  esults are disti
43a0: 6e 63 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  nct */.  SelectD
43b0: 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
43c0: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
43d0: 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  se of the result
43e0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  s */.  int iCont
43f0: 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f  inue,          /
4400: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
4410: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
4420: 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  t row */.  int i
4430: 42 72 65 61 6b 2c 20 20 20 20 20 20 20 20 20 20  Break,          
4440: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
4450: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
4460: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
4470: 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20  /.  char *aff   
4480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
4490: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69  ffinity string i
44a0: 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55  f eDest is SRT_U
44b0: 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  nion */.){.  Vdb
44c0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
44d0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6e  Vdbe;.  int i, n
44e0: 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69  ;.  int hasDisti
44f0: 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nct;        /* T
4500: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
4510: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
4520: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
4530: 69 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  iMem;           
4540: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
4550: 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72  memory holding r
4560: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69  esult set */.  i
4570: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
4580: 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69  ->eDest;.  int i
4590: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 50  Parm = pDest->iP
45a0: 61 72 6d 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30  arm;..  if( v==0
45b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
45c0: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
45d0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
45e0: 72 65 20 77 61 73 20 61 20 4c 49 4d 49 54 20 63  re was a LIMIT c
45f0: 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 53 45 4c  lause on the SEL
4600: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
4610: 68 65 6e 20 64 6f 20 74 68 65 20 63 68 65 63 6b  hen do the check
4620: 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  .  ** to see if 
4630: 74 68 69 73 20 72 6f 77 20 73 68 6f 75 6c 64 20  this row should 
4640: 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
4650: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
4660: 64 69 73 74 69 6e 63 74 3e 3d 30 20 26 26 20 70  distinct>=0 && p
4670: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a  EList->nExpr>0;.
4680: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
4690: 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63  0 && !hasDistinc
46a0: 74 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66  t ){.    codeOff
46b0: 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69  set(v, p, iConti
46c0: 6e 75 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  nue, 0);.  }..  
46d0: 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75  /* Pull the requ
46e0: 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ested columns.. 
46f0: 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d   */.  if( nColum
4700: 6e 3e 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e  n>0 ){.    n = n
4710: 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b  Column;.  }else{
4720: 0a 20 20 20 20 6e 20 3d 20 70 45 4c 69 73 74 2d  .    n = pEList-
4730: 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66  >nExpr;.  }.  if
4740: 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3e 30 20  ( pDest->iMem>0 
4750: 29 7b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 70 44  ){.    iMem = pD
4760: 65 73 74 2d 3e 69 4d 65 6d 3b 0a 20 20 7d 65 6c  est->iMem;.  }el
4770: 73 65 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69  se{.    pDest->i
4780: 4d 65 6d 20 3d 20 69 4d 65 6d 20 3d 20 70 50 61  Mem = iMem = pPa
4790: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
47a0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
47b0: 20 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 43   n;.  }.  if( nC
47c0: 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66  olumn>0 ){.    f
47d0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
47e0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  n; i++){.      s
47f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4800: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
4810: 72 63 54 61 62 2c 20 69 2c 20 69 4d 65 6d 2b 69  rcTab, i, iMem+i
4820: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
4830: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
4840: 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a  Exists ){.    /*
4850: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
4860: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
4870: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
4880: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
4890: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
48a0: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
48b0: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
48c0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
48d0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
48e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
48f0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
4900: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
4910: 78 70 72 2c 20 69 4d 65 6d 2b 69 29 3b 0a 20 20  xpr, iMem+i);.  
4920: 20 20 7d 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d    }.  }.  nColum
4930: 6e 20 3d 20 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  n = n;..  /* If 
4940: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
4950: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
4960: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
4970: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
4980: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
4990: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
49a0: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
49b0: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
49c0: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
49d0: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  lt..  */.  if( h
49e0: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
49f0: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
4a00: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
4a10: 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t( pEList->nExpr
4a20: 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ==nColumn );.   
4a30: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 76 2c   codeDistinct(v,
4a40: 20 64 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74   distinct, iCont
4a50: 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 69  inue, nColumn, i
4a60: 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  Mem);.    if( pO
4a70: 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
4a80: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
4a90: 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e   p, iContinue, n
4aa0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 0a 20  Column);.    }. 
4ab0: 20 7d 0a 0a 20 20 69 66 28 20 63 68 65 63 6b 46   }..  if( checkF
4ac0: 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c  orMultiColumnSel
4ad0: 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
4ae0: 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e   pDest, pEList->
4af0: 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 72 65  nExpr) ){.    re
4b00: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 73  turn 0;.  }..  s
4b10: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
4b20: 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d      /* In this m
4b30: 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20  ode, write each 
4b40: 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20  query result to 
4b50: 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74  the key of the t
4b60: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20  emporary.    ** 
4b70: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
4b80: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
4b90: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
4ba0: 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65  _SELECT.    case
4bb0: 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20   SRT_Union: {.  
4bc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4bd0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 67 4d  ddOp2(v, OP_RegM
4be0: 61 6b 65 52 65 63 2c 20 69 4d 65 6d 2c 20 6e 43  akeRec, iMem, nC
4bf0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 69 66  olumn);.      if
4c00: 28 20 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20  ( aff ){.       
4c10: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4c20: 67 65 50 34 28 76 2c 20 2d 31 2c 20 61 66 66 2c  geP4(v, -1, aff,
4c30: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
4c40: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
4c50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4c60: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
4c70: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  arm, 0);.      b
4c80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
4c90: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
4ca0: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
4cb0: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
4cc0: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
4cd0: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
4ce0: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
4cf0: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
4d00: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
4d10: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
4d20: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
4d30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
4d40: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
4d50: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
4d60: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
4d70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4d80: 2c 20 4f 50 5f 52 65 67 4d 61 6b 65 52 65 63 2c  , OP_RegMakeRec,
4d90: 20 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b   iMem, nColumn);
4da0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4db0: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
4dc0: 2c 20 61 66 66 2c 20 50 34 5f 53 54 41 54 49 43  , aff, P4_STATIC
4dd0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4de0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4df0: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d  _NotFound, iParm
4e00: 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20  , addr+3);.     
4e10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4e20: 70 32 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p2(v, OP_Delete,
4e30: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
4e40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
4e50: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74  endif..    /* St
4e60: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  ore the result a
4e70: 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75  s data using a u
4e80: 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a  nique key..    *
4e90: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  /.    case SRT_T
4ea0: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
4eb0: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
4ec0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4ed0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 67  AddOp2(v, OP_Reg
4ee0: 4d 61 6b 65 52 65 63 2c 20 69 4d 65 6d 2c 20 6e  MakeRec, iMem, n
4ef0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 69  Column);.      i
4f00: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
4f10: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
4f20: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
4f30: 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20  rderBy, p);.    
4f40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4f50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4f60: 70 31 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p1(v, OP_NewRowi
4f70: 64 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  d, iParm);.     
4f80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4f90: 64 4f 70 32 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  dOp2(v, OP_Pull,
4fa0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
4fb0: 73 71 6c 69 74 65 33 43 6f 64 65 49 6e 73 65 72  sqlite3CodeInser
4fc0: 74 28 70 50 61 72 73 65 2c 20 69 50 61 72 6d 2c  t(pParse, iParm,
4fd0: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
4fe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4ff0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
5000: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5010: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a  _SUBQUERY.    /*
5020: 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74   If we are creat
5030: 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e  ing a set for an
5040: 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43   "expr IN (SELEC
5050: 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63  T ...)" construc
5060: 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  t,.    ** then t
5070: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
5080: 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20   single item on 
5090: 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74  the stack.  Writ
50a0: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74  e this.    ** it
50b0: 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20  em into the set 
50c0: 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73  table with bogus
50d0: 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
50e0: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
50f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
5100: 32 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  2;..      assert
5110: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
5120: 20 20 20 20 20 20 61 64 64 72 32 20 3d 20 73 71        addr2 = sq
5130: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5140: 76 2c 20 4f 50 5f 49 66 4d 65 6d 4e 75 6c 6c 2c  v, OP_IfMemNull,
5150: 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20   iMem, 0);.     
5160: 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73   p->affinity = s
5170: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
5180: 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b  inity(pEList->a[
5190: 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d  0].pExpr, pDest-
51a0: 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20  >affinity);.    
51b0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
51c0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
51d0: 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75  first glance you
51e0: 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20   would think we 
51f0: 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f  could optimize o
5200: 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ut the.        *
5210: 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68  * ORDER BY in th
5220: 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68  is case since th
5230: 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69  e order of entri
5240: 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20  es in the set.  
5250: 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f        ** does no
5260: 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74  t matter.  But t
5270: 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20  here might be a 
5280: 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e  LIMIT clause, in
5290: 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a   which.        *
52a0: 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72  * case the order
52b0: 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a   does matter */.
52c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
52d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
52e0: 53 43 6f 70 79 2c 20 69 4d 65 6d 2c 20 30 29 3b  SCopy, iMem, 0);
52f0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
5300: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
5310: 70 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20  pOrderBy, p);.  
5320: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5330: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5340: 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 67 4d 61  dOp4(v, OP_RegMa
5350: 6b 65 52 65 63 2c 20 69 4d 65 6d 2c 20 31 2c 20  keRec, iMem, 1, 
5360: 30 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c  0, &p->affinity,
5370: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
5380: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5390: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
53a0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
53b0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
53c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
53d0: 61 64 64 72 32 29 3b 0a 20 20 20 20 20 20 62 72  addr2);.      br
53e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
53f0: 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
5400: 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
5410: 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
5420: 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
5430: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
5440: 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
5450: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5460: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
5470: 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d  nteger, 1, iParm
5480: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
5490: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
54a0: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
54b0: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
54c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
54d0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
54e0: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
54f0: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
5500: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
5510: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
5520: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
5530: 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
5540: 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
5550: 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
5560: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
5570: 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
5580: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
5590: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
55a0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
55b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
55c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
55d0: 70 79 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20  py, iMem, 0);.  
55e0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
55f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
5600: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
5610: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 29 3b  e, pOrderBy, p);
5620: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5630: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5640: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f  eAddOp2(v, OP_Mo
5650: 76 65 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20  ve, 0, iParm);. 
5660: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49         /* The LI
5670: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
5680: 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
5690: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
56a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
56b0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
56c0: 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
56d0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
56e0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64   */..    /* Send
56f0: 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65   the data to the
5700: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
5710: 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72 6f  on or to a subro
5720: 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20  utine.  In the. 
5730: 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61 20     ** case of a 
5740: 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  subroutine, the 
5750: 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c  subroutine itsel
5760: 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  f is responsible
5770: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70   for.    ** popp
5780: 69 6e 67 20 74 68 65 20 64 61 74 61 20 66 72 6f  ing the data fro
5790: 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20  m the stack..   
57a0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
57b0: 5f 53 75 62 72 6f 75 74 69 6e 65 3a 0a 20 20 20  _Subroutine:.   
57c0: 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61   case SRT_Callba
57d0: 63 6b 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ck: {.      if( 
57e0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
57f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5800: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 67 4d  ddOp2(v, OP_RegM
5810: 61 6b 65 52 65 63 2c 20 69 4d 65 6d 2c 20 6e 43  akeRec, iMem, nC
5820: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
5830: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
5840: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
5850: 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   p);.      }else
5860: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
5870: 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  Subroutine ){.  
5880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5890: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
58a0: 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a  sub, 0, iParm);.
58b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
58c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
58d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
58e0: 75 6c 74 52 6f 77 2c 20 69 4d 65 6d 2c 20 6e 43  ultRow, iMem, nC
58f0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  olumn);.      }.
5900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5910: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
5920: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
5930: 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73  GGER).    /* Dis
5940: 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
5950: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
5960: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
5970: 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
5980: 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
5990: 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
59a0: 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
59b0: 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
59c0: 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
59d0: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
59e0: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
59f0: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
5a00: 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
5a10: 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
5a20: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
5a30: 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
5a40: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5a50: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
5a60: 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
5a70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5a80: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
5a90: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
5aa0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
5ab0: 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
5ac0: 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
5ad0: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e    if( p->iLimit>
5ae0: 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d  =0 && pOrderBy==
5af0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
5b00: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5b10: 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69 6d  _AddImm, p->iLim
5b20: 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c  it, -1);.    sql
5b30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5b40: 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20  , OP_IfMemZero, 
5b50: 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
5b60: 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  k);.  }.  return
5b70: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   0;.}../*.** Giv
5b80: 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
5b90: 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20   list, generate 
5ba0: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
5bb0: 75 72 65 20 74 68 61 74 20 72 65 63 6f 72 64 73  ure that records
5bc0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  .** the collatin
5bd0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65  g sequence for e
5be0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
5bf0: 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  n that expressio
5c00: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  n list..**.** If
5c10: 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73   the ExprList is
5c20: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
5c30: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
5c40: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69  then the resulti
5c50: 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74  ng.** KeyInfo st
5c60: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
5c70: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
5c80: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
5c90: 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d  l index to.** im
5ca0: 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61  plement that cla
5cb0: 75 73 65 2e 20 20 49 66 20 74 68 65 20 45 78 70  use.  If the Exp
5cc0: 72 4c 69 73 74 20 69 73 20 74 68 65 20 72 65 73  rList is the res
5cd0: 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c  ult set of a SEL
5ce0: 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ECT.** then the 
5cf0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
5d00: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
5d10: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
5d20: 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69  g a virtual.** i
5d30: 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  ndex to implemen
5d40: 74 20 61 20 44 49 53 54 49 4e 43 54 20 74 65 73  t a DISTINCT tes
5d50: 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  t..**.** Space t
5d60: 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
5d70: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
5d80: 6f 62 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c  obtain from mall
5d90: 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  oc.  The calling
5da0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
5db0: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
5dc0: 73 65 65 69 6e 67 20 74 68 61 74 20 74 68 69 73  seeing that this
5dd0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76   structure is ev
5de0: 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65  entually.** free
5df0: 64 2e 20 20 41 64 64 20 74 68 65 20 4b 65 79 49  d.  Add the KeyI
5e00: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f  nfo structure to
5e10: 20 74 68 65 20 50 34 20 66 69 65 6c 64 20 6f 66   the P4 field of
5e20: 20 61 6e 20 6f 70 63 6f 64 65 20 75 73 69 6e 67   an opcode using
5e30: 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  .** P4_KEYINFO_H
5e40: 41 4e 44 4f 46 46 20 69 73 20 74 68 65 20 75 73  ANDOFF is the us
5e50: 75 61 6c 20 77 61 79 20 6f 66 20 64 65 61 6c 69  ual way of deali
5e60: 6e 67 20 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f  ng with this..*/
5e70: 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
5e80: 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  *keyInfoFromExpr
5e90: 4c 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72  List(Parse *pPar
5ea0: 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  se, ExprList *pL
5eb0: 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ist){.  sqlite3 
5ec0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
5ed0: 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20  ;.  int nExpr;. 
5ee0: 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b   KeyInfo *pInfo;
5ef0: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
5f00: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
5f10: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70    int i;..  nExp
5f20: 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r = pList->nExpr
5f30: 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69  ;.  pInfo = sqli
5f40: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
5f50: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66  db, sizeof(*pInf
5f60: 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65  o) + nExpr*(size
5f70: 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20  of(CollSeq*)+1) 
5f80: 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29  );.  if( pInfo )
5f90: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f  {.    pInfo->aSo
5fa0: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
5fb0: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78  pInfo->aColl[nEx
5fc0: 70 72 5d 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  pr];.    pInfo->
5fd0: 6e 46 69 65 6c 64 20 3d 20 6e 45 78 70 72 3b 0a  nField = nExpr;.
5fe0: 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d      pInfo->enc =
5ff0: 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 66 6f   ENC(db);.    fo
6000: 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(i=0, pItem=pLi
6010: 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20  st->a; i<nExpr; 
6020: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
6030: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
6040: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  oll;.      pColl
6050: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
6060: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
6070: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
6080: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
6090: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
60a0: 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
60b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
60c0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  nfo->aColl[i] = 
60d0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e  pColl;.      pIn
60e0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
60f0: 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f  ] = pItem->sortO
6100: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
6110: 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a    return pInfo;.
6120: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
6130: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20   inner loop was 
6140: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
6150: 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65  a non-null pOrde
6160: 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  rBy argument,.**
6170: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
6180: 73 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e  s were placed in
6190: 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65   a sorter.  Afte
61a0: 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65  r the loop is te
61b0: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e  rminated.** we n
61c0: 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73  eed to run the s
61d0: 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74  orter and output
61e0: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
61f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
6200: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
6210: 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65  s the code neede
6220: 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  d to do that..*/
6230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
6240: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20  erateSortTail(. 
6250: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6260: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
6270: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
6280: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  t *p,        /* 
6290: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
62a0: 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ment */.  Vdbe *
62b0: 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  v,          /* G
62c0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
62d0: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
62e0: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
62f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6300: 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
6310: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
6320: 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20  *pDest /* Write 
6330: 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c  the sorted resul
6340: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
6350: 69 6e 74 20 62 72 6b 20 3d 20 73 71 6c 69 74 65  int brk = sqlite
6360: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
6370: 29 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 20 3d 20  );.  int cont = 
6380: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
6390: 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61  abel(v);.  int a
63a0: 64 64 72 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  ddr;.  int iTab;
63b0: 0a 20 20 69 6e 74 20 70 73 65 75 64 6f 54 61 62  .  int pseudoTab
63c0: 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74   = 0;.  ExprList
63d0: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
63e0: 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 69 6e 74  pOrderBy;..  int
63f0: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
6400: 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61  eDest;.  int iPa
6410: 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 50 61 72  rm = pDest->iPar
6420: 6d 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70 4f 72  m;..  iTab = pOr
6430: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3b  derBy->iECursor;
6440: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
6450: 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c 20 65 44  T_Callback || eD
6460: 65 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74  est==SRT_Subrout
6470: 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65 75 64  ine ){.    pseud
6480: 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  oTab = pParse->n
6490: 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Tab++;.    sqlit
64a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
64b0: 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70  OP_OpenPseudo, p
64c0: 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20  seudoTab, 0);.  
64d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
64e0: 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  Op2(v, OP_SetNum
64f0: 43 6f 6c 75 6d 6e 73 2c 20 70 73 65 75 64 6f 54  Columns, pseudoT
6500: 61 62 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ab, nColumn);.  
6510: 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73  }.  addr = 1 + s
6520: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6530: 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61  (v, OP_Sort, iTa
6540: 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f 64 65 4f  b, brk);.  codeO
6550: 66 66 73 65 74 28 76 2c 20 70 2c 20 63 6f 6e 74  ffset(v, p, cont
6560: 2c 20 30 29 3b 0a 20 20 69 66 28 20 65 44 65 73  , 0);.  if( eDes
6570: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
6580: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75  || eDest==SRT_Su
6590: 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  broutine ){.    
65a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
65b0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
65c0: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71   1, 0);.  }.  sq
65d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
65e0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
65f0: 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ab, pOrderBy->nE
6600: 78 70 72 20 2b 20 31 29 3b 0a 20 20 73 77 69 74  xpr + 1);.  swit
6610: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
6620: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
6630: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
6640: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
6650: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6660: 31 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  1(v, OP_NewRowid
6670: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
6680: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6690: 32 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  2(v, OP_Pull, 1,
66a0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
66b0: 65 33 43 6f 64 65 49 6e 73 65 72 74 28 70 50 61  e3CodeInsert(pPa
66c0: 72 73 65 2c 20 69 50 61 72 6d 2c 20 4f 50 46 4c  rse, iParm, OPFL
66d0: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
66e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
66f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6700: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
6710: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
6720: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
6730: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
6740: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6750: 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op2(v, OP_NotNul
6760: 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 64  l, -1, sqlite3Vd
6770: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
6780: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
6790: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
67a0: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
67b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
67c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
67d0: 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62  o, 0, sqlite3Vdb
67e0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
67f0: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
6800: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
6810: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
6820: 20 30 2c 20 30 2c 20 26 70 2d 3e 61 66 66 69 6e   0, 0, &p->affin
6830: 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ity, 1);.      s
6840: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6850: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
6860: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
6870: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6880: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
6890: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
68a0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
68b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
68c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f  eAddOp2(v, OP_Mo
68d0: 76 65 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20  ve, 0, iParm);. 
68e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
68f0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
6900: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
6910: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
6920: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
6930: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 53 52  ndif.    case SR
6940: 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20  T_Callback:.    
6950: 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74  case SRT_Subrout
6960: 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ine: {.      int
6970: 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   i;.      sqlite
6980: 33 43 6f 64 65 49 6e 73 65 72 74 28 70 50 61 72  3CodeInsert(pPar
6990: 73 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30  se, pseudoTab, 0
69a0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
69b0: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
69c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
69d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
69e0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64  OP_Column, pseud
69f0: 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e  oTab, i, pDest->
6a00: 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 20 20 7d  iMem+i);.      }
6a10: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
6a20: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
6a30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6a40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6a50: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65  P_ResultRow, pDe
6a60: 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d  st->iMem, nColum
6a70: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
6a80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6a90: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6aa0: 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d  _Gosub, 0, iParm
6ab0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6ac0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6ad0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
6ae0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
6af0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
6b00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
6b10: 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   Jump to the end
6b20: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 68 65   of the loop whe
6b30: 6e 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  n the LIMIT is r
6b40: 65 61 63 68 65 64 0a 20 20 2a 2f 0a 20 20 69 66  eached.  */.  if
6b50: 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29  ( p->iLimit>=0 )
6b60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
6b70: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
6b80: 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  dImm, p->iLimit,
6b90: 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   -1);.    sqlite
6ba0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6bb0: 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e  P_IfMemZero, p->
6bc0: 69 4c 69 6d 69 74 2c 20 62 72 6b 29 3b 0a 20 20  iLimit, brk);.  
6bd0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74  }..  /* The bott
6be0: 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  om of the loop. 
6bf0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
6c00: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
6c10: 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65   cont);.  sqlite
6c20: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6c30: 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
6c40: 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dr);.  sqlite3Vd
6c50: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
6c60: 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28 20 65 44  , brk);.  if( eD
6c70: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
6c80: 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  k || eDest==SRT_
6c90: 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  Subroutine ){.  
6ca0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6cb0: 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
6cc0: 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a   pseudoTab, 0);.
6cd0: 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65    }..}../*.** Re
6ce0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6cf0: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  o a string conta
6d00: 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61  ining the 'decla
6d10: 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20  ration type' of 
6d20: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
6d30: 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74 72  n pExpr. The str
6d40: 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61 74  ing may be treat
6d50: 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79 20  ed as static by 
6d60: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
6d70: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
6d80: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
6d90: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
6da0: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
6db0: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72  d from the.** or
6dc0: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
6dd0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
6de0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6df0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  is a column. The
6e00: 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  .** declaration 
6e10: 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44  type for a ROWID
6e20: 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45   field is INTEGE
6e30: 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20  R. Exactly when 
6e40: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
6e50: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
6e60: 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63   column can be c
6e70: 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72  omplex in the pr
6e80: 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65  esence of subque
6e90: 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73  ries. The.** res
6ea0: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
6eb0: 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65  on in all of the
6ec0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43   following SELEC
6ed0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
6ee0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
6ef0: 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20   column by this 
6f00: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
6f10: 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f    SELECT col FRO
6f20: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
6f30: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
6f40: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
6f50: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
6f60: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20   FROM tbl);.**  
6f70: 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d   SELECT abc FROM
6f80: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20   (SELECT col AS 
6f90: 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  abc FROM tbl);.*
6fa0: 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  * .** The declar
6fb0: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
6fc0: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74  ny expression ot
6fd0: 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d  her than a colum
6fe0: 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  n is NULL..*/.st
6ff0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
7000: 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20 4e  *columnType(.  N
7010: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
7020: 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
7030: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
7040: 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63 6f  pzOriginDb,.  co
7050: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
7060: 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  ginTab,.  const 
7070: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 43  char **pzOriginC
7080: 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  ol.){.  char con
7090: 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  st *zType = 0;. 
70a0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
70b0: 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63 68  iginDb = 0;.  ch
70c0: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69  ar const *zOrigi
70d0: 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  nTab = 0;.  char
70e0: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 43   const *zOriginC
70f0: 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  ol = 0;.  int j;
7100: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
7110: 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  || pNC->pSrcList
7120: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7130: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
7140: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
7150: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
7160: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
7170: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  MN: {.      /* T
7180: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
7190: 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74   a column. Locat
71a0: 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20  e the table the 
71b0: 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a  column is being.
71c0: 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74        ** extract
71d0: 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43  ed from in NameC
71e0: 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e  ontext.pSrcList.
71f0: 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20   This table may 
7200: 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a  be real.      **
7210: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
7220: 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20  or a subquery.. 
7230: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
7240: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
7250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
7260: 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c  le structure col
7270: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
7280: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53   from */.      S
7290: 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20  elect *pS = 0;  
72a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
72b0: 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lect the column 
72c0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
72d0: 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  m */.      int i
72e0: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
72f0: 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20  lumn;  /* Index 
7300: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61  of column in pTa
7310: 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65  b */.      while
7320: 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20 29  ( pNC && !pTab )
7330: 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73  {.        SrcLis
7340: 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e  t *pTabList = pN
7350: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
7360: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70       for(j=0;j<p
7370: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26  TabList->nSrc &&
7380: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
7390: 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e  iCursor!=pExpr->
73a0: 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20  iTable;j++);.   
73b0: 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c       if( j<pTabL
73c0: 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20  ist->nSrc ){.   
73d0: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
73e0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
73f0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 20  b;.          pS 
7400: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
7410: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
7420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7430: 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e     pNC = pNC->pN
7440: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ext;.        }. 
7450: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
7460: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
7470: 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a       /* FIX ME:.
7480: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
7490: 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20 79 6f  can occurs if yo
74a0: 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69 6e 67  u have something
74b0: 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20 6e 65   like "SELECT ne
74c0: 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20 20 20  w.x;" inside.   
74d0: 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
74e0: 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  r.  In other wor
74f0: 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66 65 72  ds, if you refer
7500: 65 6e 63 65 20 74 68 65 20 73 70 65 63 69 61 6c  ence the special
7510: 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20 20 2a   "new".        *
7520: 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 72  * table in the r
7530: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 73  esult set of a s
7540: 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f  elect.  We do no
7550: 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20 77 61  t have a good wa
7560: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  y.        ** to 
7570: 66 69 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20  find the actual 
7580: 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f 20 63  table type, so c
7590: 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e 20 20  all it "TEXT".  
75a0: 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79 0a 20  This is really. 
75b0: 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68         ** someth
75c0: 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20 62 75  ing of a bug, bu
75d0: 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20  t I do not know 
75e0: 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e 0a 20  how to fix it.. 
75f0: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
7600: 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64    ** This code d
7610: 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63 65 20  oes not produce 
7620: 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
7630: 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70 72 65  er - it just pre
7640: 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  vents.        **
7650: 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20 53 65   a segfault.  Se
7660: 65 20 74 69 63 6b 65 74 20 23 31 32 32 39 2e 0a  e ticket #1229..
7670: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
7680: 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54     zType = "TEXT
7690: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
76a0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
76b0: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 29 3b   assert( pTab );
76c0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b  .      if( pS ){
76d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
76e0: 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61  "table" is actua
76f0: 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74  lly a sub-select
7700: 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68   or a view in th
7710: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
7720: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
7730: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7740: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
7750: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
7760: 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20  d origin.       
7770: 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65   ** data for the
7780: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
7790: 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  mn of the sub-se
77a0: 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  lect..        */
77b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
77c0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d  l>=0 && iCol<pS-
77d0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
77e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
77f0: 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74  f iCol is less t
7800: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
7810: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
7820: 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20  quests the.     
7830: 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66       ** rowid of
7840: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
7850: 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78  or view. This ex
7860: 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61  pression is lega
7870: 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20  l (see .        
7880: 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d    ** test case m
7890: 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61  isc2.2.2) - it a
78a0: 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20  lways evaluates 
78b0: 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20  to NULL..       
78c0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
78d0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
78e0: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
78f0: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
7900: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a  >a[iCol].pExpr;.
7910: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53            sNC.pS
7920: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
7930: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  c;.          sNC
7940: 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  .pNext = 0;.    
7950: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
7960: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
7970: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
7980: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
7990: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62  C, p, &zOriginDb
79a0: 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26  , &zOriginTab, &
79b0: 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20  zOriginCol); .  
79c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
79d0: 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 70 53  lse if( pTab->pS
79e0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
79f0: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
7a00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
7a10: 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20  rt( !pS );.     
7a20: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
7a30: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
7a40: 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ey;.        asse
7a50: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
7a60: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
7a70: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
7a80: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
7a90: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
7aa0: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
7ab0: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  ";.          zOr
7ac0: 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f 77 69 64  iginCol = "rowid
7ad0: 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
7ae0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
7af0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
7b00: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
7b10: 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c        zOriginCol
7b20: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
7b30: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
7b40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72     }.        zOr
7b50: 69 67 69 6e 54 61 62 20 3d 20 70 54 61 62 2d 3e  iginTab = pTab->
7b60: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
7b70: 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29  f( pNC->pParse )
7b80: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
7b90: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
7ba0: 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e  emaToIndex(pNC->
7bb0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
7bc0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
7bd0: 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 44 62 20        zOriginDb 
7be0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pNC->pParse->d
7bf0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
7c00: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
7c10: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7c20: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
7c30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
7c40: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
7c50: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
7c60: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
7c70: 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  on is a sub-sele
7c80: 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  ct. Return the d
7c90: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
7ca0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69  and.      ** ori
7cb0: 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65  gin info for the
7cc0: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69   single column i
7cd0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
7ce0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
7cf0: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
7d00: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
7d10: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
7d20: 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  C;.      Select 
7d30: 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 70 53 65  *pS = pExpr->pSe
7d40: 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72  lect;.      Expr
7d50: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
7d60: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
7d70: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
7d80: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
7d90: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
7da0: 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50  NC;.      sNC.pP
7db0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
7dc0: 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20  se;.      zType 
7dd0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
7de0: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62  C, p, &zOriginDb
7df0: 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26  , &zOriginTab, &
7e00: 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20  zOriginCol); .  
7e10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7e20: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20  .#endif.  }.  . 
7e30: 20 69 66 28 20 70 7a 4f 72 69 67 69 6e 44 62 20   if( pzOriginDb 
7e40: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
7e50: 7a 4f 72 69 67 69 6e 54 61 62 20 26 26 20 70 7a  zOriginTab && pz
7e60: 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20  OriginCol );.   
7e70: 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a   *pzOriginDb = z
7e80: 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70  OriginDb;.    *p
7e90: 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72  zOriginTab = zOr
7ea0: 69 67 69 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a  iginTab;.    *pz
7eb0: 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69  OriginCol = zOri
7ec0: 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65  ginCol;.  }.  re
7ed0: 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f  turn zType;.}../
7ee0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
7ef0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
7f00: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64  l the VDBE the d
7f10: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73  eclaration types
7f20: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
7f30: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
7f40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7f50: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
7f60: 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ypes(.  Parse *p
7f70: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
7f80: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
7f90: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
7fa0: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
7fb0: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
7fc0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
7fd0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
7fe0: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
7ff0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20  sult set */.){. 
8000: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
8010: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
8020: 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
8030: 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63   sNC;.  sNC.pSrc
8040: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
8050: 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
8060: 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d  pParse;.  for(i=
8070: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
8080: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
8090: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
80a0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
80b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
80c0: 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  gDb = 0;.    con
80d0: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61  st char *zOrigTa
80e0: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
80f0: 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20   char *zOrigCol 
8100: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
8110: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 63 6f 6c  har *zType = col
8120: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
8130: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
8140: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29  gTab, &zOrigCol)
8150: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64  ;..    /* The vd
8160: 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73  be must make its
8170: 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65   own copy of the
8180: 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64   column-type and
8190: 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63   other .    ** c
81a0: 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73  olumn specific s
81b0: 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20  trings, in case 
81c0: 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65  the schema is re
81d0: 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a  set before this.
81e0: 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d      ** virtual m
81f0: 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65  achine is delete
8200: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
8210: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8220: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8230: 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70  E_DECLTYPE, zTyp
8240: 65 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29  e, P4_TRANSIENT)
8250: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8260: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8270: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41  , COLNAME_DATABA
8280: 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 50 34 5f  SE, zOrigDb, P4_
8290: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
82a0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
82b0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
82c0: 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67  AME_TABLE, zOrig
82d0: 54 61 62 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e  Tab, P4_TRANSIEN
82e0: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
82f0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8300: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55   i, COLNAME_COLU
8310: 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 50 34  MN, zOrigCol, P4
8320: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
8330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
8340: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
8350: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
8360: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
8370: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
8380: 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73  esult set.  This
8390: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
83a0: 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  used to provide 
83b0: 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76  the.** azCol[] v
83c0: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c  alues in the cal
83d0: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
83e0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
83f0: 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72  lumnNames(.  Par
8400: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8410: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
8420: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
8430: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
8440: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
8450: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
8460: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
8470: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
8480: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
8490: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
84a0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
84b0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c   int i, j;.  sql
84c0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
84d0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
84e0: 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d  lNames, shortNam
84f0: 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  es;..#ifndef SQL
8500: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
8510: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
8520: 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69   an EXPLAIN, ski
8530: 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20  p this step */. 
8540: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
8550: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75  lain ){.    retu
8560: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
8570: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
8580: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
8590: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76  colNamesSet || v
85a0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
85b0: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
85c0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  ;.  pParse->colN
85d0: 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66  amesSet = 1;.  f
85e0: 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e  ullNames = (db->
85f0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
8600: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ullColNames)!=0;
8610: 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20  .  shortNames = 
8620: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
8630: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
8640: 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  s)!=0;.  sqlite3
8650: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
8660: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
8670: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
8680: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
8690: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
86a0: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
86b0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
86c0: 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74   if( p==0 ) cont
86d0: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45  inue;.    if( pE
86e0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
86f0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
8700: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
8710: 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
8720: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8730: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8740: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
8750: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
8760: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
8770: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
8780: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
8790: 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b  N && pTabList ){
87a0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
87b0: 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ab;.      char *
87c0: 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  zCol;.      int 
87d0: 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  iCol = p->iColum
87e0: 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  n;.      for(j=0
87f0: 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; j<pTabList->nS
8800: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
8810: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d  a[j].iCursor!=p-
8820: 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a  >iTable; j++){}.
8830: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
8840: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
8850: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
8860: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
8870: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  ab;.      if( iC
8880: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
8890: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
88a0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
88b0: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
88c0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
88d0: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ) );.      if( i
88e0: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
88f0: 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b   zCol = "rowid";
8900: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8910: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61        zCol = pTa
8920: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
8930: 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
8940: 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d     if( !shortNam
8950: 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73  es && !fullNames
8960: 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26   && p->span.z &&
8970: 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b   p->span.z[0] ){
8980: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8990: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
89a0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
89b0: 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61  E, (char*)p->spa
89c0: 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b  n.z, p->span.n);
89d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
89e0: 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21   fullNames || (!
89f0: 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70 54  shortNames && pT
8a00: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20  abList->nSrc>1) 
8a10: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
8a20: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  *zName = 0;.    
8a30: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a      char *zTab;.
8a40: 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d   .        zTab =
8a50: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
8a60: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
8a70: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c  if( fullNames ||
8a80: 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20   zTab==0 ) zTab 
8a90: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
8aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
8ab0: 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20  tString(&zName, 
8ac0: 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c  zTab, ".", zCol,
8ad0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
8ae0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8af0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8b00: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
8b10: 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  ame, P4_DYNAMIC)
8b20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8b30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8b40: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8b50: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
8b60: 20 7a 43 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43   zCol, strlen(zC
8b70: 6f 6c 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ol));.      }.  
8b80: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73    }else if( p->s
8b90: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
8ba0: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73  .z[0] ){.      s
8bb0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8bc0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8bd0: 4d 45 5f 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29  ME_NAME, (char*)
8be0: 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70  p->span.z, p->sp
8bf0: 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 2f 2a 20  an.n);.      /* 
8c00: 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 70 72  sqlite3VdbeCompr
8c10: 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64 72  essSpace(v, addr
8c20: 29 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  ); */.    }else{
8c30: 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d  .      char zNam
8c40: 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73  e[30];.      ass
8c50: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43  ert( p->op!=TK_C
8c60: 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73  OLUMN || pTabLis
8c70: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  t==0 );.      sq
8c80: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
8c90: 69 7a 65 6f 66 28 7a 4e 61 6d 65 29 2c 20 7a 4e  izeof(zName), zN
8ca0: 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c  ame, "column%d",
8cb0: 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c   i+1);.      sql
8cc0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
8cd0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
8ce0: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 30 29  _NAME, zName, 0)
8cf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65  ;.    }.  }.  ge
8d00: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
8d10: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
8d20: 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a  st, pEList);.}..
8d30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8d40: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
8d50: 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f  ECT./*.** Name o
8d60: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
8d70: 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20   operator, used 
8d80: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
8d90: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
8da0: 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74  nst char *select
8db0: 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a  OpName(int id){.
8dc0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69    char *z;.  swi
8dd0: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63  tch( id ){.    c
8de0: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
8df0: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c    z = "UNION ALL
8e00: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
8e10: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
8e20: 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43  T: z = "INTERSEC
8e30: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
8e40: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
8e50: 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22      z = "EXCEPT"
8e60: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
8e70: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
8e80: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22       z = "UNION"
8e90: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
8ea0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
8eb0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8ec0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
8ed0: 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SELECT */../*.**
8ee0: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
8ef0: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tion.*/.static i
8f00: 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d  nt prepSelectStm
8f10: 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63 74  t(Parse*, Select
8f20: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  *);../*.** Given
8f30: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
8f40: 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ent, generate a 
8f50: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
8f60: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a  that describes.*
8f70: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
8f80: 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e   of that SELECT.
8f90: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
8fa0: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
8fb0: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
8fc0: 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d  e, char *zTabNam
8fd0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
8fe0: 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ct){.  Table *pT
8ff0: 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ab;.  int i, j;.
9000: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
9010: 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43  st;.  Column *aC
9020: 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c  ol, *pCol;.  sql
9030: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9040: 65 2d 3e 64 62 3b 0a 0a 20 20 77 68 69 6c 65 28  e->db;..  while(
9050: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
9060: 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65   ) pSelect = pSe
9070: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
9080: 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74  if( prepSelectSt
9090: 6d 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  mt(pParse, pSele
90a0: 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ct) ){.    retur
90b0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 0;.  }.  if( s
90c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f  qlite3SelectReso
90d0: 6c 76 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c  lve(pParse, pSel
90e0: 65 63 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  ect, 0) ){.    r
90f0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
9100: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
9110: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
9120: 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
9130: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
9140: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
9150: 7d 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d  }.  pTab->nRef =
9160: 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d   1;.  pTab->zNam
9170: 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73  e = zTabName ? s
9180: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
9190: 62 2c 20 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30  b, zTabName) : 0
91a0: 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  ;.  pEList = pSe
91b0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
91c0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c  pTab->nCol = pEL
91d0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73  ist->nExpr;.  as
91e0: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
91f0: 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43  >0 );.  pTab->aC
9200: 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69  ol = aCol = sqli
9210: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
9220: 64 62 2c 20 73 69 7a 65 6f 66 28 70 54 61 62 2d  db, sizeof(pTab-
9230: 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e  >aCol[0])*pTab->
9240: 6e 43 6f 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30  nCol);.  for(i=0
9250: 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70  , pCol=aCol; i<p
9260: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  Tab->nCol; i++, 
9270: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 45 78 70  pCol++){.    Exp
9280: 72 20 2a 70 2c 20 2a 70 52 3b 0a 20 20 20 20 63  r *p, *pR;.    c
9290: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20  har *zType;.    
92a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
92b0: 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20   int nName;.    
92c0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
92d0: 20 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20      int cnt;.   
92e0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
92f0: 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 47 65  ;.    .    /* Ge
9300: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
9310: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f   name for the co
9320: 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lumn.    */.    
9330: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
9340: 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
9350: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
9360: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74   || p->pRight->t
9370: 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e  oken.z==0 || p->
9380: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b  pRight->token.z[
9390: 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  0]!=0 );.    if(
93a0: 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
93b0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
93c0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
93d0: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
93e0: 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65  ins an "AS <name
93f0: 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c  >" phrase, use <
9400: 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d  name> as the nam
9410: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
9420: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
9430: 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  up(db, zName);. 
9440: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
9450: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20  op==TK_DOT .    
9460: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 52            && (pR
9470: 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30 20 26  =p->pRight)!=0 &
9480: 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26  & pR->token.z &&
9490: 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20   pR->token.z[0] 
94a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
94b0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 66  columns of the f
94c0: 72 6f 6d 20 41 2e 42 20 75 73 65 20 42 20 61 73  rom A.B use B as
94d0: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
94e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
94f0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
9500: 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b  T", &pR->token);
9510: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
9520: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
9530: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
9540: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69    /* Use the ori
9550: 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68  ginal text of th
9560: 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  e column express
9570: 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20  ion as its name 
9580: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
9590: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
95a0: 64 62 2c 20 22 25 54 22 2c 20 26 70 2d 3e 73 70  db, "%T", &p->sp
95b0: 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  an);.    }else{.
95c0: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
95d0: 65 6c 73 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65  else fails, make
95e0: 20 75 70 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20   up a name */.  
95f0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
9600: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
9610: 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b  column%d", i+1);
9620: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
9630: 7a 4e 61 6d 65 20 7c 7c 20 64 62 2d 3e 6d 61 6c  zName || db->mal
9640: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
9650: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
9660: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  led = 1;.      s
9670: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
9680: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
9690: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 54 61  3DeleteTable(pTa
96a0: 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  b);.      return
96b0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
96c0: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
96d0: 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  me);..    /* Mak
96e0: 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d  e sure the colum
96f0: 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65  n name is unique
9700: 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69  .  If the name i
9710: 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20  s not unique,.  
9720: 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e    ** append a in
9730: 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d  teger to the nam
9740: 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63  e so that it bec
9750: 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20  omes unique..   
9760: 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20   */.    nName = 
9770: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
9780: 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20     for(j=cnt=0; 
9790: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
97a0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
97b0: 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  Cmp(aCol[j].zNam
97c0: 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  e, zName)==0 ){.
97d0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e          zName[nN
97e0: 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ame] = 0;.      
97f0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
9800: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a  3MPrintf(db, "%z
9810: 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  :%d", zName, ++c
9820: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  nt);.        j =
9830: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28   -1;.        if(
9840: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61   zName==0 ) brea
9850: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
9860: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  .    pCol->zName
9870: 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f   = zName;..    /
9880: 2a 20 47 65 74 20 74 68 65 20 74 79 70 65 6e 61  * Get the typena
9890: 6d 65 2c 20 74 79 70 65 20 61 66 66 69 6e 69 74  me, type affinit
98a0: 79 2c 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  y, and collating
98b0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
98c0: 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e  e.    ** column.
98d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
98e0: 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
98f0: 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
9900: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65  C.pSrcList = pSe
9910: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20  lect->pSrc;.    
9920: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44  zType = sqlite3D
9930: 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75  bStrDup(db, colu
9940: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
9950: 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70  0, 0, 0));.    p
9960: 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a 54 79  Col->zType = zTy
9970: 70 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  pe;.    pCol->af
9980: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
9990: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
99a0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
99b0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
99c0: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
99d0: 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
99e0: 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d     pCol->zColl =
99f0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
9a00: 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  (db, pColl->zNam
9a10: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
9a20: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
9a30: 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  ;.  return pTab;
9a40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
9a50: 65 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  e a SELECT state
9a60: 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73  ment for process
9a70: 69 6e 67 20 62 79 20 64 6f 69 6e 67 20 74 68 65  ing by doing the
9a80: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68   following.** th
9a90: 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ings:.**.**    (
9aa0: 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44  1)  Make sure VD
9ab0: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
9ac0: 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
9ad0: 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a  gned to every.**
9ae0: 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74           element
9af0: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
9b00: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  use..**.**    (2
9b10: 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  )  Fill in the p
9b20: 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61  TabList->a[].pTa
9b30: 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  b fields in the 
9b40: 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a  SrcList that .**
9b50: 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73           defines
9b60: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57   FROM clause.  W
9b70: 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72  hen views appear
9b80: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
9b90: 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  use,.**         
9ba0: 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61  fill pTabList->a
9bb0: 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20  [].pSelect with 
9bc0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
9bd0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
9be0: 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69  *         that i
9bf0: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
9c00: 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d  ew.  A copy is m
9c10: 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27  ade of the view'
9c20: 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  s SELECT.**     
9c30: 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f      statement so
9c40: 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65   that we can fre
9c50: 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65  ely modify or de
9c60: 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  lete that statem
9c70: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  ent.**         w
9c80: 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20  ithout worrying 
9c90: 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70  about messing up
9ca0: 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20   the presistent 
9cb0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a  representation.*
9cc0: 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  *         of the
9cd0: 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   view..**.**    
9ce0: 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74  (3)  Add terms t
9cf0: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
9d00: 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65  se to accomodate
9d10: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
9d20: 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
9d30: 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65  on joins and the
9d40: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
9d50: 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a  ause of joins..*
9d60: 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61  *.**    (4)  Sca
9d70: 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
9d80: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
9d90: 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29  ult set (pEList)
9da0: 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   looking.**     
9db0: 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65      for instance
9dc0: 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65  s of the "*" ope
9dd0: 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42  rator or the TAB
9de0: 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LE.* operator..*
9df0: 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75  *         If fou
9e00: 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20  nd, expand each 
9e10: 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20  "*" to be every 
9e20: 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20  column in every 
9e30: 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
9e40: 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20   and TABLE.* to 
9e50: 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
9e60: 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  in TABLE..**.** 
9e70: 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63  Return 0 on succ
9e80: 65 73 73 2e 20 20 49 66 20 74 68 65 72 65 20 61  ess.  If there a
9e90: 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61  re problems, lea
9ea0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
9eb0: 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65  age.** in pParse
9ec0: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
9ed0: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
9ee0: 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53 74  int prepSelectSt
9ef0: 6d 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mt(Parse *pParse
9f00: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
9f10: 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b  int i, j, k, rc;
9f20: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
9f30: 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  List;.  ExprList
9f40: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75   *pEList;.  stru
9f50: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
9f60: 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65  *pFrom;.  sqlite
9f70: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9f80: 64 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20  db;..  if( p==0 
9f90: 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c  || p->pSrc==0 ||
9fa0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9fb0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
9fc0: 31 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73  1;.  }.  pTabLis
9fd0: 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
9fe0: 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
9ff0: 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  t;..  /* Make su
a000: 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  re cursor number
a010: 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
a020: 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72  gned to all entr
a030: 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  ies in.  ** the 
a040: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
a050: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
a060: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ent..  */.  sqli
a070: 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
a080: 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
a090: 70 2d 3e 70 53 72 63 29 3b 0a 0a 20 20 2f 2a 20  p->pSrc);..  /* 
a0a0: 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61  Look up every ta
a0b0: 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65  ble named in the
a0c0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
a0d0: 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a  the select.  If.
a0e0: 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66    ** an entry of
a0f0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
a100: 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69   is a subquery i
a110: 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c  nstead of a tabl
a120: 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20  e or view,.  ** 
a130: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72  then create a tr
a140: 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74  ansient table st
a150: 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72  ructure to descr
a160: 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ibe the subquery
a170: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
a180: 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
a190: 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
a1a0: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
a1b0: 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
a1c0: 2a 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  *pTab;.    if( p
a1d0: 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b  From->pTab!=0 ){
a1e0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
a1f0: 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72  tatement has alr
a200: 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72  eady been prepar
a210: 65 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ed.  There is no
a220: 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74   need.      ** t
a230: 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f  o go further. */
a240: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
a250: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  ==0 );.      ret
a260: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
a270: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d   if( pFrom->zNam
a280: 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  e==0 ){.#ifndef 
a290: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
a2a0: 55 45 52 59 0a 20 20 20 20 20 20 2f 2a 20 41 20  UERY.      /* A 
a2b0: 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
a2c0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
a2d0: 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
a2e0: 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
a2f0: 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20  >pSelect!=0 );. 
a300: 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e       if( pFrom->
a310: 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20  zAlias==0 ){.   
a320: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69       pFrom->zAli
a330: 61 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73  as =.          s
a340: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
a350: 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65  , "sqlite_subque
a360: 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29  ry_%p_", (void*)
a370: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
a380: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
a390: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
a3a0: 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
a3b0: 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
a3c0: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
a3d0: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
a3e0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 46  elect(pParse, pF
a3f0: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70 46 72  rom->zAlias, pFr
a400: 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  om->pSelect);.  
a410: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
a420: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
a430: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
a440: 20 20 20 2f 2a 20 54 68 65 20 69 73 45 70 68 65     /* The isEphe
a450: 6d 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  m flag indicates
a460: 20 74 68 61 74 20 74 68 65 20 54 61 62 6c 65 20   that the Table 
a470: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 62 65  structure has be
a480: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e 61  en.      ** dyna
a490: 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
a4a0: 64 20 61 6e 64 20 6d 61 79 20 62 65 20 66 72 65  d and may be fre
a4b0: 65 64 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 20  ed at any time. 
a4c0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
a4d0: 0a 20 20 20 20 20 20 2a 2a 20 70 54 61 62 20 69  .      ** pTab i
a4e0: 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74  s not pointing t
a4f0: 6f 20 61 20 70 65 72 73 69 73 74 65 6e 74 20 74  o a persistent t
a500: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
a510: 68 61 74 20 64 65 66 69 6e 65 73 0a 20 20 20 20  hat defines.    
a520: 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65    ** part of the
a530: 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20   schema. */.    
a540: 20 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20    pTab->isEphem 
a550: 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 1;.#endif.    
a560: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
a570: 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
a580: 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
a590: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
a5a0: 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
a5b0: 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
a5c0: 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
a5d0: 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
a5e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a5f0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
a600: 73 65 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c  se,pFrom->zName,
a610: 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pFrom->zDatabase
a620: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
a630: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
a640: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
a650: 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  }.      pTab->nR
a660: 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e  ef++;.#if !defin
a670: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
a680: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
a690: 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49   (SQLITE_OMIT_VI
a6a0: 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20  RTUALTABLE).    
a6b0: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
a6c0: 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  ect || IsVirtual
a6d0: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
a6e0: 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65    /* We reach he
a6f0: 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  re if the named 
a700: 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c  table is a reall
a710: 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  y a view */.    
a720: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
a730: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
a740: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
a750: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
a760: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
a770: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70  .        /* If p
a780: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30  From->pSelect!=0
a790: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
a7a0: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a   dealing with a.
a7b0: 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20          ** view 
a7c0: 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20  within a view.  
a7d0: 54 68 65 20 53 45 4c 45 43 54 20 73 74 72 75 63  The SELECT struc
a7e0: 74 75 72 65 20 68 61 73 20 61 6c 72 65 61 64 79  ture has already
a7f0: 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   been.        **
a800: 20 63 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f   copied by the o
a810: 75 74 65 72 20 76 69 65 77 20 73 6f 20 77 65 20  uter view so we 
a820: 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70  can skip the cop
a830: 79 20 73 74 65 70 20 68 65 72 65 0a 20 20 20 20  y step here.    
a840: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
a850: 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20  ner view..      
a860: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
a870: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d   pFrom->pSelect=
a880: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a890: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
a8a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
a8b0: 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c  p(db, pTab->pSel
a8c0: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ect);.        }.
a8d0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
a8e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
a8f0: 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b  rocess NATURAL k
a900: 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20  eywords, and ON 
a910: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
a920: 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f  s of joins..  */
a930: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f  .  if( sqlitePro
a940: 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
a950: 20 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   p) ) return 1;.
a960: 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
a970: 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
a980: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
a990: 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
a9a0: 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
a9b0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
a9c0: 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
a9d0: 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
a9e0: 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
a9f0: 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
aa00: 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
aa10: 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
aa20: 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
aa30: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
aa40: 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65  h the TK_ALL ope
aa50: 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
aa60: 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
aa70: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
aa80: 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ist..  ** The fo
aa90: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
aaa0: 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
aab0: 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65  the TK_ALL expre
aac0: 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
aad0: 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20  d.  ** each one 
aae0: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
aaf0: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
ab00: 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
ab10: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
ab20: 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
ab30: 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
ab40: 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
ab50: 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
ab60: 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
ab70: 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
ab80: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
ab90: 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  k++){.    Expr *
aba0: 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
abb0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
abc0: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   pE->op==TK_ALL 
abd0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
abe0: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
abf0: 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26  && pE->pRight &&
ac00: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
ac10: 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20  =TK_ALL.        
ac20: 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26   && pE->pLeft &&
ac30: 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
ac40: 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20  TK_ID ) break;. 
ac50: 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69   }.  rc = 0;.  i
ac60: 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
ac70: 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
ac80: 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
ac90: 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
aca0: 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
acb0: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
acc0: 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
acd0: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
ace0: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
acf0: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
ad00: 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
ad10: 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
ad20: 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
ad30: 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
ad40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
ad50: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
ad60: 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
ad70: 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
ad80: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
ad90: 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65  t flags = pParse
ada0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ->db->flags;.   
adb0: 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d   int longNames =
adc0: 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
add0: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
ade0: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
adf0: 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67             (flag
ae00: 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
ae10: 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20  ColNames)==0;.. 
ae20: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
ae30: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
ae40: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
ae50: 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
ae60: 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
ae70: 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20  !=TK_ALL &&.    
ae80: 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d         (pE->op!=
ae90: 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
aea0: 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70  ight==0 || pE->p
aeb0: 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  Right->op!=TK_AL
aec0: 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  L) ){.        /*
aed0: 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
aee0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
aef0: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
af00: 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20  expanded..      
af10: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
af20: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
af30: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
af40: 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  , pNew, a[k].pEx
af50: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
af60: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
af70: 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
af80: 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
af90: 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
afa0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
afb0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
afc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
afd0: 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
afe0: 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d   0;.        a[k]
aff0: 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
b000: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b010: 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
b020: 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
b030: 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
b040: 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
b050: 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
b060: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
b070: 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
b080: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
b090: 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
b0a0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
b0b0: 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20  ar *zTName;     
b0c0: 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
b0d0: 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
b0e0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
b0f0: 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
b100: 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20   pE->pLeft ){.  
b110: 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
b120: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
b130: 54 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d 3e 70  Token(db, &pE->p
b140: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  Left->token);.  
b150: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b160: 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
b170: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
b180: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46       for(i=0, pF
b190: 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
b1a0: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
b1b0: 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
b1c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
b1d0: 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
b1e0: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
b1f0: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
b200: 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
b210: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
b220: 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54  TabName==0 || zT
b230: 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20  abName[0]==0 ){ 
b240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61  .            zTa
b250: 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
b260: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ame;.          }
b270: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
b280: 54 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e 61  TName && (zTabNa
b290: 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d  me==0 || zTabNam
b2a0: 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20  e[0]==0 || .    
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
b2c0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61  ite3StrICmp(zTNa
b2d0: 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30  me, zTabName)!=0
b2e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
b2f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
b300: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b310: 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
b320: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
b330: 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
b340: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
b350: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20     Expr *pExpr, 
b360: 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  *pRight;.       
b370: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
b380: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
b390: 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20  .zName;..       
b3a0: 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c       /* If a col
b3b0: 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73  umn is marked as
b3c0: 20 27 68 69 64 64 65 6e 27 20 28 63 75 72 72 65   'hidden' (curre
b3d0: 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62  ntly only possib
b3e0: 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
b3f0: 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61  * for virtual ta
b400: 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e  bles), do not in
b410: 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20  clude it in the 
b420: 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20  expanded.       
b430: 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73       ** result-s
b440: 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20  et list..       
b450: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
b460: 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e      if( IsHidden
b470: 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
b480: 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ol[j]) ){.      
b490: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 49          assert(I
b4a0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b  sVirtual(pTab));
b4b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
b4c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
b4d0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
b4e0: 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20      if( i>0 ){. 
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
b500: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
b510: 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c   *pLeft = &pTabL
b520: 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20  ist->a[i-1];.   
b530: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
b540: 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70  pLeft[1].jointyp
b550: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
b560: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
b570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
b580: 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d  lumnIndex(pLeft-
b590: 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30  >pTab, zName)>=0
b5a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b5b0: 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
b5c0: 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
b5d0: 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
b5e0: 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
b5f0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
b600: 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  le on the right 
b610: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
b620: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
b630: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
b640: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
b650: 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
b660: 78 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73 69 6e  x(pLeft[1].pUsin
b670: 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
b680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b690: 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
b6a0: 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
b6b0: 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
b6c0: 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
b6d0: 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
b6e0: 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
b6f0: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
b700: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
b710: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
b730: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
b740: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
b750: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
b760: 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30  pParse, TK_ID, 0
b770: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
b780: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 3d       if( pRight=
b790: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
b7a0: 20 20 20 20 20 20 20 20 73 65 74 51 75 6f 74 65          setQuote
b7b0: 64 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26  dToken(pParse, &
b7c0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a  pRight->token, z
b7d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
b7e0: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20     if( zTabName 
b7f0: 26 26 20 28 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  && (longNames ||
b800: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
b810: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
b820: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
b830: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
b840: 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c  Parse, TK_ID, 0,
b850: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
b860: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
b870: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
b880: 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
b890: 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  , pRight, 0);.  
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
b8b0: 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b  pExpr==0 ) break
b8c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b8d0: 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70  setQuotedToken(p
b8e0: 50 61 72 73 65 2c 20 26 70 4c 65 66 74 2d 3e 74  Parse, &pLeft->t
b8f0: 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b  oken, zTabName);
b900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
b910: 65 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e  etToken(&pExpr->
b920: 73 70 61 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  span, .         
b930: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b940: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
b950: 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  %s", zTabName, z
b960: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
b970: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
b980: 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20  n.dyn = 1;.     
b990: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
b9a0: 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20  token.z = 0;.   
b9b0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
b9c0: 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20  ->token.n = 0;. 
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
b9e0: 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20  pr->token.dyn = 
b9f0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
ba00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ba10: 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67      pExpr = pRig
ba20: 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
ba30: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20    pExpr->span = 
ba40: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pExpr->token;.  
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
ba60: 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 30 3b  r->span.dyn = 0;
ba70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
ba80: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
ba90: 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
baa0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
bab0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
bac0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
bad0: 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70 45 78  New, pExpr, &pEx
bae0: 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20  pr->span);.     
baf0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
bb10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
bb20: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
bb30: 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70   pNew, pExpr, &p
bb40: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  Right->token);. 
bb50: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
bb60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bb70: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
bb80: 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
bb90: 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
bba0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
bbb0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
bbc0: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
bbd0: 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54  h table: %s", zT
bbe0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
bbf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bc00: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
bc10: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
bc20: 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
bc30: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
bc40: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
bc50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bc60: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
bc70: 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  (zTName);.      
bc80: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
bc90: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
bca0: 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  e(pEList);.    p
bcb0: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
bcc0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45  .  }.  if( p->pE
bcd0: 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73  List && p->pELis
bce0: 74 2d 3e 6e 45 78 70 72 3e 53 51 4c 49 54 45 5f  t->nExpr>SQLITE_
bcf0: 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  MAX_COLUMN ){.  
bd00: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
bd10: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
bd20: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72  any columns in r
bd30: 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 20  esult set");.   
bd40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
bd50: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  OR;.  }.  if( db
bd60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
bd70: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
bd80: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
bd90: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
bda0: 2a 2a 20 70 45 20 69 73 20 61 20 70 6f 69 6e 74  ** pE is a point
bdb0: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
bdc0: 69 6f 6e 20 77 68 69 63 68 20 69 73 20 61 20 73  ion which is a s
bdd0: 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 0a 2a 2a  ingle term in.**
bde0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
bdf0: 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a  UP BY clause..**
be00: 0a 2a 2a 20 49 66 20 70 45 20 65 76 61 6c 75 61  .** If pE evalua
be10: 74 65 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  tes to an intege
be20: 72 20 63 6f 6e 73 74 61 6e 74 20 69 2c 20 74 68  r constant i, th
be30: 65 6e 20 72 65 74 75 72 6e 20 69 2e 0a 2a 2a 20  en return i..** 
be40: 54 68 69 73 20 69 73 20 61 6e 20 69 6e 64 69 63  This is an indic
be50: 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 61 6c  ation to the cal
be60: 6c 65 72 20 74 68 61 74 20 69 74 20 73 68 6f 75  ler that it shou
be70: 6c 64 20 73 6f 72 74 0a 2a 2a 20 62 79 20 74 68  ld sort.** by th
be80: 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e i-th column of
be90: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
bea0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 20 69 73 20  .**.** If pE is 
beb0: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 65 78  a well-formed ex
bec0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 74 68 65  pression and the
bed0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
bee0: 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 70  t.** is not comp
bef0: 6f 75 6e 64 2c 20 74 68 65 6e 20 72 65 74 75 72  ound, then retur
bf00: 6e 20 30 2e 20 20 54 68 69 73 20 69 6e 64 69 63  n 0.  This indic
bf10: 61 74 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ates to the.** c
bf20: 61 6c 6c 65 72 20 74 68 61 74 20 69 74 20 73 68  aller that it sh
bf30: 6f 75 6c 64 20 73 6f 72 74 20 62 79 20 74 68 65  ould sort by the
bf40: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4f 52   value of the OR
bf50: 44 45 52 20 42 59 0a 2a 2a 20 65 78 70 72 65 73  DER BY.** expres
bf60: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  sion..**.** If t
bf70: 68 65 20 53 45 4c 45 43 54 20 69 73 20 63 6f 6d  he SELECT is com
bf80: 70 6f 75 6e 64 2c 20 74 68 65 6e 20 61 74 74 65  pound, then atte
bf90: 6d 70 74 20 74 6f 20 6d 61 74 63 68 20 70 45 20  mpt to match pE 
bfa0: 61 67 61 69 6e 73 74 0a 2a 2a 20 72 65 73 75 6c  against.** resul
bfb0: 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  t set columns in
bfc0: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 53   the left-most S
bfd0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
bfe0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
bff0: 69 6e 64 65 78 20 69 20 6f 66 20 74 68 65 20 6d  index i of the m
c000: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20  atching column, 
c010: 61 73 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e  as an indication
c020: 20 74 6f 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c   to the .** call
c030: 65 72 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c  er that it shoul
c040: 64 20 73 6f 72 74 20 62 79 20 74 68 65 20 69 2d  d sort by the i-
c050: 74 68 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 20 74  th column.  If t
c060: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 6d 61  here is.** no ma
c070: 74 63 68 2c 20 72 65 74 75 72 6e 20 2d 31 20 61  tch, return -1 a
c080: 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
c090: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
c0a0: 72 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rse..*/.static i
c0b0: 6e 74 20 6d 61 74 63 68 4f 72 64 65 72 42 79 54  nt matchOrderByT
c0c0: 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 0a 20  ermToExprList(. 
c0d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c0e0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
c0f0: 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72  ontext for error
c100: 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53   messages */.  S
c110: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
c120: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
c130: 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20 74  statement with t
c140: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
c150: 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  se */.  Expr *pE
c160: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
c170: 65 20 73 70 65 63 69 66 69 63 20 4f 52 44 45 52  e specific ORDER
c180: 20 42 59 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e   BY term */.  in
c190: 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  t idx,          
c1a0: 20 2f 2a 20 57 68 65 6e 20 4f 52 44 45 52 20 42   /* When ORDER B
c1b0: 59 20 74 65 72 6d 20 69 73 20 74 68 69 73 20 2a  Y term is this *
c1c0: 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6f 75  /.  int isCompou
c1d0: 6e 64 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 69  nd,    /* True i
c1e0: 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 70  f this is a comp
c1f0: 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ound SELECT */. 
c200: 20 75 38 20 2a 70 48 61 73 41 67 67 20 20 20 20   u8 *pHasAgg    
c210: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65      /* True if e
c220: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
c230: 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ns aggregate fun
c240: 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69  ctions */.){.  i
c250: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
c260: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
c270: 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  r */.  ExprList 
c280: 2a 70 45 4c 69 73 74 3b 20 20 2f 2a 20 54 68 65  *pEList;  /* The
c290: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
c2a0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
c2b0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 6e 63 3b 20  NameContext nc; 
c2c0: 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
c2d0: 78 74 20 66 6f 72 20 72 65 73 6f 6c 76 69 6e 67  xt for resolving
c2e0: 20 70 45 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 49 66   pE */...  /* If
c2f0: 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 6e 20   the term is an 
c300: 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
c310: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c  , return the val
c320: 75 65 20 6f 66 20 74 68 61 74 0a 20 20 2a 2a 20  ue of that.  ** 
c330: 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 70 45  constant */.  pE
c340: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
c350: 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71  pEList;.  if( sq
c360: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
c370: 65 72 28 70 45 2c 20 26 69 29 20 29 7b 0a 20 20  er(pE, &i) ){.  
c380: 20 20 69 66 28 20 69 3c 3d 30 20 29 7b 0a 20 20    if( i<=0 ){.  
c390: 20 20 20 20 2f 2a 20 49 66 20 69 20 69 73 20 74      /* If i is t
c3a0: 6f 6f 20 73 6d 61 6c 6c 2c 20 6d 61 6b 65 20 69  oo small, make i
c3b0: 74 20 74 6f 6f 20 62 69 67 2e 20 20 54 68 61 74  t too big.  That
c3c0: 20 77 61 79 20 74 68 65 20 63 61 6c 6c 69 6e 67   way the calling
c3d0: 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
c3e0: 6f 6e 20 73 74 69 6c 6c 20 73 65 65 73 20 61 20  on still sees a 
c3f0: 76 61 6c 75 65 20 74 68 61 74 20 69 73 20 6f 75  value that is ou
c400: 74 20 6f 66 20 72 61 6e 67 65 2c 20 62 75 74 20  t of range, but 
c410: 64 6f 65 73 0a 20 20 20 20 20 20 2a 2a 20 6e 6f  does.      ** no
c420: 74 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 6f  t confuse the co
c430: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68  lumn number with
c440: 20 30 20 6f 72 20 2d 31 20 72 65 73 75 6c 74 20   0 or -1 result 
c450: 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  code..      */. 
c460: 20 20 20 20 20 69 20 3d 20 70 45 4c 69 73 74 2d       i = pEList-
c470: 3e 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 7d 0a  >nExpr+1;.    }.
c480: 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20      return i;.  
c490: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74  }..  /* If the t
c4a0: 65 72 6d 20 69 73 20 61 20 73 69 6d 70 6c 65 20  erm is a simple 
c4b0: 69 64 65 6e 74 69 66 69 65 72 20 74 68 61 74 20  identifier that 
c4c0: 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 61  try to match tha
c4d0: 74 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 2a  t identifier.  *
c4e0: 2a 20 61 67 61 69 6e 73 74 20 61 20 63 6f 6c 75  * against a colu
c4f0: 6d 6e 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 72  mn name in the r
c500: 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  esult set..  */.
c510: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
c520: 5f 49 44 20 7c 7c 20 28 70 45 2d 3e 6f 70 3d 3d  _ID || (pE->op==
c530: 54 4b 5f 53 54 52 49 4e 47 20 26 26 20 70 45 2d  TK_STRING && pE-
c540: 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 27 5c 27  >token.z[0]!='\'
c550: 27 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ') ){.    sqlite
c560: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
c570: 64 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  db;.    char *zC
c580: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ol = sqlite3Name
c590: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26 70  FromToken(db, &p
c5a0: 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 69  E->token);.    i
c5b0: 66 28 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  f( zCol==0 ){.  
c5c0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
c5d0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
c5e0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
c5f0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  r; i++){.      c
c600: 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73  har *zAs = pELis
c610: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
c620: 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20       if( zAs!=0 
c630: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
c640: 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20  p(zAs, zCol)==0 
c650: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
c660: 65 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20  e3_free(zCol);. 
c670: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 2b         return i+
c680: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
c690: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
c6a0: 65 28 7a 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20  e(zCol);.  }..  
c6b0: 2f 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e  /* Resolve all n
c6c0: 61 6d 65 73 20 69 6e 20 74 68 65 20 4f 52 44 45  ames in the ORDE
c6d0: 52 20 42 59 20 74 65 72 6d 20 65 78 70 72 65 73  R BY term expres
c6e0: 73 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  sion.  */.  mems
c6f0: 65 74 28 26 6e 63 2c 20 30 2c 20 73 69 7a 65 6f  et(&nc, 0, sizeo
c700: 66 28 6e 63 29 29 3b 0a 20 20 6e 63 2e 70 50 61  f(nc));.  nc.pPa
c710: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
c720: 6e 63 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  nc.pSrcList = pS
c730: 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 6e  elect->pSrc;.  n
c740: 63 2e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  c.pEList = pELis
c750: 74 3b 0a 20 20 6e 63 2e 61 6c 6c 6f 77 41 67 67  t;.  nc.allowAgg
c760: 20 3d 20 31 3b 0a 20 20 6e 63 2e 6e 45 72 72 20   = 1;.  nc.nErr 
c770: 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
c780: 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
c790: 65 73 28 26 6e 63 2c 20 70 45 29 20 29 7b 0a 20  es(&nc, pE) ){. 
c7a0: 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e     if( isCompoun
c7b0: 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
c7c0: 65 33 45 72 72 6f 72 43 6c 65 61 72 28 70 50 61  e3ErrorClear(pPa
c7d0: 72 73 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  rse);.      retu
c7e0: 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rn 0;.    }else{
c7f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
c800: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
c810: 28 20 6e 63 2e 68 61 73 41 67 67 20 26 26 20 70  ( nc.hasAgg && p
c820: 48 61 73 41 67 67 20 29 7b 0a 20 20 20 20 2a 70  HasAgg ){.    *p
c830: 48 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a  HasAgg = 1;.  }.
c840: 0a 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 6d 70  .  /* For a comp
c850: 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 77 65 20  ound SELECT, we 
c860: 6e 65 65 64 20 74 6f 20 74 72 79 20 74 6f 20 6d  need to try to m
c870: 61 74 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  atch the ORDER B
c880: 59 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  Y.  ** expressio
c890: 6e 20 61 67 61 69 6e 73 74 20 61 6e 20 65 78 70  n against an exp
c8a0: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72  ression in the r
c8b0: 65 73 75 6c 74 20 73 65 74 0a 20 20 2a 2f 0a 20  esult set.  */. 
c8c0: 20 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64 20   if( isCompound 
c8d0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
c8e0: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
c8f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
c900: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
c910: 61 72 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  are(pEList->a[i]
c920: 2e 70 45 78 70 72 2c 20 70 45 29 20 29 7b 0a 20  .pExpr, pE) ){. 
c930: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 2b         return i+
c940: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
c950: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
c960: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  .}.../*.** Analy
c970: 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  ze and ORDER BY 
c980: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
c990: 73 65 20 69 6e 20 61 20 73 69 6d 70 6c 65 20 53  se in a simple S
c9a0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
c9b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
c9c0: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
c9d0: 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  seen..**.** Ever
c9e0: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  y term of the OR
c9f0: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
ca00: 42 59 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20  BY clause needs 
ca10: 74 6f 20 62 65 20 61 6e 0a 2a 2a 20 65 78 70 72  to be an.** expr
ca20: 65 73 73 69 6f 6e 2e 20 20 49 66 20 61 6e 79 20  ession.  If any 
ca30: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
ca40: 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   integer constan
ca50: 74 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 61 74 20  t, then.** that 
ca60: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
ca70: 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 63 6f  placed by the co
ca80: 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 2a 2a 20  rresponding .** 
ca90: 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
caa0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
cab0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
cac0: 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42  ocessOrderGroupB
cad0: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
cae0: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
caf0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20  rsing context.  
cb00: 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  Leave error mess
cb10: 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 53  ages here */.  S
cb20: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
cb30: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
cb40: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e  CT statement con
cb50: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6c 61 75  taining the clau
cb60: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
cb70: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
cb80: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72   The ORDER BY or
cb90: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
cba0: 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64   to be processed
cbb0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 72 64 65   */.  int isOrde
cbc0: 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31  r,          /* 1
cbd0: 20 66 6f 72 20 4f 52 44 45 52 20 42 59 2e 20 20   for ORDER BY.  
cbe0: 30 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 2a  0 for GROUP BY *
cbf0: 2f 0a 20 20 75 38 20 2a 70 48 61 73 41 67 67 20  /.  u8 *pHasAgg 
cc00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
cc10: 20 74 6f 20 54 52 55 45 20 69 66 20 61 6e 79 20   to TRUE if any 
cc20: 74 65 72 6d 20 63 6f 6e 74 61 69 6e 73 20 61 6e  term contains an
cc30: 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 29 7b   aggregate */.){
cc40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
cc50: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
cc60: 2d 3e 64 62 3b 0a 20 20 45 78 70 72 4c 69 73 74  ->db;.  ExprList
cc70: 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28   *pEList;..  if(
cc80: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72   pOrderBy==0 ) r
cc90: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
cca0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 53  OrderBy->nExpr>S
ccb0: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
ccc0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
ccd0: 61 72 20 2a 7a 54 79 70 65 20 3d 20 69 73 4f 72  ar *zType = isOr
cce0: 64 65 72 20 3f 20 22 4f 52 44 45 52 22 20 3a 20  der ? "ORDER" : 
ccf0: 22 47 52 4f 55 50 22 3b 0a 20 20 20 20 73 71 6c  "GROUP";.    sql
cd00: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
cd10: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74  rse, "too many t
cd20: 65 72 6d 73 20 69 6e 20 25 73 20 42 59 20 63 6c  erms in %s BY cl
cd30: 61 75 73 65 22 2c 20 7a 54 79 70 65 29 3b 0a 20  ause", zType);. 
cd40: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
cd50: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
cd60: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  ect->pEList;.  i
cd70: 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a  f( pEList==0 ){.
cd80: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
cd90: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
cda0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
cdb0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  i++){.    int iC
cdc0: 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  ol;.    Expr *pE
cdd0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
cde0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 43 6f  ].pExpr;.    iCo
cdf0: 6c 20 3d 20 6d 61 74 63 68 4f 72 64 65 72 42 79  l = matchOrderBy
ce00: 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 70  TermToExprList(p
ce10: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
ce20: 70 45 2c 20 69 2b 31 2c 20 30 2c 20 70 48 61 73  pE, i+1, 0, pHas
ce30: 41 67 67 29 3b 0a 20 20 20 20 69 66 28 20 69 43  Agg);.    if( iC
ce40: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 65  ol<0 ){.      re
ce50: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
ce60: 20 20 69 66 28 20 69 43 6f 6c 3e 70 45 4c 69 73    if( iCol>pELis
ce70: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
ce80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
ce90: 79 70 65 20 3d 20 69 73 4f 72 64 65 72 20 3f 20  ype = isOrder ? 
cea0: 22 4f 52 44 45 52 22 20 3a 20 22 47 52 4f 55 50  "ORDER" : "GROUP
ceb0: 22 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ";.      sqlite3
cec0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
ced0: 20 0a 20 20 20 20 20 20 20 20 20 22 25 72 20 25   .         "%r %
cee0: 73 20 42 59 20 74 65 72 6d 20 6f 75 74 20 6f 66  s BY term out of
cef0: 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20   range - should 
cf00: 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 22 62  be ".         "b
cf10: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22  etween 1 and %d"
cf20: 2c 20 69 2b 31 2c 20 7a 54 79 70 65 2c 20 70 45  , i+1, zType, pE
cf30: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
cf40: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
cf50: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
cf60: 3e 30 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  >0 ){.      Coll
cf70: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 45 2d  Seq *pColl = pE-
cf80: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 6e  >pColl;.      in
cf90: 74 20 66 6c 61 67 73 20 3d 20 70 45 2d 3e 66 6c  t flags = pE->fl
cfa0: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
cfb0: 61 74 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ate;.      sqlit
cfc0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 29  e3ExprDelete(pE)
cfd0: 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 73 71 6c  ;.      pE = sql
cfe0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
cff0: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31  pEList->a[iCol-1
d000: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
d010: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
d020: 45 78 70 72 20 3d 20 70 45 3b 0a 20 20 20 20 20  Expr = pE;.     
d030: 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 66 6c   if( pColl && fl
d040: 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ags ){.        p
d050: 45 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c  E->pColl = pColl
d060: 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 66 6c  ;.        pE->fl
d070: 61 67 73 20 7c 3d 20 66 6c 61 67 73 3b 0a 20 20  ags |= flags;.  
d080: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
d090: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
d0a0: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64  *.** Analyze and
d0b0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
d0c0: 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  UP BY clause in 
d0d0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
d0e0: 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  nt.  Return.** t
d0f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
d100: 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20  ors seen..**.** 
d110: 54 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 64  The processing d
d120: 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
d130: 72 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  r the SELECT is 
d140: 73 69 6d 70 6c 65 20 6f 72 20 63 6f 6d 70 6f 75  simple or compou
d150: 6e 64 2e 0a 2a 2a 20 46 6f 72 20 61 20 73 69 6d  nd..** For a sim
d160: 70 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ple SELECT state
d170: 6d 65 6e 74 2c 20 65 76 72 79 20 74 65 72 6d 20  ment, evry term 
d180: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
d190: 6f 72 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 63  or GROUP BY.** c
d1a0: 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 62  lause needs to b
d1b0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  e an expression.
d1c0: 20 20 49 66 20 61 6e 79 20 65 78 70 72 65 73 73    If any express
d1d0: 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65  ion is an intege
d1e0: 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 2c 20 74  r.** constant, t
d1f0: 68 65 6e 20 74 68 61 74 20 65 78 70 72 65 73 73  hen that express
d200: 69 6f 6e 20 69 73 20 72 65 70 6c 61 63 65 64 20  ion is replaced 
d210: 62 79 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  by the correspon
d220: 64 69 6e 67 20 0a 2a 2a 20 65 78 70 72 65 73 73  ding .** express
d230: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 72 65 73  ion from the res
d240: 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 46  ult set..**.** F
d250: 6f 72 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  or compound SELE
d260: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 65  CT statements, e
d270: 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
d280: 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 66 0a 2a  needs to be of.*
d290: 2a 20 74 79 70 65 20 54 4b 5f 43 4f 4c 55 4d 4e  * type TK_COLUMN
d2a0: 20 77 69 74 68 20 61 20 69 54 61 62 6c 65 20 76   with a iTable v
d2b0: 61 6c 75 65 20 61 73 20 67 69 76 65 6e 20 69 6e  alue as given in
d2c0: 20 74 68 65 20 34 74 68 20 70 61 72 61 6d 65 74   the 4th paramet
d2d0: 65 72 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 65 78  er..** If any ex
d2e0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69  pression is an i
d2f0: 6e 74 65 67 65 72 2c 20 74 68 61 74 20 62 65 63  nteger, that bec
d300: 6f 6d 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  omes the column 
d310: 6e 75 6d 62 65 72 2e 0a 2a 2a 20 4f 74 68 65 72  number..** Other
d320: 77 69 73 65 2c 20 6d 61 74 63 68 20 74 68 65 20  wise, match the 
d330: 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e  expression again
d340: 73 74 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  st result set co
d350: 6c 75 6d 6e 73 20 66 72 6f 6d 0a 2a 2a 20 74 68  lumns from.** th
d360: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45  e left-most SELE
d370: 43 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  CT..*/.static in
d380: 74 20 70 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e  t processCompoun
d390: 64 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  dOrderBy(.  Pars
d3a0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d3b0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d3c0: 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72  text.  Leave err
d3d0: 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65  or messages here
d3e0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
d3f0: 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54  elect,      /* T
d400: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
d410: 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ent containing t
d420: 68 65 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  he ORDER BY */. 
d430: 20 69 6e 74 20 69 54 61 62 6c 65 20 20 20 20 20   int iTable     
d440: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
d450: 20 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 6f   table for compo
d460: 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
d470: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
d480: 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  t i;.  ExprList 
d490: 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 45 78 70  *pOrderBy;.  Exp
d4a0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
d4b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
d4c0: 69 6e 74 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31  int moreToDo = 1
d4d0: 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  ;..  pOrderBy = 
d4e0: 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42  pSelect->pOrderB
d4f0: 79 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  y;.  if( pOrderB
d500: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y==0 ) return 0;
d510: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d  .  if( pOrderBy-
d520: 3e 6e 45 78 70 72 3e 53 51 4c 49 54 45 5f 4d 41  >nExpr>SQLITE_MA
d530: 58 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  X_COLUMN ){.    
d540: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d550: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
d560: 79 20 74 65 72 6d 73 20 69 6e 20 4f 52 44 45 52  y terms in ORDER
d570: 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20 20   BY clause");.  
d580: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
d590: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
d5a0: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  b;.  for(i=0; i<
d5b0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
d5c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4f 72 64 65   i++){.    pOrde
d5d0: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
d5e0: 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   0;.  }.  while(
d5f0: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
d600: 20 29 7b 0a 20 20 20 20 70 53 65 6c 65 63 74 20   ){.    pSelect 
d610: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
d620: 72 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  r;.  }.  while( 
d630: 70 53 65 6c 65 63 74 20 26 26 20 6d 6f 72 65 54  pSelect && moreT
d640: 6f 44 6f 20 29 7b 0a 20 20 20 20 6d 6f 72 65 54  oDo ){.    moreT
d650: 6f 44 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  oDo = 0;.    for
d660: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
d670: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
d680: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20       int iCol;. 
d690: 20 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20 2a       Expr *pE, *
d6a0: 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20  pDup;.      if( 
d6b0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
d6c0: 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  one ) continue;.
d6d0: 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72 64 65        pE = pOrde
d6e0: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
d6f0: 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71  .      pDup = sq
d700: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
d710: 20 70 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20   pE);.      if( 
d720: 70 44 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDup==0 ){.     
d730: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
d740: 20 20 20 7d 0a 20 20 20 20 20 20 69 43 6f 6c 20     }.      iCol 
d750: 3d 20 6d 61 74 63 68 4f 72 64 65 72 42 79 54 65  = matchOrderByTe
d760: 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 70 50 61  rmToExprList(pPa
d770: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 44  rse, pSelect, pD
d780: 75 70 2c 20 69 2b 31 2c 20 31 2c 20 30 29 3b 0a  up, i+1, 1, 0);.
d790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d7a0: 72 44 65 6c 65 74 65 28 70 44 75 70 29 3b 0a 20  rDelete(pDup);. 
d7b0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
d7c0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
d7d0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
d7e0: 20 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c     pEList = pSel
d7f0: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ect->pEList;.   
d800: 20 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30     if( pEList==0
d810: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
d820: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
d830: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 70 45 4c      if( iCol>pEL
d840: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
d850: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
d860: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
d870: 20 20 20 20 20 20 20 20 20 20 22 25 72 20 4f 52            "%r OR
d880: 44 45 52 20 42 59 20 74 65 72 6d 20 6f 75 74 20  DER BY term out 
d890: 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c  of range - shoul
d8a0: 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20  d be ".         
d8b0: 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64    "between 1 and
d8c0: 20 25 64 22 2c 20 69 2b 31 2c 20 70 45 4c 69 73   %d", i+1, pELis
d8d0: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
d8e0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
d8f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
d900: 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Col>0 ){.       
d910: 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c   pE->op = TK_COL
d920: 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70 45 2d  UMN;.        pE-
d930: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65  >iTable = iTable
d940: 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 69 41  ;.        pE->iA
d950: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  gg = -1;.       
d960: 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69   pE->iColumn = i
d970: 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 20 20 70  Col-1;.        p
d980: 45 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  E->pTab = 0;.   
d990: 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
d9a0: 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20  [i].done = 1;.  
d9b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d9c0: 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b     moreToDo = 1;
d9d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d9e0: 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65     pSelect = pSe
d9f0: 6c 65 63 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  lect->pNext;.  }
da00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
da10: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
da20: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72  ++){.    if( pOr
da30: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
da40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
da50: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
da60: 72 73 65 2c 20 22 25 72 20 4f 52 44 45 52 20 42  rse, "%r ORDER B
da70: 59 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20  Y term does not 
da80: 6d 61 74 63 68 20 61 6e 79 20 22 0a 20 20 20 20  match any ".    
da90: 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 20          "column 
daa0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
dab0: 74 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  t", i+1);.      
dac0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
dad0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
dae0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
daf0: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
db00: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
db10: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
db20: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
db30: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
db40: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
db50: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
db60: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
db70: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
db80: 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
db90: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
dba0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
dbb0: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
dbc0: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
dbd0: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
dbe0: 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70  ite3VdbeCreate(p
dbf0: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a  Parse->db);.  }.
dc00: 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a    return v;.}...
dc10: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
dc20: 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
dc30: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
dc40: 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
dc50: 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74  on the.** pLimit
dc60: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70   and pOffset exp
dc70: 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69  ressions.  pLimi
dc80: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f  t and pOffset ho
dc90: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
dca0: 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
dcb0: 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
dcc0: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
dcd0: 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
dce0: 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
dcf0: 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
dd00: 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
dd10: 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
dd20: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
dd30: 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
dd40: 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
dd50: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
dd60: 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
dd70: 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
dd80: 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
dd90: 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
dda0: 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
ddb0: 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
ddc0: 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
ddd0: 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
dde0: 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
ddf0: 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
de00: 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c  the values of iL
de10: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
de20: 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
de30: 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
de40: 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d   defined by pLim
de50: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20  it and pOffset. 
de60: 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69   iLimit and.** i
de70: 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
de80: 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
de90: 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
dea0: 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20  fault values.** 
deb0: 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74  (usually but not
dec0: 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f   always -1) prio
ded0: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
dee0: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e  s routine..** On
def0: 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20  ly if pLimit!=0 
df00: 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f  or pOffset!=0 do
df10: 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
df20: 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65  ters get.** rede
df30: 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f  fined.  The UNIO
df40: 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75  N ALL operator u
df50: 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74  ses this propert
df60: 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68  y to force.** th
df70: 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73  e reuse of the s
df80: 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  ame limit and of
df90: 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61  fset registers a
dfa0: 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a  cross multiple.*
dfb0: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
dfc0: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
dfd0: 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  oid computeLimit
dfe0: 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20  Registers(Parse 
dff0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
e000: 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b  *p, int iBreak){
e010: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a  .  Vdbe *v = 0;.
e020: 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30    int iLimit = 0
e030: 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b  ;.  int iOffset;
e040: 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64  .  int addr1, ad
e050: 64 72 32 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  dr2;..  /* .  **
e060: 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61   "LIMIT -1" alwa
e070: 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77  ys shows all row
e080: 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d  s.  There is som
e090: 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72  e.  ** contraver
e0a0: 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68  sy about what th
e0b0: 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
e0c0: 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20  or should be..  
e0d0: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69  ** The current i
e0e0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
e0f0: 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20  terprets "LIMIT 
e100: 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20  0" to mean.  ** 
e110: 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  no rows..  */.  
e120: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
e130: 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
e140: 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72   iLimit = ++pPar
e150: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 50  se->nMem;.    pP
e160: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
e170: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
e180: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
e190: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
e1a0: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
e1b0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e1c0: 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 30 29 3b 0a   p->pLimit, 0);.
e1d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e1e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
e1f0: 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20  BeInt, 0, 0);.  
e200: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e210: 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20  Op2(v, OP_Move, 
e220: 30 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  0, iLimit);.    
e230: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
e240: 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29  "LIMIT counter")
e250: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e260: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
e270: 66 4d 65 6d 5a 65 72 6f 2c 20 69 4c 69 6d 69 74  fMemZero, iLimit
e280: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 73  , iBreak);.    s
e290: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e2a0: 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 4c  (v, OP_SCopy, iL
e2b0: 69 6d 69 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  imit, 0);.  }.  
e2c0: 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29  if( p->pOffset )
e2d0: 7b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74  {.    p->iOffset
e2e0: 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70   = iOffset = ++p
e2f0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
e300: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
e310: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
e320: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
e330: 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  rn;.    sqlite3E
e340: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
e350: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 30 29 3b 0a  p->pOffset, 0);.
e360: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e370: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
e380: 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20  BeInt, 0, 0);.  
e390: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e3a0: 4f 70 32 28 76 2c 20 70 2d 3e 70 4c 69 6d 69 74  Op2(v, p->pLimit
e3b0: 3d 3d 30 20 3f 20 4f 50 5f 4d 6f 76 65 20 3a 20  ==0 ? OP_Move : 
e3c0: 4f 50 5f 43 6f 70 79 2c 20 30 2c 20 69 4f 66 66  OP_Copy, 0, iOff
e3d0: 73 65 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  set);.    VdbeCo
e3e0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45  mment((v, "OFFSE
e3f0: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
e400: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
e410: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e420: 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 4f 66 66  P_IfMemPos, iOff
e430: 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  set, 0);.    sql
e440: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e450: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
e460: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e470: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
e480: 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eger, 0, 0);.   
e490: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
e4a0: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
e4b0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69      if( p->pLimi
e4c0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
e4d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e4e0: 4f 50 5f 41 64 64 2c 20 30 2c 20 30 29 3b 0a 20  OP_Add, 0, 0);. 
e4f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
e500: 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
e510: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
e520: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e530: 49 66 4d 65 6d 50 6f 73 2c 20 69 4c 69 6d 69 74  IfMemPos, iLimit
e540: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
e550: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e560: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
e570: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e580: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
e590: 72 2c 20 2d 31 2c 20 69 4c 69 6d 69 74 2b 31 29  r, -1, iLimit+1)
e5a0: 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  ;.    addr2 = sq
e5b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e5c0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30  v, OP_Goto, 0, 0
e5d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e5e0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
e5f0: 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr1);.    sqlite
e600: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e610: 50 5f 4d 6f 76 65 2c 20 30 2c 20 69 4c 69 6d 69  P_Move, 0, iLimi
e620: 74 2b 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  t+1);.    VdbeCo
e630: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
e640: 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20  +OFFSET"));.    
e650: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
e660: 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20  ere(v, addr2);. 
e670: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
e680: 63 61 74 65 20 61 20 76 69 72 74 75 61 6c 20 69  cate a virtual i
e690: 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
e6a0: 73 6f 72 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  sorting..*/.stat
e6b0: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 53 6f  ic void createSo
e6c0: 72 74 69 6e 67 49 6e 64 65 78 28 50 61 72 73 65  rtingIndex(Parse
e6d0: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
e6e0: 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70   *p, ExprList *p
e6f0: 4f 72 64 65 72 42 79 29 7b 0a 20 20 69 66 28 20  OrderBy){.  if( 
e700: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
e710: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 61 73  int addr;.    as
e720: 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e  sert( pOrderBy->
e730: 69 45 43 75 72 73 6f 72 3d 3d 30 20 29 3b 0a 20  iECursor==0 );. 
e740: 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
e750: 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
e760: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 61 64 64 72  nTab++;.    addr
e770: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
e780: 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
e790: 62 65 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  be, OP_OpenEphem
e7a0: 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7c0: 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
e7d0: 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e  rsor, pOrderBy->
e7e0: 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 61 73  nExpr+1);.    as
e7f0: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
e800: 6e 45 70 68 6d 5b 32 5d 20 3d 3d 20 2d 31 20 29  nEphm[2] == -1 )
e810: 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  ;.    p->addrOpe
e820: 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 3b  nEphm[2] = addr;
e830: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
e840: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
e850: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
e860: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
e870: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
e880: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
e890: 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
e8a0: 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73  mn of.** the res
e8b0: 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20  ult set for the 
e8c0: 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
e8d0: 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20  statement "p".  
e8e0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a  Return NULL if.*
e8f0: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  * the column has
e900: 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
e910: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
e920: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
e930: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
e940: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
e950: 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72  lect is taken fr
e960: 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  om the.** left-m
e970: 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ost term of the 
e980: 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20  select that has 
e990: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
e9a0: 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
e9b0: 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65  CollSeq *multiSe
e9c0: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73  lectCollSeq(Pars
e9d0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
e9e0: 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  t *p, int iCol){
e9f0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74  .  CollSeq *pRet
ea00: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
ea10: 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
ea20: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
ea30: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50  eq(pParse, p->pP
ea40: 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d  rior, iCol);.  }
ea50: 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d  else{.    pRet =
ea60: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52   0;.  }.  if( pR
ea70: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52 65  et==0 ){.    pRe
ea80: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
ea90: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
eaa0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
eab0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  ].pExpr);.  }.  
eac0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
ead0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
eae0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
eaf0: 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  LECT */..#ifndef
eb00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
eb10: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
eb20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
eb30: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
eb40: 63 65 73 73 20 61 20 71 75 65 72 79 20 74 68 61  cess a query tha
eb50: 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  t is really the 
eb60: 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65  union.** or inte
eb70: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  rsection of two 
eb80: 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
eb90: 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20   queries..**.** 
eba0: 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
ebb0: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
ebc0: 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
ebd0: 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
ebe0: 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
ebf0: 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
ec00: 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
ec10: 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
ec20: 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
ec30: 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
ec40: 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
ec50: 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
ec60: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
ec70: 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
ec80: 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
ec90: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
eca0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
ecb0: 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
ecc0: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
ecd0: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
ece0: 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
ecf0: 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
ed00: 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
ed10: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
ed20: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
ed30: 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
ed40: 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
ed50: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
ed60: 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
ed70: 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
ed80: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
ed90: 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
eda0: 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
edb0: 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
edc0: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
edd0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ede0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
edf0: 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
ee00: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
ee10: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
ee20: 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
ee30: 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
ee40: 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
ee50: 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
ee60: 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
ee70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
ee80: 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
ee90: 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
eea0: 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
eeb0: 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
eec0: 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
eed0: 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
eee0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
eef0: 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
ef00: 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
ef10: 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
ef20: 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
ef30: 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
ef40: 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
ef50: 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
ef60: 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
ef70: 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
ef80: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ef90: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
efa0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
efb0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
efc0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
efd0: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
efe0: 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
eff0: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
f000: 2a 70 44 65 73 74 2c 20 20 20 20 2f 2a 20 57 68  *pDest,    /* Wh
f010: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
f020: 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ery results */. 
f030: 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20   char *aff      
f040: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65         /* If eDe
f050: 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c  st is SRT_Union,
f060: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
f070: 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ring */.){.  int
f080: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f090: 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f     /* Success co
f0a0: 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75  de from a subrou
f0b0: 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tine */.  Select
f0c0: 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
f0d0: 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
f0e0: 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
f0f0: 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
f100: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
f110: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
f120: 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
f130: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  BE */.  int nCol
f140: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
f150: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
f160: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
f170: 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69   set */.  ExprLi
f180: 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
f190: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
f1a0: 63 6c 61 75 73 65 20 6f 6e 20 70 20 2a 2f 0a 20  clause on p */. 
f1b0: 20 69 6e 74 20 61 53 65 74 50 32 5b 32 5d 3b 20   int aSetP2[2]; 
f1c0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 50 32         /* Set P2
f1d0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 73 65 20   value of these 
f1e0: 6f 70 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20  op to number of 
f1f0: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
f200: 20 6e 53 65 74 50 32 20 3d 20 30 3b 20 20 20 20   nSetP2 = 0;    
f210: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f220: 73 6c 6f 74 73 20 69 6e 20 61 53 65 74 50 32 5b  slots in aSetP2[
f230: 5d 20 75 73 65 64 20 2a 2f 0a 20 20 53 65 6c 65  ] used */.  Sele
f240: 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
f250: 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    /* Alternative
f260: 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f   data destinatio
f270: 6e 20 2a 2f 0a 0a 20 20 64 65 73 74 20 3d 20 2a  n */..  dest = *
f280: 70 44 65 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  pDest;..  /* Mak
f290: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
f2a0: 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
f2b0: 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
f2c0: 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
f2d0: 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
f2e0: 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
f2f0: 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
f300: 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
f310: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
f320: 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d  T..  */.  if( p=
f330: 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d  =0 || p->pPrior=
f340: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  =0 ){.    rc = 1
f350: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
f360: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
f370: 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
f380: 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
f390: 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
f3a0: 6f 73 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20  ost!=pPrior );. 
f3b0: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
f3c0: 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e  >pRightmost==p->
f3d0: 70 52 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20  pRightmost );.  
f3e0: 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  if( pPrior->pOrd
f3f0: 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
f400: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
f410: 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61  se,"ORDER BY cla
f420: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
f430: 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
f440: 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
f450: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
f460: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
f470: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
f480: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ect_end;.  }.  i
f490: 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
f4a0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
f4b0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f4c0: 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68  "LIMIT clause sh
f4d0: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
f4e0: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
f4f0: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
f500: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
f510: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
f520: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
f530: 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  d;.  }..  /* Mak
f540: 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
f550: 20 76 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67   valid query eng
f560: 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72  ine.  If not, cr
f570: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a  eate a new one..
f580: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
f590: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
f5a0: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  );.  if( v==0 ){
f5b0: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
f5c0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
f5d0: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
f5e0: 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73  * Create the des
f5f0: 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61  tination tempora
f600: 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65  ry table if nece
f610: 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28  ssary.  */.  if(
f620: 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
f630: 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
f640: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
f650: 73 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  st );.    assert
f660: 28 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28  ( nSetP2<sizeof(
f670: 61 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61  aSetP2)/sizeof(a
f680: 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20  SetP2[0]) );.   
f690: 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b   aSetP2[nSetP2++
f6a0: 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  ] = sqlite3VdbeA
f6b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
f6c0: 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e  Ephemeral, dest.
f6d0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 64  iParm, 0);.    d
f6e0: 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
f6f0: 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Table;.  }..  /*
f700: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
f710: 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  or the left and 
f720: 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61  right SELECT sta
f730: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
f740: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
f750: 72 64 65 72 42 79 3b 0a 20 20 73 77 69 74 63 68  rderBy;.  switch
f760: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
f770: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20  ase TK_ALL: {.  
f780: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
f790: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
f7a0: 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20  nt addr = 0;.   
f7b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
f7c0: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a  rior->pLimit );.
f7d0: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e          pPrior->
f7e0: 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
f7f0: 69 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69  it;.        pPri
f800: 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d  or->pOffset = p-
f810: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
f820: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
f830: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
f840: 69 6f 72 2c 20 26 64 65 73 74 2c 20 30 2c 20 30  ior, &dest, 0, 0
f850: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
f860: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
f870: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 66  ;.        p->pOf
f880: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
f890: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
f8a0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
f8b0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
f8c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
f8d0: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
f8e0: 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
f8f0: 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74  = pPrior->iLimit
f900: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66  ;.        p->iOf
f910: 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  fset = pPrior->i
f920: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
f930: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30  if( p->iLimit>=0
f940: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64   ){.          ad
f950: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
f960: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4d  AddOp2(v, OP_IfM
f970: 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  emZero, p->iLimi
f980: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
f990: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
f9a0: 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20   "Jump ahead if 
f9b0: 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29  LIMIT reached"))
f9c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f9d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f9e0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
f9f0: 2c 20 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30  , &dest, 0, 0, 0
fa00: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  , aff);.        
fa10: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
fa20: 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  or;.        if( 
fa30: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
fa40: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
fa50: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
fa60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
fa70: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
fa80: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
fa90: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
faa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
fab0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
fac0: 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e      /* For UNION
fad0: 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42   ALL ... ORDER B
fae0: 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  Y fall through t
faf0: 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20  o the next case 
fb00: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
fb10: 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
fb20: 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
fb30: 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
fb40: 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
fb50: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
fb60: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
fb70: 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
fb80: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  */.      int op 
fb90: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65  = 0;      /* One
fba0: 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
fbb0: 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
fbc0: 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
fbd0: 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
fbe0: 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
fbf0: 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
fc00: 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
fc10: 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ts */.      Expr
fc20: 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
fc30: 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
fc40: 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
fc50: 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
fc60: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
fc70: 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
fc80: 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a  est uniondest;..
fc90: 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
fca0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20  p->op==TK_ALL ? 
fcb0: 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f  SRT_Table : SRT_
fcc0: 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  Union;.      if(
fcd0: 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69   dest.eDest==pri
fce0: 6f 72 4f 70 20 26 26 20 70 4f 72 64 65 72 42 79  orOp && pOrderBy
fcf0: 3d 3d 30 20 26 26 20 21 70 2d 3e 70 4c 69 6d 69  ==0 && !p->pLimi
fd00: 74 20 26 26 20 21 70 2d 3e 70 4f 66 66 73 65 74  t && !p->pOffset
fd10: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
fd20: 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
fd30: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
fd40: 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
fd50: 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
fd60: 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
fd70: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
fd80: 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
fd90: 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  iParm;.      }el
fda0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  se{.        /* W
fdb0: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
fdc0: 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
fdd0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
fde0: 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
fdf0: 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
fe00: 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
fe10: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
fe20: 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
fe30: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
fe40: 20 69 66 28 20 70 72 6f 63 65 73 73 43 6f 6d 70   if( processComp
fe50: 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50 61 72  oundOrderBy(pPar
fe60: 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54 61 62 29  se, p, unionTab)
fe70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
fe80: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
fe90: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
fea0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
feb0: 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
fec0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fed0: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
fee0: 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c  meral, unionTab,
fef0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
ff00: 20 70 72 69 6f 72 4f 70 3d 3d 53 52 54 5f 54 61   priorOp==SRT_Ta
ff10: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ble ){.         
ff20: 20 61 73 73 65 72 74 28 20 6e 53 65 74 50 32 3c   assert( nSetP2<
ff30: 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29 2f 73  sizeof(aSetP2)/s
ff40: 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30 5d 29  izeof(aSetP2[0])
ff50: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 53   );.          aS
ff60: 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d  etP2[nSetP2++] =
ff70: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 7d   addr;.        }
ff80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ff90: 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
ffa0: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
ffb0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   );.          p-
ffc0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
ffd0: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
ffe0: 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
fff0: 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20 31 3b 0a  ->usesEphm = 1;.
10000 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10010 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49    createSortingI
10020 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20  ndex(pParse, p, 
10030 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
10040 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
10050 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  List );.      }.
10060 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
10070 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
10080 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
10090 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
100a0 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
100b0 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20  >pOrderBy );.   
100c0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
100d0 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64  DestInit(&uniond
100e0 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  est, priorOp, un
100f0 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 72  ionTab);.      r
10100 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
10110 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
10120 2c 20 26 75 6e 69 6f 6e 64 65 73 74 2c 20 30 2c  , &uniondest, 0,
10130 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
10140 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10150 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
10160 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
10170 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
10180 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
10190 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
101a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
101b0 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
101c0 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
101d0 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53  _EXCEPT:  op = S
101e0 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65  RT_Except;   bre
101f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
10200 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70  e TK_UNION:   op
10210 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20   = SRT_Union;   
10220 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10230 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
10240 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65    op = SRT_Table
10250 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
10260 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
10270 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
10280 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
10290 20 20 20 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f        p->disallo
102a0 77 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  wOrderBy = pOrde
102b0 72 42 79 21 3d 30 3b 0a 20 20 20 20 20 20 70 4c  rBy!=0;.      pL
102c0 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
102d0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
102e0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
102f0 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
10300 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
10310 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  set = 0;.      u
10320 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d  niondest.eDest =
10330 20 6f 70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   op;.      rc = 
10340 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
10350 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64  arse, p, &uniond
10360 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  est, 0, 0, 0, af
10370 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65  f);.      /* Que
10380 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ry flattening in
10390 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
103a0 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d   might refill p-
103b0 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20  >pOrderBy..     
103c0 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64   ** Be sure to d
103d0 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42  elete p->pOrderB
103e0 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f  y, therefore, to
103f0 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20   avoid a memory 
10400 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73  leak. */.      s
10410 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
10420 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79  lete(p->pOrderBy
10430 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
10440 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
10450 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
10460 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20   pOrderBy;.     
10470 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
10480 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  te(p->pLimit);. 
10490 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
104a0 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
104b0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
104c0 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  set;.      p->iL
104d0 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  imit = -1;.     
104e0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31   p->iOffset = -1
104f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
10500 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
10510 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
10520 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20  .      }...     
10530 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
10540 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
10550 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
10560 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
10570 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
10580 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
10590 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20  need..      */  
105a0 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 64      .      if( d
105b0 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
105c0 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d  Op || unionTab!=
105d0 64 65 73 74 2e 69 50 61 72 6d 20 29 7b 0a 20 20  dest.iParm ){.  
105e0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
105f0 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
10600 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10610 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
10620 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
10630 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
10640 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
10650 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
10660 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68   p;.          wh
10670 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
10680 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
10690 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
106a0 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74           generat
106b0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
106c0 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
106d0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  pEList);.       
106e0 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61   }.        iBrea
106f0 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
10700 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
10710 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
10720 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
10730 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  l(v);.        co
10740 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
10750 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
10760 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
10770 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10780 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
10790 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
107a0 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
107b0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
107c0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
107d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65         rc = sele
107e0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
107f0 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
10800 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70  , unionTab, p->p
10810 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
10820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10830 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
10840 72 42 79 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20  rBy, -1, &dest, 
10850 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30  iCont, iBreak, 0
10860 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
10870 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
10880 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
10890 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
108a0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
108b0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
108c0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
108d0 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
108e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
108f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
10900 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74  t, unionTab, iSt
10910 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  art);.        sq
10920 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
10930 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
10940 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10950 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10960 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61  P_Close, unionTa
10970 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
10980 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10990 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
109a0 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20  TERSECT: {.     
109b0 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
109c0 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
109d0 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
109e0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
109f0 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a  imit, *pOffset;.
10a00 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
10a10 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
10a20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
10a30 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53  .      /* INTERS
10a40 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74  ECT is different
10a50 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73   from the others
10a60 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72   since it requir
10a70 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20  es.      ** two 
10a80 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
10a90 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20  .  Hence it has 
10aa0 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42  its own case.  B
10ab0 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79  egin.      ** by
10ac0 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20   allocating the 
10ad0 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e  tables we will n
10ae0 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eed..      */.  
10af0 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73      tab1 = pPars
10b00 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
10b10 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e   tab2 = pParse->
10b20 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nTab++;.      if
10b30 28 20 70 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e  ( processCompoun
10b40 64 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c  dOrderBy(pParse,
10b50 20 70 2c 20 74 61 62 31 29 20 29 7b 0a 20 20 20   p, tab1) ){.   
10b60 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
10b70 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
10b80 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
10b90 20 20 7d 0a 20 20 20 20 20 20 63 72 65 61 74 65    }.      create
10ba0 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61  SortingIndex(pPa
10bb0 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42 79  rse, p, pOrderBy
10bc0 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d  );..      addr =
10bd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10be0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
10bf0 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29  emeral, tab1, 0)
10c00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10c10 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
10c20 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
10c30 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
10c40 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
10c50 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
10c60 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20 31 3b 0a  ->usesEphm = 1;.
10c70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
10c80 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20  >pEList );..    
10c90 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
10ca0 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
10cb0 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
10cc0 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
10cd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
10ce0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
10cf0 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65  nit(&intersectde
10d00 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  st, SRT_Union, t
10d10 61 62 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ab1);.      rc =
10d20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
10d30 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
10d40 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 30  intersectdest, 0
10d50 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
10d60 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
10d70 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
10d80 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
10d90 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
10da0 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
10db0 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70  SELECT into temp
10dc0 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
10dd0 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  2".      */.    
10de0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
10df0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10e00 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
10e10 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
10e20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
10e30 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31  penEphm[1] == -1
10e40 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
10e50 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61  rOpenEphm[1] = a
10e60 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ddr;.      p->pP
10e70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
10e80 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
10e90 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
10ea0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
10eb0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
10ec0 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
10ed0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
10ee0 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69   intersectdest.i
10ef0 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20  Parm = tab2;.   
10f00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
10f10 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
10f20 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c   &intersectdest,
10f30 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
10f40 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
10f50 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
10f60 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
10f70 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  e(p->pLimit);.  
10f80 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
10f90 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
10fa0 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
10fb0 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  et;.      if( rc
10fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
10fd0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
10fe0 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
10ff0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
11000 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69  de to take the i
11010 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
11020 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  he two temporary
11030 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73  .      ** tables
11040 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11050 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
11060 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  st );.      if( 
11070 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
11080 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
11090 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
110a0 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
110b0 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
110c0 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
110d0 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
110e0 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74  .        generat
110f0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
11100 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
11110 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  pEList);.      }
11120 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20  .      iBreak = 
11130 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
11140 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
11150 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
11160 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
11170 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
11180 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
11190 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
111a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
111b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
111c0 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
111d0 61 6b 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72  ak);.      iStar
111e0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
111f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b  ddOp2(v, OP_RowK
11200 65 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  ey, tab1, 0);.  
11210 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11220 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 46  ddOp2(v, OP_NotF
11230 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
11240 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
11250 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
11260 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
11270 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45  ist, tab1, p->pE
11280 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112a0 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72            pOrder
112b0 42 79 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69  By, -1, &dest, i
112c0 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29  Cont, iBreak, 0)
112d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
112e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  {.        rc = 1
112f0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
11300 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
11310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
11320 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
11330 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
11340 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11350 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11360 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61  Next, tab1, iSta
11370 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
11380 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
11390 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
113a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
113b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
113c0 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
113d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
113e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
113f0 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  e, tab1, 0);.   
11400 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11410 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
11420 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
11430 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
11440 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
11450 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
11460 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
11470 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
11480 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
11490 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
114a0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28  >pEList );.  if(
114b0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
114c0 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r!=pPrior->pELis
114d0 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
114e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
114f0 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
11500 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
11510 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
11520 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76      " do not hav
11530 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
11540 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
11550 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  mns", selectOpNa
11560 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
11570 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
11580 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
11590 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  d;.  }..  /* Set
115a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
115b0 6f 6c 75 6d 6e 73 20 69 6e 20 74 65 6d 70 6f 72  olumns in tempor
115c0 61 72 79 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a  ary tables.  */.
115d0 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69    nCol = p->pELi
115e0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 77 68 69  st->nExpr;.  whi
115f0 6c 65 28 20 6e 53 65 74 50 32 20 29 7b 0a 20 20  le( nSetP2 ){.  
11600 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
11610 6e 67 65 50 32 28 76 2c 20 61 53 65 74 50 32 5b  ngeP2(v, aSetP2[
11620 2d 2d 6e 53 65 74 50 32 5d 2c 20 6e 43 6f 6c 29  --nSetP2], nCol)
11630 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
11640 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ute collating se
11650 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20  quences used by 
11660 65 69 74 68 65 72 20 74 68 65 20 4f 52 44 45 52  either the ORDER
11670 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 20 20   BY clause or.  
11680 2a 2a 20 62 79 20 61 6e 79 20 74 65 6d 70 6f 72  ** by any tempor
11690 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65  ary tables neede
116a0 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
116b0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
116c0 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20  ct..  ** Attach 
116d0 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
116e0 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d  cture to all tem
116f0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
11700 49 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  Invoke the.  ** 
11710 4f 52 44 45 52 20 42 59 20 70 72 6f 63 65 73 73  ORDER BY process
11720 69 6e 67 20 69 66 20 74 68 65 72 65 20 69 73 20  ing if there is 
11730 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
11740 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  se..  **.  ** Th
11750 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
11760 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
11770 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
11780 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
11790 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
117a0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
117b0 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
117c0 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
117d0 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
117e0 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
117f0 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
11800 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
11810 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
11820 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
11830 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
11840 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
11850 79 20 7c 7c 20 70 2d 3e 75 73 65 73 45 70 68 6d  y || p->usesEphm
11860 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   ){.    int i;  
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11880 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
11890 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79  unter */.    Key
118a0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
118b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
118c0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
118d0 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
118e0 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63  set */.    Selec
118f0 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  t *pLoop;       
11900 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
11910 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
11920 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11930 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65  s */.    int nKe
11940 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  yCol;           
11950 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11960 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70   of entries in p
11970 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  KeyInfo->aCol[] 
11980 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
11990 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20  *apColl;        
119a0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
119b0 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79  ing through pKey
119c0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f  Info->aColl[] */
119d0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
119e0 43 6f 70 79 3b 20 20 20 20 20 20 20 20 20 20 20  Copy;           
119f0 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
11a00 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
11a10 5d 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  ] */..    assert
11a20 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ( p->pRightmost=
11a30 3d 70 20 29 3b 0a 20 20 20 20 6e 4b 65 79 43 6f  =p );.    nKeyCo
11a40 6c 20 3d 20 6e 43 6f 6c 20 2b 20 28 70 4f 72 64  l = nCol + (pOrd
11a50 65 72 42 79 20 3f 20 70 4f 72 64 65 72 42 79 2d  erBy ? pOrderBy-
11a60 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20  >nExpr : 0);.   
11a70 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
11a80 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
11a90 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20  pParse->db,.    
11aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ab0 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49     sizeof(*pKeyI
11ac0 6e 66 6f 29 2b 6e 4b 65 79 43 6f 6c 2a 28 73 69  nfo)+nKeyCol*(si
11ad0 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b  zeof(CollSeq*) +
11ae0 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70   1));.    if( !p
11af0 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
11b00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
11b10 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  EM;.      goto m
11b20 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
11b30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79  .    }..    pKey
11b40 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  Info->enc = ENC(
11b50 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20  pParse->db);.   
11b60 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
11b70 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66  d = nCol;..    f
11b80 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70  or(i=0, apColl=p
11b90 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20  KeyInfo->aColl; 
11ba0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43  i<nCol; i++, apC
11bb0 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61  oll++){.      *a
11bc0 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
11bd0 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
11be0 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
11bf0 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29  if( 0==*apColl )
11c00 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c  {.        *apCol
11c10 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
11c20 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
11c30 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
11c40 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
11c50 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
11c60 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f  Prior){.      fo
11c70 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
11c80 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
11c90 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  dr = pLoop->addr
11ca0 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20  OpenEphm[i];.   
11cb0 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20       if( addr<0 
11cc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
11cd0 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  If [0] is unused
11ce0 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73   then [1] is als
11cf0 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65  o unused.  So we
11d00 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a   can.          *
11d10 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20  * always safely 
11d20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73  abort as soon as
11d30 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65   the first unuse
11d40 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20  d slot is found 
11d50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
11d60 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  ert( pLoop->addr
11d70 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b  OpenEphm[1]<0 );
11d80 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
11d90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11da0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
11db0 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
11dc0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
11dd0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
11de0 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP4(v, addr, (ch
11df0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
11e00 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
11e10 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70     pLoop->addrOp
11e20 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a  enEphm[i] = -1;.
11e30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
11e40 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
11e50 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
11e60 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
11e70 4f 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79  OTerm = pOrderBy
11e80 2d 3e 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ->a;.      int n
11e90 4f 72 64 65 72 42 79 45 78 70 72 20 3d 20 70 4f  OrderByExpr = pO
11ea0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
11eb0 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
11ec0 20 20 20 20 20 75 38 20 2a 70 53 6f 72 74 4f 72       u8 *pSortOr
11ed0 64 65 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52  der;..      /* R
11ee0 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 70 4b  euse the same pK
11ef0 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 4f  eyInfo for the O
11f00 52 44 45 52 20 42 59 20 61 73 20 77 61 73 20 75  RDER BY as was u
11f10 73 65 64 20 61 62 6f 76 65 20 66 6f 72 0a 20 20  sed above for.  
11f20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f      ** the compo
11f30 75 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65  und select state
11f40 6d 65 6e 74 73 2e 20 20 45 78 63 65 70 74 20 77  ments.  Except w
11f50 65 20 68 61 76 65 20 74 6f 20 63 68 61 6e 67 65  e have to change
11f60 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a   out the.      *
11f70 2a 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  * pKeyInfo->aCol
11f80 6c 5b 5d 20 76 61 6c 75 65 73 2e 20 20 53 6f 6d  l[] values.  Som
11f90 65 20 6f 66 20 74 68 65 20 61 43 6f 6c 6c 5b 5d  e of the aColl[]
11fa0 20 76 61 6c 75 65 73 20 77 69 6c 6c 20 62 65 0a   values will be.
11fb0 20 20 20 20 20 20 2a 2a 20 72 65 75 73 65 64 20        ** reused 
11fc0 77 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  when constructin
11fd0 67 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 20 66  g the pKeyInfo f
11fe0 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 2c  or the ORDER BY,
11ff0 20 73 6f 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   so make.      *
12000 2a 20 61 20 63 6f 70 79 2e 20 20 53 75 66 66 69  * a copy.  Suffi
12010 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 68  cient space to h
12020 6f 6c 64 20 62 6f 74 68 20 74 68 65 20 6e 43 6f  old both the nCo
12030 6c 20 65 6e 74 72 69 65 73 20 66 6f 72 0a 20 20  l entries for.  
12040 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f      ** the compo
12050 75 6e 64 20 73 65 6c 65 63 74 20 61 6e 64 20 74  und select and t
12060 68 65 20 6e 4f 72 64 65 72 62 79 45 78 70 72 20  he nOrderbyExpr 
12070 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
12080 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a  ORDER BY.      *
12090 2a 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  * was allocated 
120a0 61 62 6f 76 65 2e 20 20 42 75 74 20 77 65 20 6e  above.  But we n
120b0 65 65 64 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  eed to move the 
120c0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 0a  compound select.
120d0 20 20 20 20 20 20 2a 2a 20 65 6e 74 72 69 65 73        ** entries
120e0 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20   out of the way 
120f0 62 65 66 6f 72 65 20 63 6f 6e 73 74 72 75 63 74  before construct
12100 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
12110 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
12120 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 6f 6d 70  ** Move the comp
12130 6f 75 6e 64 20 73 65 6c 65 63 74 20 65 6e 74 72  ound select entr
12140 69 65 73 20 69 6e 74 6f 20 61 43 6f 70 79 5b 5d  ies into aCopy[]
12150 20 77 68 65 72 65 20 74 68 65 79 20 63 61 6e 20   where they can 
12160 62 65 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 65  be.      ** acce
12170 73 73 65 64 20 61 6e 64 20 72 65 75 73 65 64 20  ssed and reused 
12180 77 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  when constructin
12190 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65  g the ORDER BY e
121a0 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 2a 2a  ntries..      **
121b0 20 42 65 63 61 75 73 65 20 6e 43 6f 6c 20 6d 69   Because nCol mi
121c0 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ght be greater t
121d0 68 61 6e 20 6f 72 20 6c 65 73 73 20 74 68 61 6e  han or less than
121e0 20 6e 4f 72 64 65 72 42 79 45 78 70 72 0a 20 20   nOrderByExpr.  
121f0 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74      ** we have t
12200 6f 20 75 73 65 20 6d 65 6d 6d 6f 76 65 28 29 20  o use memmove() 
12210 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 63  when doing the c
12220 6f 70 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  opy..      */.  
12230 20 20 20 20 61 43 6f 70 79 20 3d 20 26 70 4b 65      aCopy = &pKe
12240 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72  yInfo->aColl[nOr
12250 64 65 72 42 79 45 78 70 72 5d 3b 0a 20 20 20 20  derByExpr];.    
12260 20 20 70 53 6f 72 74 4f 72 64 65 72 20 3d 20 70    pSortOrder = p
12270 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
12280 64 65 72 20 3d 20 28 75 38 2a 29 26 61 43 6f 70  der = (u8*)&aCop
12290 79 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 6d  y[nCol];.      m
122a0 65 6d 6d 6f 76 65 28 61 43 6f 70 79 2c 20 70 4b  emmove(aCopy, pK
122b0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e  eyInfo->aColl, n
122c0 43 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  Col*sizeof(CollS
122d0 65 71 2a 29 29 3b 0a 0a 20 20 20 20 20 20 61 70  eq*));..      ap
122e0 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
122f0 3e 61 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 66 6f  >aColl;.      fo
12300 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
12310 79 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4f 54 65  yExpr; i++, pOTe
12320 72 6d 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 2c 20  rm++, apColl++, 
12330 70 53 6f 72 74 4f 72 64 65 72 2b 2b 29 7b 0a 20  pSortOrder++){. 
12340 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
12350 70 72 20 3d 20 70 4f 54 65 72 6d 2d 3e 70 45 78  pr = pOTerm->pEx
12360 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
12370 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
12380 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 29  EP_ExpCollate) )
12390 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
123a0 72 74 28 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  rt( pExpr->pColl
123b0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
123c0 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72   *apColl = pExpr
123d0 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ->pColl;.       
123e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
123f0 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 61 43 6f 70    *apColl = aCop
12400 79 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  y[pExpr->iColumn
12410 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
12420 20 20 20 20 20 2a 70 53 6f 72 74 4f 72 64 65 72       *pSortOrder
12430 20 3d 20 70 4f 54 65 72 6d 2d 3e 73 6f 72 74 4f   = pOTerm->sortO
12440 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rder;.      }.  
12450 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
12460 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a  Rightmost==p );.
12470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
12480 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
12490 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64  >=0 );.      add
124a0 72 20 3d 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  r = p->addrOpenE
124b0 70 68 6d 5b 32 5d 3b 0a 20 20 20 20 20 20 73 71  phm[2];.      sq
124c0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
124d0 32 28 76 2c 20 61 64 64 72 2c 20 70 2d 3e 70 4f  2(v, addr, p->pO
124e0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 29  rderBy->nExpr+2)
124f0 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
12500 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4f 72 64 65  ->nField = nOrde
12510 72 42 79 45 78 70 72 3b 0a 20 20 20 20 20 20 73  rByExpr;.      s
12520 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
12530 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P4(v, addr, (cha
12540 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
12550 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
12560 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
12570 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 65 6e 65   = 0;.      gene
12580 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
12590 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70 45  rse, p, v, p->pE
125a0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 26 64 65  List->nExpr, &de
125b0 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  st);.    }..    
125c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65  sqlite3_free(pKe
125d0 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c  yInfo);.  }..mul
125e0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  ti_select_end:. 
125f0 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 64   pDest->iMem = d
12600 65 73 74 2e 69 4d 65 6d 3b 0a 20 20 72 65 74 75  est.iMem;.  retu
12610 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
12620 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
12630 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
12640 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
12650 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 20 46  E_OMIT_VIEW./* F
12660 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
12670 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
12680 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
12690 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c  (sqlite3*, ExprL
126a0 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ist*, int, ExprL
126b0 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
126c0 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73  id substSelect(s
126d0 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20  qlite3*, Select 
126e0 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
126f0 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e   *);../*.** Scan
12700 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70   through the exp
12710 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
12720 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65  Replace every re
12730 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20  ference to.** a 
12740 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
12750 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69  number iTable wi
12760 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
12770 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65   iColumn-th.** e
12780 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20  ntry in pEList. 
12790 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65   (But leave refe
127a0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f  rences to the RO
127b0 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75  WID column .** u
127c0 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a  nchanged.).**.**
127d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
127e0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61   part of the fla
127f0 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72  ttening procedur
12800 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a  e.  A subquery.*
12810 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73  * whose result s
12820 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
12830 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20   pEList appears 
12840 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  as entry in the.
12850 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ** FROM clause o
12860 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20  f a SELECT such 
12870 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75  that the VDBE cu
12880 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
12890 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c   that.** FORM cl
128a0 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54  ause entry is iT
128b0 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
128c0 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63  ine make the nec
128d0 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
128e0 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
128f0 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
12900 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
12910 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
12920 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
12930 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
12940 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
12950 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ery..*/.static v
12960 6f 69 64 20 73 75 62 73 74 45 78 70 72 28 0a 20  oid substExpr(. 
12970 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
12980 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
12990 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20  alloc errors to 
129a0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
129b0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
129c0 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  ,        /* Expr
129d0 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69   in which substi
129e0 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f  tution occurs */
129f0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
12a00 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
12a10 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
12a20 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
12a30 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75  *pEList    /* Su
12a40 62 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73  bstitute express
12a50 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ions */.){.  if(
12a60 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
12a70 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
12a80 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
12a90 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
12aa0 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  =iTable ){.    i
12ab0 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
12ac0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  n<0 ){.      pEx
12ad0 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
12ae0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12af0 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
12b00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
12b10 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d  ist!=0 && pExpr-
12b20 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d  >iColumn<pEList-
12b30 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
12b40 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
12b50 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
12b60 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70  ->pRight==0 && p
12b70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
12b80 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70  ;.      pNew = p
12b90 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e  EList->a[pExpr->
12ba0 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a  iColumn].pExpr;.
12bb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
12bc0 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ew!=0 );.      p
12bd0 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d  Expr->op = pNew-
12be0 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  >op;.      asser
12bf0 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
12c00 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
12c10 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r->pLeft = sqlit
12c20 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e  e3ExprDup(db, pN
12c30 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  ew->pLeft);.    
12c40 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
12c50 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
12c60 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
12c70 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
12c80 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 52 69  up(db, pNew->pRi
12c90 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ght);.      asse
12ca0 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  rt( pExpr->pList
12cb0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
12cc0 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69  pr->pList = sqli
12cd0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
12ce0 62 2c 20 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b  b, pNew->pList);
12cf0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
12d00 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61  able = pNew->iTa
12d10 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ble;.      pExpr
12d20 2d 3e 70 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70  ->pTab = pNew->p
12d30 54 61 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72  Tab;.      pExpr
12d40 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77  ->iColumn = pNew
12d50 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
12d60 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70   pExpr->iAgg = p
12d70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20  New->iAgg;.     
12d80 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
12d90 79 28 64 62 2c 20 26 70 45 78 70 72 2d 3e 74 6f  y(db, &pExpr->to
12da0 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65  ken, &pNew->toke
12db0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
12dc0 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26  3TokenCopy(db, &
12dd0 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e  pExpr->span, &pN
12de0 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20  ew->span);.     
12df0 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
12e00 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
12e10 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 53 65  up(db, pNew->pSe
12e20 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 70 45 78  lect);.      pEx
12e30 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77  pr->flags = pNew
12e40 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  ->flags;.    }. 
12e50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73   }else{.    subs
12e60 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
12e70 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20  >pLeft, iTable, 
12e80 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
12e90 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72  stExpr(db, pExpr
12ea0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65  ->pRight, iTable
12eb0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
12ec0 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
12ed0 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69  Expr->pSelect, i
12ee0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
12ef0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
12f00 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 69  t(db, pExpr->pLi
12f10 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
12f20 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  st);.  }.}.stati
12f30 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
12f40 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20  List(.  sqlite3 
12f50 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
12f60 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
12f70 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45  rors here */.  E
12f80 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
12f90 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
12fa0 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
12fb0 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
12fc0 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  utes */.  int iT
12fd0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
12fe0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
12ff0 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
13000 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
13010 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
13020 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
13030 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
13040 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
13050 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
13060 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
13070 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  {.    substExpr(
13080 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
13090 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70  pExpr, iTable, p
130a0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
130b0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
130c0 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33  elect(.  sqlite3
130d0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
130e0 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65   Report malloc e
130f0 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20  rrors here */.  
13100 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
13110 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
13120 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63  tatement in whic
13130 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
13140 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  tutions */.  int
13150 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
13160 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
13170 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45   replaced */.  E
13180 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
13190 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
131a0 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
131b0 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
131c0 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
131d0 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  t(db, p->pEList,
131e0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
131f0 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
13200 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  t(db, p->pGroupB
13210 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
13220 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
13230 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ist(db, p->pOrde
13240 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  rBy, iTable, pEL
13250 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
13260 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  r(db, p->pHaving
13270 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
13280 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 64  );.  substExpr(d
13290 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54  b, p->pWhere, iT
132a0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
132b0 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
132c0 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62   p->pPrior, iTab
132d0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23  le, pEList);.}.#
132e0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
132f0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
13300 45 57 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  EW) */..#ifndef 
13310 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
13320 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
13330 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
13340 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
13350 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  es in order to s
13360 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f  peed.** executio
13370 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31  n.  It returns 1
13380 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61   if it makes cha
13390 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f  nges and 0 if no
133a0 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f   flattening.** o
133b0 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
133c0 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
133d0 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
133e0 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
133f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
13400 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
13410 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
13420 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
13430 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
13440 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
13450 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
13460 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
13470 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
13480 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
13490 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
134a0 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
134b0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
134c0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
134d0 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
134e0 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
134f0 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
13500 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
13510 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
13520 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
13530 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
13540 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
13550 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
13560 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
13570 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
13580 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
13590 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
135a0 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
135b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
135c0 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
135d0 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
135e0 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
135f0 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
13600 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
13610 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
13620 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
13630 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
13640 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
13650 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
13660 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
13670 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20  ification gives 
13680 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a  the same result.
13690 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20  ** but only has 
136a0 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61  to scan the data
136b0 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61   once.  And beca
136c0 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68  use indices migh
136d0 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74  t .** exist on t
136e0 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63  he table t1, a c
136f0 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20  omplete scan of 
13700 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62  the data might b
13710 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a  e.** avoided..**
13720 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69  .** Flattening i
13730 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64  s only attempted
13740 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
13750 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
13760 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  e:.**.**   (1)  
13770 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
13780 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
13790 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
137a0 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
137b0 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75  **   (2)  The su
137c0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e  bquery is not an
137d0 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
137e0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
137f0 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
13800 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75  **   (3)  The su
13810 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
13820 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
13830 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20  of a left outer 
13840 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20  join, or.**     
13850 20 20 20 74 68 65 20 73 75 62 71 75 65 72 79 20     the subquery 
13860 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20  is not itself a 
13870 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23  join.  (Ticket #
13880 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  306).**.**   (4)
13890 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
138a0 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f  s not DISTINCT o
138b0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
138c0 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
138d0 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68  .**.**   (5)  Th
138e0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
138f0 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68  t DISTINCT or th
13900 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
13910 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
13920 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
13930 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68  .**.**   (6)  Th
13940 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
13950 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
13960 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
13970 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
13980 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
13990 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68  .**.**   (7)  Th
139a0 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61  e subquery has a
139b0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
139c0 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73  .**   (8)  The s
139d0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
139e0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
139f0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
13a00 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
13a10 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75  **   (9)  The su
13a20 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
13a30 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
13a40 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
13a50 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
13a60 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
13a70 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65  **.**  (10)  The
13a80 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
13a90 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
13aa0 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
13ab0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  uery does not.**
13ac0 20 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49          use LIMI
13ad0 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  T..**.**  (11)  
13ae0 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
13af0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
13b00 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76   do not both hav
13b10 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
13b20 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20  es..**.**  (12) 
13b30 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
13b40 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 74   not the right t
13b50 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  erm of a LEFT OU
13b60 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a  TER JOIN or the.
13b70 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65  **        subque
13b80 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
13b90 63 6c 61 75 73 65 2e 20 20 28 61 64 64 65 64 20  clause.  (added 
13ba0 62 79 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a  by ticket #350).
13bb0 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65  **.**  (13)  The
13bc0 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75   subquery and ou
13bd0 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
13be0 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 0a   both use LIMIT.
13bf0 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65  **.**  (14)  The
13c00 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
13c10 6f 74 20 75 73 65 20 4f 46 46 53 45 54 0a 2a 2a  ot use OFFSET.**
13c20 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f  .**  (15)  The o
13c30 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
13c40 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  t part of a comp
13c50 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74  ound select or t
13c60 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  he.**        sub
13c70 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68  query does not h
13c80 61 76 65 20 62 6f 74 68 20 61 6e 20 4f 52 44 45  ave both an ORDE
13c90 52 20 42 59 20 61 6e 64 20 61 20 4c 49 4d 49 54  R BY and a LIMIT
13ca0 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20   clause..**     
13cb0 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23     (See ticket #
13cc0 32 33 33 39 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  2339).**.** In t
13cd0 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
13ce0 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
13cf0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
13d00 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
13d10 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
13d20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
13d30 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
13d40 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
13d50 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
13d60 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73  aggregates and s
13d70 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20  ubqueryIsAgg is 
13d80 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  true if the subq
13d90 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
13da0 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
13db0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
13dc0 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
13dd0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
13de0 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
13df0 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
13e00 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
13e10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
13e20 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
13e30 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
13e40 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
13e50 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
13e60 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
13e70 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
13e80 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
13e90 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
13ea0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
13eb0 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
13ec0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
13ed0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
13ee0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
13ef0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
13f00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
13f10 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c  ent or outer SEL
13f20 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
13f30 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
13f40 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
13f50 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d   in p->pSrc->a[]
13f60 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75   of the inner su
13f70 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
13f80 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20  isAgg,          
13f90 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65   /* True if oute
13fa0 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67  r SELECT uses ag
13fb0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
13fc0 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75  s */.  int subqu
13fd0 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54  eryIsAgg    /* T
13fe0 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
13ff0 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
14000 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
14010 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  ){.  Select *pSu
14020 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b;       /* The 
14030 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22  inner query or "
14040 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53  subquery" */.  S
14050 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
14060 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
14070 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
14080 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  er query */.  Sr
14090 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20  cList *pSubSrc; 
140a0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
140b0 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
140c0 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uery */.  ExprLi
140d0 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a  st *pList;    /*
140e0 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
140f0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
14100 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
14110 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
14120 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
14130 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
14140 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
14150 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
14160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14170 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
14180 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141a0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
141b0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
141c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
141d0 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
141e0 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
141f0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
14200 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
14210 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
14220 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
14230 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30  .  */.  if( p==0
14240 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
14250 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
14260 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26   assert( pSrc &&
14270 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72   iFrom>=0 && iFr
14280 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  om<pSrc->nSrc );
14290 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70  .  pSubitem = &p
142a0 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20  Src->a[iFrom];. 
142b0 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
142c0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
142d0 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
142e0 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73    if( isAgg && s
142f0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
14300 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
14310 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
14320 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a  riction (1)  */.
14330 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
14340 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72  Agg && pSrc->nSr
14350 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  c>1 ) return 0; 
14360 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
14370 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a  riction (2)  */.
14380 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
14390 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
143a0 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f  ( pSubSrc );.  /
143b0 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69  * Prior to versi
143c0 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c  on 3.1.2, when L
143d0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
143e0 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65  had to be simple
143f0 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a   constants,.  **
14400 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65   not arbitrary e
14410 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20  xpresssions, we 
14420 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d  allowed some com
14430 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20  bining of LIMIT 
14440 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
14450 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75  because they cou
14460 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61  ld be computed a
14470 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
14480 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20   But when LIMIT 
14490 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
144a0 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79  became arbitrary
144b0 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
144c0 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20   were forced to 
144d0 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73  add restrictions
144e0 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28   (13).  ** and (
144f0 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53  14). */.  if( pS
14500 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
14510 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
14520 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
14530 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
14540 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (13) */.  if( pS
14550 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65  ub->pOffset ) re
14560 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
14570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14580 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
14590 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d  (14) */.  if( p-
145a0 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70  >pRightmost && p
145b0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
145c0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
145d0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
145e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
14610 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f  triction (15) */
14620 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53  .  }.  if( pSubS
14630 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
14640 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14660 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29   Restriction (7)
14670 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62    */.  if( (pSub
14680 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20  ->isDistinct || 
14690 70 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20 0a 20  pSub->pLimit) . 
146a0 20 20 20 20 20 20 20 20 26 26 20 28 70 53 72 63          && (pSrc
146b0 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
146c0 67 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f  g) ){          /
146d0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28  * Restrictions (
146e0 34 29 28 35 29 28 38 29 28 39 29 20 2a 2f 0a 20  4)(5)(8)(9) */. 
146f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
14700 20 20 20 20 0a 20 20 7d 0a 20 20 69 66 28 20 70      .  }.  if( p
14710 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20  ->isDistinct && 
14720 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
14730 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
14740 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
14750 20 28 36 29 20 20 2a 2f 0a 20 20 69 66 28 20 28   (6)  */.  if( (
14760 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72  p->disallowOrder
14770 42 79 20 7c 7c 20 70 2d 3e 70 4f 72 64 65 72 42  By || p->pOrderB
14780 79 29 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  y) && pSub->pOrd
14790 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
147a0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
147b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147d0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
147e0 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  (11) */.  }..  /
147f0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a  * Restriction 3:
14800 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
14810 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b  y is a join, mak
14820 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
14830 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74  ery is .  ** not
14840 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67   used as the rig
14850 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e  ht operand of an
14860 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78   outer join.  Ex
14870 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
14880 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  is.  ** is not a
14890 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
148a0 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
148b0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
148c0 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
148d0 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
148e0 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
148f0 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
14900 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
14910 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
14920 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
14930 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
14940 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
14950 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  me thing..  */. 
14960 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
14970 72 63 3e 31 20 26 26 20 28 70 53 75 62 69 74 65  rc>1 && (pSubite
14980 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
14990 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20  _OUTER)!=0 ){.  
149a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
149b0 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
149c0 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75  n 12:  If the su
149d0 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
149e0 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
149f0 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a   left outer.  **
14a00 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
14a10 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
14a20 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
14a30 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70  e..  ** An examp
14a40 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20  les of why this 
14a50 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
14a60 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
14a70 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
14a80 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  JOIN (SELECT * F
14a90 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e  ROM t2 WHERE t2.
14aa0 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  x>0).  **.  ** I
14ab0 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
14ac0 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
14ad0 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
14ae0 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
14af0 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57  OUTER JOIN t2) W
14b00 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a  HERE t2.x>0.  **
14b10 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32  .  ** But the t2
14b20 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61  .x>0 test will a
14b30 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20  lways fail on a 
14b40 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20  NULL row of t2, 
14b50 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63  which.  ** effec
14b60 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20  tively converts 
14b70 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69  the OUTER JOIN i
14b80 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49  nto an INNER JOI
14b90 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  N..  */.  if( (p
14ba0 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  Subitem->jointyp
14bb0 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
14bc0 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65 72 65   && pSub->pWhere
14bd0 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
14be0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
14bf0 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
14c00 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
14c10 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
14c20 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a  rmitted for the.
14c30 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e    ** iFrom-th en
14c40 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
14c50 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75  clause in the ou
14c60 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  ter query..  */.
14c70 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f  .  /* Move all o
14c80 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65  f the FROM eleme
14c90 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75  nts of the subqu
14ca0 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ery into the.  *
14cb0 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
14cc0 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
14cd0 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f  uery.  Before do
14ce0 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62  ing this, rememb
14cf0 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  er.  ** the curs
14d00 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
14d10 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72  e original outer
14d20 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d   query FROM elem
14d30 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72  ent in.  ** iPar
14d40 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e  ent.  The iParen
14d50 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65  t cursor will ne
14d60 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75  ver be used.  Su
14d70 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20  bsequent code.  
14d80 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70  ** will scan exp
14d90 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67  ressions looking
14da0 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66   for iParent ref
14db0 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c  erences and repl
14dc0 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72  ace.  ** those r
14dd0 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65  eferences with e
14de0 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
14df0 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73  resolve to the s
14e00 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a  ubquery FROM.  *
14e10 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72  * elements we ar
14e20 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e  e now copying in
14e30 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74  ..  */.  iParent
14e40 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75   = pSubitem->iCu
14e50 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e  rsor;.  {.    in
14e60 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62  t nSubSrc = pSub
14e70 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69  Src->nSrc;.    i
14e80 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53  nt jointype = pS
14e90 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
14ea0 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ;..    sqlite3De
14eb0 6c 65 74 65 54 61 62 6c 65 28 70 53 75 62 69 74  leteTable(pSubit
14ec0 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73  em->pTab);.    s
14ed0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 75 62  qlite3_free(pSub
14ee0 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  item->zDatabase)
14ef0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
14f00 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  ee(pSubitem->zNa
14f10 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
14f20 5f 66 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e  _free(pSubitem->
14f30 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 53 75  zAlias);.    pSu
14f40 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  bitem->pTab = 0;
14f50 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  .    pSubitem->z
14f60 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
14f70 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d    pSubitem->zNam
14f80 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 69  e = 0;.    pSubi
14f90 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b  tem->zAlias = 0;
14fa0 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63  .    if( nSubSrc
14fb0 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
14fc0 65 78 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20  extra = nSubSrc 
14fd0 2d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  - 1;.      for(i
14fe0 3d 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =1; i<nSubSrc; i
14ff0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72  ++){.        pSr
15000 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
15010 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 53 72  stAppend(db, pSr
15020 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  c, 0, 0);.      
15030 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b    if( pSrc==0 ){
15040 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 53  .          p->pS
15050 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rc = 0;.        
15060 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
15070 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15080 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53      p->pSrc = pS
15090 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  rc;.      for(i=
150a0 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d  pSrc->nSrc-1; i-
150b0 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d  extra>=iFrom; i-
150c0 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63  -){.        pSrc
150d0 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61  ->a[i] = pSrc->a
150e0 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20  [i-extra];.     
150f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72   }.    }.    for
15100 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b  (i=0; i<nSubSrc;
15110 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72   i++){.      pSr
15120 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20  c->a[i+iFrom] = 
15130 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  pSubSrc->a[i];. 
15140 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75       memset(&pSu
15150 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73  bSrc->a[i], 0, s
15160 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61  izeof(pSubSrc->a
15170 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  [i]));.    }.   
15180 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
15190 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74  jointype = joint
151a0 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ype;.  }..  /* N
151b0 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74  ow begin substit
151c0 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72  uting subquery r
151d0 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73  esult set expres
151e0 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20  sions for .  ** 
151f0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
15200 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65  e iParent in the
15210 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
15220 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65  ** .  ** Example
15230 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45  :.  **.  **   SE
15240 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46  LECT a+5, b*10 F
15250 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20  ROM (SELECT x*3 
15260 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20  AS a, y+10 AS b 
15270 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61  FROM t1) WHERE a
15280 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20  >b;.  **   \    
15290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152a0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20   \_____________ 
152b0 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
152c0 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a  ___/          /.
152d0 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
152e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
152f0 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
15300 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15310 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a  _________/.  **.
15320 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20    ** We look at 
15330 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
15340 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
15350 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c  ery and every pl
15360 61 63 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20  ace we see.  ** 
15370 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
15380 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
15390 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
153a0 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
153b0 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20   "y+10"..  */.  
153c0 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  pList = p->pELis
153d0 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
153e0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
153f0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
15400 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  xpr;.    if( pLi
15410 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
15420 30 20 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c  0 && (pExpr = pL
15430 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
15440 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20  ->span.z!=0 ){. 
15450 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d       pList->a[i]
15460 2e 7a 4e 61 6d 65 20 3d 20 0a 20 20 20 20 20 20  .zName = .      
15470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
15480 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
15490 72 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  r*)pExpr->span.z
154a0 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29  , pExpr->span.n)
154b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 75  ;.    }.  }.  su
154c0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
154d0 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65  p->pEList, iPare
154e0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
154f0 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 29  );.  if( isAgg )
15500 7b 0a 20 20 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 47 72 6f 75  ist(db, p->pGrou
15520 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  pBy, iParent, pS
15530 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
15540 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
15550 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
15560 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
15570 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  );.  }.  if( pSu
15580 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
15590 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
155a0 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
155b0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
155c0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
155d0 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
155e0 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  y = 0;.  }else i
155f0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
15600 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  {.    substExprL
15610 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ist(db, p->pOrde
15620 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  rBy, iParent, pS
15630 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d  ub->pEList);.  }
15640 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68  .  if( pSub->pWh
15650 65 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72  ere ){.    pWher
15660 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
15670 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68  up(db, pSub->pWh
15680 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ere);.  }else{. 
15690 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
156a0 20 7d 0a 20 20 69 66 28 20 73 75 62 71 75 65 72   }.  if( subquer
156b0 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73  yIsAgg ){.    as
156c0 73 65 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67  sert( p->pHaving
156d0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48  ==0 );.    p->pH
156e0 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72  aving = p->pWher
156f0 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  e;.    p->pWhere
15700 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73   = pWhere;.    s
15710 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
15720 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
15730 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
15740 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
15750 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
15760 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
15770 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
15780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15790 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
157a0 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69  (db, pSub->pHavi
157b0 6e 67 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ng));.    assert
157c0 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
157d0 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75   );.    p->pGrou
157e0 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
157f0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75  rListDup(db, pSu
15800 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  b->pGroupBy);.  
15810 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74  }else{.    subst
15820 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65  Expr(db, p->pWhe
15830 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  re, iParent, pSu
15840 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
15850 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
15860 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
15870 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
15880 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
15890 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79   flattened query
158a0 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20   is distinct if 
158b0 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72  either the inner
158c0 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74   or the.  ** out
158d0 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74  er query is dist
158e0 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d  inct. .  */.  p-
158f0 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d  >isDistinct = p-
15900 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70  >isDistinct || p
15910 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  Sub->isDistinct;
15920 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45  ..  /*.  ** SELE
15930 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
15940 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
15950 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
15960 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 2a 2a  x OFFSET y;.  **
15970 0a 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d  .  ** One is tem
15980 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61  pted to try to a
15990 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f  dd a and b to co
159a0 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73  mbine the limits
159b0 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 2a 2a  .  But this.  **
159c0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69   does not work i
159d0 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69  f either limit i
159e0 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 2a 2f  s negative..  */
159f0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
15a00 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c  mit ){.    p->pL
15a10 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69  imit = pSub->pLi
15a20 6d 69 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  mit;.    pSub->p
15a30 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Limit = 0;.  }..
15a40 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
15a50 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
15a60 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
15a70 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
15a80 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
15a90 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
15aa0 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20  Delete(pSub);.  
15ab0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
15ac0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
15ad0 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_VIEW */../*.**
15ae0 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c   Analyze the SEL
15af0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ECT statement pa
15b00 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
15b10 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74  ent to see if it
15b20 0a 2a 2a 20 69 73 20 61 20 6d 69 6e 28 29 20 6f  .** is a min() o
15b30 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 52  r max() query. R
15b40 65 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4d 49  eturn ORDERBY_MI
15b50 4e 20 6f 72 20 4f 52 44 45 52 42 59 5f 4d 41 58  N or ORDERBY_MAX
15b60 20 69 66 20 0a 2a 2a 20 69 74 20 69 73 2c 20 6f   if .** it is, o
15b70 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20 41  r 0 otherwise. A
15b80 74 20 70 72 65 73 65 6e 74 2c 20 61 20 71 75 65  t present, a que
15b90 72 79 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ry is considered
15ba0 20 74 6f 20 62 65 0a 2a 2a 20 61 20 6d 69 6e 28   to be.** a min(
15bb0 29 2f 6d 61 78 28 29 20 71 75 65 72 79 20 69 66  )/max() query if
15bc0 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68 65  :.**.**   1. The
15bd0 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74   result set cont
15be0 61 69 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 65  ains exactly one
15bf0 20 65 6c 65 6d 65 6e 74 2c 20 65 69 74 68 65 72   element, either
15c00 20 0a 2a 2a 20 20 20 20 20 20 6d 69 6e 28 78 29   .**      min(x)
15c10 20 6f 72 20 6d 61 78 28 78 29 2c 20 77 68 65 72   or max(x), wher
15c20 65 20 78 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  e x is a column 
15c30 69 64 65 6e 74 69 66 69 65 72 2e 0a 2a 2f 0a 73  identifier..*/.s
15c40 74 61 74 69 63 20 69 6e 74 20 6d 69 6e 4d 61 78  tatic int minMax
15c50 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61  Query(Parse *pPa
15c60 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
15c70 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
15c80 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
15c90 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
15ca0 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e  .  if( pEList->n
15cb0 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
15cc0 20 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b   ORDERBY_NORMAL;
15cd0 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73  .  pExpr = pELis
15ce0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
15cf0 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
15d00 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  >pList;.  if( pE
15d10 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
15d20 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 70 45 4c 69  FUNCTION || pELi
15d30 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d  st==0 || pEList-
15d40 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
15d50 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 4c 69  rn 0;.  if( pELi
15d60 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  st->a[0].pExpr->
15d70 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
15d80 4e 20 29 20 72 65 74 75 72 6e 20 4f 52 44 45 52  N ) return ORDER
15d90 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66 28  BY_NORMAL;.  if(
15da0 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21   pExpr->token.n!
15db0 3d 33 20 29 20 72 65 74 75 72 6e 20 4f 52 44 45  =3 ) return ORDE
15dc0 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66  RBY_NORMAL;.  if
15dd0 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
15de0 70 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  p((char*)pExpr->
15df0 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29  token.z,"min",3)
15e00 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
15e10 6e 20 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20  n ORDERBY_MIN;. 
15e20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
15e30 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
15e40 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
15e50 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"max",3)==0 ){.
15e60 20 20 20 20 72 65 74 75 72 6e 20 4f 52 44 45 52      return ORDER
15e70 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20 72 65  BY_MAX;.  }.  re
15e80 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4e 4f 52  turn ORDERBY_NOR
15e90 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  MAL;.}../*.** An
15ea0 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54  alyze the SELECT
15eb0 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
15ec0 64 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d  d in as an argum
15ed0 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74  ent to see if it
15ee0 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20  .** is a simple 
15ef0 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
15f00 75 65 72 79 2e 20 20 49 66 20 69 74 20 69 73 20  uery.  If it is 
15f10 61 6e 64 20 74 68 69 73 20 71 75 65 72 79 20 63  and this query c
15f20 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69  an be.** satisfi
15f30 65 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  ed using a singl
15f40 65 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65  e seek to the be
15f50 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f  ginning or end o
15f60 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74  f an index,.** t
15f70 68 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65  hen generate the
15f80 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53   code for this S
15f90 45 4c 45 43 54 20 61 6e 64 20 72 65 74 75 72 6e  ELECT and return
15fa0 20 31 2e 20 20 49 66 20 74 68 69 73 20 69 73 20   1.  If this is 
15fb0 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65  not a .** simple
15fc0 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
15fd0 71 75 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75  query, then retu
15fe0 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69  rn 0;.**.** A si
15ff0 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mply min() or ma
16000 78 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20  x() query looks 
16010 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
16020 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61      SELECT min(a
16030 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a  ) FROM table;.**
16040 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61      SELECT max(a
16050 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a  ) FROM table;.**
16060 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61  .** The query ma
16070 79 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69  y have only a si
16080 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74  ngle table in it
16090 73 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e  s FROM argument.
160a0 20 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62    There.** can b
160b0 65 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72  e no GROUP BY or
160c0 20 48 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45   HAVING or WHERE
160d0 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72   clauses.  The r
160e0 65 73 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a  esult set must.*
160f0 2a 20 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f  * be the min() o
16100 72 20 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e  r max() of a sin
16110 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  gle column of th
16120 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f  e table.  The co
16130 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d  lumn.** in the m
16140 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75  in() or max() fu
16150 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69  nction must be i
16160 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ndexed..**.** Th
16170 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20  e parameters to 
16180 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65  this routine are
16190 20 74 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72   the same as for
161a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
161b0 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
161c0 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  der comment on t
161d0 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  hat routine for 
161e0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
161f0 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 20 30  mation..*/.#if 0
16200 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d 70  .static int simp
16210 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50 61  leMinMaxQuery(Pa
16220 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
16230 65 63 74 20 2a 70 2c 20 53 65 6c 65 63 74 44 65  ect *p, SelectDe
16240 73 74 20 2a 70 44 65 73 74 29 7b 0a 20 20 45 78  st *pDest){.  Ex
16250 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74  pr *pExpr;.  int
16260 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a   iCol;.  Table *
16270 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pTab;.  Index *p
16280 49 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b  Idx;.  int base;
16290 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
162a0 74 20 73 65 65 6b 4f 70 3b 0a 20 20 45 78 70 72  t seekOp;.  Expr
162b0 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 2a 70  List *pEList, *p
162c0 4c 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20 20 73  List, eList;.  s
162d0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
162e0 74 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a 20  tem eListItem;. 
162f0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
16300 20 20 69 6e 74 20 62 72 6b 3b 0a 20 20 69 6e 74    int brk;.  int
16310 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63   iDb;..  /* Chec
16320 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  k to see if this
16330 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70   query is a simp
16340 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  le min() or max(
16350 29 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e  ) query.  Return
16360 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74  .  ** zero if it
16370 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20   is  not..  */. 
16380 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79   if( p->pGroupBy
16390 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c   || p->pHaving |
163a0 7c 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  | p->pWhere ) re
163b0 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
163c0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20   p->pSrc;.  if( 
163d0 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
163e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69  return 0;.  pELi
163f0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
16400 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45    if( pEList->nE
16410 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
16420 30 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c  0;.  pExpr = pEL
16430 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
16440 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
16450 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  !=TK_AGG_FUNCTIO
16460 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
16470 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
16480 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73  List;.  if( pLis
16490 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e  t==0 || pList->n
164a0 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
164b0 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
164c0 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65  >token.n!=3 ) re
164d0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71  turn 0;.  if( sq
164e0 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63  lite3StrNICmp((c
164f0 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
16500 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20  n.z,"min",3)==0 
16510 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  ){.    seekOp = 
16520 4f 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c  OP_Rewind;.  }el
16530 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
16540 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45  rNICmp((char*)pE
16550 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61  xpr->token.z,"ma
16560 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  x",3)==0 ){.    
16570 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74  seekOp = OP_Last
16580 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
16590 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
165a0 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
165b0 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
165c0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
165d0 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  LUMN ) return 0;
165e0 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  .  iCol = pExpr-
165f0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62  >iColumn;.  pTab
16600 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54   = pSrc->a[0].pT
16610 61 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6f  ab;..  /* This o
16620 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e  ptimization cann
16630 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
16640 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20  virtual tables. 
16650 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
16660 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
16670 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  n 0;..  /* If we
16680 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74   get to here, it
16690 20 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79   means the query
166a0 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65   is of the corre
166b0 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68  ct form..  ** Ch
166c0 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
166d0 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65   we have an inde
166e0 78 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20  x and make pIdx 
166f0 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  point to the.  *
16700 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e  * appropriate in
16710 64 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e  dex.  If the min
16720 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
16730 6e 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  n an INTEGER PRI
16740 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f  MARY.  ** key co
16750 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69  lumn, no index i
16760 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73  s necessary so s
16770 65 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e  et pIdx to NULL.
16780 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61    If no.  ** usa
16790 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75  ble index is fou
167a0 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  nd, return 0..  
167b0 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  */.  if( iCol<0 
167c0 29 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b  ){.    pIdx = 0;
167d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f  .  }else{.    Co
167e0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
167f0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
16800 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  q(pParse, pExpr)
16810 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d  ;.    if( pColl=
16820 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
16830 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
16840 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
16850 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
16860 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
16870 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
16880 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
16890 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
168a0 3d 3d 69 43 6f 6c 20 26 26 20 0a 20 20 20 20 20  ==iCol && .     
168b0 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53       0==sqlite3S
168c0 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 61 7a 43  trICmp(pIdx->azC
168d0 6f 6c 6c 5b 30 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a  oll[0], pColl->z
168e0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
168f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
16900 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
16910 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  dx==0 ) return 0
16920 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e  ;.  }..  /* Iden
16930 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70 65  tify column type
16940 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20  s if we will be 
16950 75 73 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61  using the callba
16960 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73  ck.  This.  ** s
16970 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69  tep is skipped i
16980 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
16990 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65  going to a table
169a0 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   or a memory cel
169b0 6c 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6c 75  l..  ** The colu
169c0 6d 6e 20 6e 61 6d 65 73 20 68 61 76 65 20 61 6c  mn names have al
169d0 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72  ready been gener
169e0 61 74 65 64 20 69 6e 20 74 68 65 20 63 61 6c 6c  ated in the call
169f0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  ing function..  
16a00 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
16a10 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
16a20 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
16a30 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  turn 0;..  /* If
16a40 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
16a50 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
16a60 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
16a70 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
16a80 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
16a90 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ->eDest==SRT_Eph
16aa0 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  emTab ){.    sql
16ab0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16ac0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
16ad0 61 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  al, pDest->iParm
16ae0 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 1);.  }..  /* 
16af0 47 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20  Generating code 
16b00 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 20  to find the min 
16b10 6f 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61 73  or the max.  Bas
16b20 69 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61  ically all we ha
16b30 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73  ve.  ** to do is
16b40 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20   find the first 
16b50 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  or the last entr
16b60 79 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e 20  y in the chosen 
16b70 69 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20  index.  If.  ** 
16b80 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
16b90 28 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e 54  () is on the INT
16ba0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
16bb0 2c 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65 20  , then find the 
16bc0 66 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61  first.  ** or la
16bd0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
16be0 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  main table..  */
16bf0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
16c00 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
16c10 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
16c20 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65  pSchema);.  asse
16c30 72 74 28 20 69 44 62 3e 3d 30 20 7c 7c 20 70 54  rt( iDb>=0 || pT
16c40 61 62 2d 3e 69 73 45 70 68 65 6d 20 29 3b 0a 20  ab->isEphem );. 
16c50 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
16c60 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
16c70 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
16c80 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
16c90 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
16ca0 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
16cb0 65 29 3b 0a 20 20 62 61 73 65 20 3d 20 70 53 72  e);.  base = pSr
16cc0 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b  c->a[0].iCursor;
16cd0 0a 20 20 62 72 6b 20 3d 20 73 71 6c 69 74 65 33  .  brk = sqlite3
16ce0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
16cf0 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
16d00 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
16d10 2c 20 70 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28  , p, brk);.  if(
16d20 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c   pSrc->a[0].pSel
16d30 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
16d40 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
16d50 50 61 72 73 65 2c 20 62 61 73 65 2c 20 69 44 62  Parse, base, iDb
16d60 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
16d70 65 61 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ead);.  }.  if( 
16d80 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pIdx==0 ){.    s
16d90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16da0 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65  (v, seekOp, base
16db0 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
16dc0 20 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67     /* Even thoug
16dd0 68 20 74 68 65 20 63 75 72 73 6f 72 20 75 73 65  h the cursor use
16de0 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 69 6e  d to open the in
16df0 64 65 78 20 68 65 72 65 20 69 73 20 63 6c 6f 73  dex here is clos
16e00 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 73 6f 6f  ed.    ** as soo
16e10 6e 20 61 73 20 61 20 73 69 6e 67 6c 65 20 76 61  n as a single va
16e20 6c 75 65 20 68 61 73 20 62 65 65 6e 20 72 65 61  lue has been rea
16e30 64 20 66 72 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63  d from it, alloc
16e40 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 75 73  ate it.    ** us
16e50 69 6e 67 20 28 70 50 61 72 73 65 2d 3e 6e 54 61  ing (pParse->nTa
16e60 62 2b 2b 29 20 74 6f 20 70 72 65 76 65 6e 74 20  b++) to prevent 
16e70 74 68 65 20 63 75 72 73 6f 72 20 69 64 20 66 72  the cursor id fr
16e80 6f 6d 20 62 65 69 6e 67 20 0a 20 20 20 20 2a 2a  om being .    **
16e90 20 72 65 75 73 65 64 2e 20 54 68 69 73 20 69 73   reused. This is
16ea0 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20 73   important for s
16eb0 74 61 74 65 6d 65 6e 74 73 20 6f 66 20 74 68 65  tatements of the
16ec0 20 66 6f 72 6d 20 0a 20 20 20 20 2a 2a 20 22 49   form .    ** "I
16ed0 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 53 45 4c  NSERT INTO x SEL
16ee0 45 43 54 20 6d 61 78 28 29 20 46 52 4f 4d 20 78  ECT max() FROM x
16ef0 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  "..    */.    in
16f00 74 20 69 49 64 78 3b 0a 20 20 20 20 4b 65 79 49  t iIdx;.    KeyI
16f10 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69  nfo *pKey = sqli
16f20 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
16f30 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20  pParse, pIdx);. 
16f40 20 20 20 69 49 64 78 20 3d 20 70 50 61 72 73 65     iIdx = pParse
16f50 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 61 73  ->nTab++;.    as
16f60 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68  sert( pIdx->pSch
16f70 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
16f80 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ma );.    sqlite
16f90 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
16fa0 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78  P_OpenRead, iIdx
16fb0 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
16fc0 62 2c 0a 20 20 20 20 20 20 20 20 28 63 68 61 72  b,.        (char
16fd0 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
16fe0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
16ff0 20 69 66 28 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f   if( seekOp==OP_
17000 52 65 77 69 6e 64 20 29 7b 0a 20 20 20 20 20 20  Rewind ){.      
17010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17020 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
17030 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
17040 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17050 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31  OP_MakeRecord, 1
17060 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 65 65 6b  , 0);.      seek
17070 4f 70 20 3d 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a  Op = OP_MoveGt;.
17080 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
17090 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  dx->aSortOrder[0
170a0 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  ]==SQLITE_SO_DES
170b0 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 69  C ){.      /* Ti
170c0 63 6b 65 74 20 23 32 35 31 34 3a 20 69 6e 76 65  cket #2514: inve
170d0 72 74 20 74 68 65 20 73 65 65 6b 20 6f 70 65 72  rt the seek oper
170e0 61 74 6f 72 20 69 66 20 77 65 20 61 72 65 20 75  ator if we are u
170f0 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 20  sing.      ** a 
17100 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78  descending index
17110 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  . */.      if( s
17120 65 65 6b 4f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29  eekOp==OP_Last )
17130 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6b 4f 70  {.        seekOp
17140 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20 20   = OP_Rewind;.  
17150 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17160 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6b 4f     assert( seekO
17170 70 3d 3d 4f 50 5f 4d 6f 76 65 47 74 20 29 3b 0a  p==OP_MoveGt );.
17180 20 20 20 20 20 20 20 20 73 65 65 6b 4f 70 20 3d          seekOp =
17190 20 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20 20 20 20   OP_MoveLt;.    
171a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
171b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
171c0 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64 78 2c  v, seekOp, iIdx,
171d0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
171e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
171f0 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 2c  _IdxRowid, iIdx,
17200 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
17210 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17220 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29  _Close, iIdx, 0)
17230 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17240 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f  eAddOp2(v, OP_Mo
17250 76 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a  veGe, base, 0);.
17260 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70    }.  eList.nExp
17270 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  r = 1;.  memset(
17280 26 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73  &eListItem, 0, s
17290 69 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29  izeof(eListItem)
172a0 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26  );.  eList.a = &
172b0 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69  eListItem;.  eLi
172c0 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20  st.a[0].pExpr = 
172d0 70 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49  pExpr;.  selectI
172e0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
172f0 20 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30   p, &eList, 0, 0
17300 2c 20 30 2c 20 2d 31 2c 20 70 44 65 73 74 2c 20  , 0, -1, pDest, 
17310 62 72 6b 2c 20 62 72 6b 2c 20 30 29 3b 0a 20 20  brk, brk, 0);.  
17320 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
17330 76 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b  veLabel(v, brk);
17340 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17350 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
17360 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 0a 20  , base, 0);.  . 
17370 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
17380 64 69 66 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  dif ../*.** This
17390 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76 65   routine resolve
173a0 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73 65 64  s any names used
173b0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
173c0 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75 70  et of the.** sup
173d0 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73 74 61  plied SELECT sta
173e0 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 53  tement. If the S
173f0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
17400 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64 0a 2a  being resolved.*
17410 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  * is a sub-selec
17420 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72 4e 43  t, then pOuterNC
17430 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
17440 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65 78 74   the NameContext
17450 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65   .** of the pare
17460 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69 6e  nt SELECT..*/.in
17470 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52  t sqlite3SelectR
17480 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73 65 20  esolve(.  Parse 
17490 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
174a0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
174b0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
174c0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
174d0 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
174e0 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
174f0 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
17500 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
17510 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74 65 72  NC  /* The outer
17520 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 4d   name context. M
17530 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29  ay be NULL. */.)
17540 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  {.  ExprList *pE
17550 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  List;          /
17560 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f  * Result set. */
17570 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
17580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17590 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69 61 62   For-loop variab
175a0 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c 74 69  le used in multi
175b0 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a 20 20  ple places */.  
175c0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
175d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
175e0 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  cal name-context
175f0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
17600 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20 20 20  pGroupBy;       
17610 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20 62 79   /* The group by
17620 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a   clause */..  /*
17630 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
17640 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65 2c   has run before,
17650 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
17660 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ely. */.  if( p-
17670 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b 0a 20  >isResolved ){. 
17680 20 20 20 61 73 73 65 72 74 28 20 21 70 4f 75 74     assert( !pOut
17690 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65 74 75  erNC );.    retu
176a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
176b0 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65  }.  p->isResolve
176c0 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  d = 1;..  /* If 
176d0 74 68 65 72 65 20 68 61 76 65 20 61 6c 72 65 61  there have alrea
176e0 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73 2c 20  dy been errors, 
176f0 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20  do nothing. */. 
17700 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
17710 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  r>0 ){.    retur
17720 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
17730 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72    }..  /* Prepar
17740 65 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61  e the select sta
17750 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63 61 6c  tement. This cal
17760 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65 20  l will allocate 
17770 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  all cursors.  **
17780 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e   required to han
17790 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73 20 61  dle the tables a
177a0 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  nd subqueries in
177b0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
177c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65  ..  */.  if( pre
177d0 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72  pSelectStmt(pPar
177e0 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65  se, p) ){.    re
177f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
17800 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  R;.  }..  /* Res
17810 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73 73  olve the express
17820 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d 49  ions in the LIMI
17830 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
17840 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20 2a 2a  uses. These.  **
17850 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
17860 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e 79   to refer to any
17870 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73 20   names, so pass 
17880 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f 6e  an empty NameCon
17890 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  text..  */.  mem
178a0 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
178b0 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
178c0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
178d0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
178e0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
178f0 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  &sNC, p->pLimit)
17900 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ||.      sqlite
17910 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
17920 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73  s(&sNC, p->pOffs
17930 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  et) ){.    retur
17940 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
17950 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70    }..  /* Set up
17960 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d   the local name-
17970 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73 20  context to pass 
17980 74 6f 20 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  to ExprResolveNa
17990 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65  mes() to.  ** re
179a0 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73  solve the expres
179b0 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  sion-list..  */.
179c0 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d    sNC.allowAgg =
179d0 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69   1;.  sNC.pSrcLi
179e0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
179f0 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74  sNC.pNext = pOut
17a00 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f  erNC;..  /* Reso
17a10 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 65  lve names in the
17a20 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a   result set. */.
17a30 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
17a40 4c 69 73 74 3b 0a 20 20 69 66 28 20 21 70 45 4c  List;.  if( !pEL
17a50 69 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ist ) return SQL
17a60 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72  ITE_ERROR;.  for
17a70 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
17a80 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
17a90 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45 4c 69   Expr *pX = pELi
17aa0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
17ab0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
17ac0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
17ad0 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20 20 20  &sNC, pX) ){.   
17ae0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17af0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
17b00 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
17b10 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67 61 74   are no aggregat
17b20 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74  e functions in t
17b30 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c 20 61  he result-set, a
17b40 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 0a  nd no GROUP BY .
17b50 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c    ** expression,
17b60 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67   do not allow ag
17b70 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e 79 20  gregates in any 
17b80 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65 78 70  of the other exp
17b90 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
17ba0 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73 41   assert( !p->isA
17bb0 67 67 20 29 3b 0a 20 20 70 47 72 6f 75 70 42 79  gg );.  pGroupBy
17bc0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
17bd0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 7c    if( pGroupBy |
17be0 7c 20 73 4e 43 2e 68 61 73 41 67 67 20 29 7b 0a  | sNC.hasAgg ){.
17bf0 20 20 20 20 70 2d 3e 69 73 41 67 67 20 3d 20 31      p->isAgg = 1
17c00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
17c10 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b  NC.allowAgg = 0;
17c20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20  .  }..  /* If a 
17c30 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73  HAVING clause is
17c40 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74   present, then t
17c50 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 47  here must be a G
17c60 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a  ROUP BY clause..
17c70 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48    */.  if( p->pH
17c80 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f 75 70  aving && !pGroup
17c90 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
17ca0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
17cb0 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c  , "a GROUP BY cl
17cc0 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64  ause is required
17cd0 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29   before HAVING")
17ce0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
17cf0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
17d00 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 78 70    /* Add the exp
17d10 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
17d20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  the name-context
17d30 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e 67 20   before parsing 
17d40 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 65  the.  ** other e
17d50 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
17d60 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
17d70 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f 20 74  nt. This is so t
17d80 68 61 74 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  hat.  ** express
17d90 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52  ions in the WHER
17da0 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e 29 20  E clause (etc.) 
17db0 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65 78 70  can refer to exp
17dc0 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20 2a 2a  ressions by.  **
17dd0 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68 65 20   aliases in the 
17de0 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2a  result set..  **
17df0 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e  .  ** Minor poin
17e00 74 3a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  t: If this is th
17e10 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
17e20 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c   expression will
17e30 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76 61 6c   be.  ** re-eval
17e40 75 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 72  uated for each r
17e50 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a  eference to it..
17e60 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c 69 73    */.  sNC.pELis
17e70 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
17e80 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
17e90 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
17ea0 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20 7c 7c  C, p->pWhere) ||
17eb0 0a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  .     sqlite3Exp
17ec0 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
17ed0 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 20  NC, p->pHaving) 
17ee0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
17ef0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
17f00 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
17f10 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 72  =0 ){.    if( pr
17f20 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42  ocessOrderGroupB
17f30 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  y(pParse, p, p->
17f40 70 4f 72 64 65 72 42 79 2c 20 31 2c 20 26 73 4e  pOrderBy, 1, &sN
17f50 43 2e 68 61 73 41 67 67 29 20 29 7b 0a 20 20 20  C.hasAgg) ){.   
17f60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17f70 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
17f80 7d 0a 20 20 69 66 28 20 70 72 6f 63 65 73 73 4f  }.  if( processO
17f90 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72  rderGroupBy(pPar
17fa0 73 65 2c 20 70 2c 20 70 47 72 6f 75 70 42 79 2c  se, p, pGroupBy,
17fb0 20 30 2c 20 26 73 4e 43 2e 68 61 73 41 67 67 29   0, &sNC.hasAgg)
17fc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
17fd0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
17fe0 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
17ff0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18000 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18010 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
18020 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
18030 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
18040 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ause does not co
18050 6e 74 61 69 6e 20 61 67 67 72 65 67 61 74 65 20  ntain aggregate 
18060 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  functions..  */.
18070 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
18080 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
18090 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
180a0 6d 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28 69 3d  m;.  .    for(i=
180b0 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42  0, pItem=pGroupB
180c0 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70 42 79  y->a; i<pGroupBy
180d0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
180e0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  tem++){.      if
180f0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
18100 79 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  y(pItem->pExpr, 
18110 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20 20  EP_Agg) ){.     
18120 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
18130 73 67 28 70 50 61 72 73 65 2c 20 22 61 67 67 72  sg(pParse, "aggr
18140 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
18150 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  are not allowed 
18160 69 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  in ".           
18170 20 22 74 68 65 20 47 52 4f 55 50 20 42 59 20 63   "the GROUP BY c
18180 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 20 20 20  lause");.       
18190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
181a0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
181b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
181c0 20 74 68 69 73 20 69 73 20 6f 6e 65 20 53 45 4c   this is one SEL
181d0 45 43 54 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  ECT of a compoun
181e0 64 2c 20 62 65 20 73 75 72 65 20 74 6f 20 72 65  d, be sure to re
181f0 73 6f 6c 76 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  solve names.  **
18200 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 53 45   in the other SE
18210 4c 45 43 54 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  LECTs..  */.  if
18220 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
18230 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
18240 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70  3SelectResolve(p
18250 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
18260 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 7d  , pOuterNC);.  }
18270 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
18280 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
18290 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74  }../*.** Reset t
182a0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
182b0 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  umulator..**.** 
182c0 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  The aggregate ac
182d0 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73  cumulator is a s
182e0 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  et of memory cel
182f0 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20  ls that hold.** 
18300 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
18310 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75  ults while calcu
18320 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67  lating an aggreg
18330 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ate.  This.** ro
18340 75 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f  utine simply sto
18350 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c  res NULLs in all
18360 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79   of those memory
18370 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
18380 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75  c void resetAccu
18390 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
183a0 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
183b0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
183c0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
183d0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
183e0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
183f0 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69  func *pFunc;.  i
18400 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  f( pAggInfo->nFu
18410 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f  nc+pAggInfo->nCo
18420 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72  lumn==0 ){.    r
18430 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72  eturn;.  }.  for
18440 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
18450 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
18460 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18470 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
18480 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  l, 0, pAggInfo->
18490 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20  aCol[i].iMem);. 
184a0 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70   }.  for(pFunc=p
184b0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20  AggInfo->aFunc, 
184c0 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
184d0 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75  >nFunc; i++, pFu
184e0 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  nc++){.    sqlit
184f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18500 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46 75 6e  OP_Null, 0, pFun
18510 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 69 66  c->iMem);.    if
18520 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  ( pFunc->iDistin
18530 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ct>=0 ){.      E
18540 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d  xpr *pE = pFunc-
18550 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  >pExpr;.      if
18560 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c  ( pE->pList==0 |
18570 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  | pE->pList->nEx
18580 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr!=1 ){.       
18590 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
185a0 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
185b0 43 54 20 69 6e 20 61 67 67 72 65 67 61 74 65 20  CT in aggregate 
185c0 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64  must be followed
185d0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 62   ".           "b
185e0 79 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22  y an expression"
185f0 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63  );.        pFunc
18600 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
18610 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18620 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
18630 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
18640 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
18650 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74  Parse, pE->pList
18660 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18670 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
18680 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
18690 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  , pFunc->iDistin
186a0 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
186b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186c0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
186d0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
186e0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
186f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
18700 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
18710 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f  OP_AggFinalize o
18720 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  pcode for every 
18730 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
18740 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67  on.** in the Agg
18750 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
18760 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
18770 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
18780 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ons(Parse *pPars
18790 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
187a0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
187b0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
187c0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
187d0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
187e0 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   *pF;.  for(i=0,
187f0 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
18800 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
18810 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
18820 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  +){.    ExprList
18830 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
18840 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
18850 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18860 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c  4(v, OP_AggFinal
18870 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73  , pF->iMem, pLis
18880 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
18890 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20   : 0, 0,.       
188a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
188b0 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
188c0 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
188d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74  }.}../*.** Updat
188e0 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  e the accumulato
188f0 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  r memory cells f
18900 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  or an aggregate 
18910 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20  based on.** the 
18920 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
18930 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  osition..*/.stat
18940 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63  ic void updateAc
18950 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
18960 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
18970 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
18980 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
18990 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
189a0 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
189b0 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74  o_func *pF;.  st
189c0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
189d0 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66   *pC;..  pAggInf
189e0 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
189f0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  1;.  for(i=0, pF
18a00 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
18a10 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
18a20 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
18a30 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
18a40 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20     int addrNext 
18a50 3d 20 30 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  = 0;.    ExprLis
18a60 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
18a70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
18a80 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
18a90 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74      nArg = pList
18aa0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
18ab0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
18ac0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
18ad0 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65  List, 0);.    }e
18ae0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  lse{.      nArg 
18af0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
18b00 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  f( pF->iDistinct
18b10 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
18b20 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
18b30 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18b40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
18b50 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Arg==1 );.      
18b60 63 6f 64 65 44 69 73 74 69 6e 63 74 5f 4f 4c 44  codeDistinct_OLD
18b70 28 76 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  (v, pF->iDistinc
18b80 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 29 3b  t, addrNext, 1);
18b90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
18ba0 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f  F->pFunc->needCo
18bb0 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 43  llSeq ){.      C
18bc0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
18bd0 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  0;.      struct 
18be0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
18bf0 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Item;.      int 
18c00 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  j;.      assert(
18c10 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a   pList!=0 );  /*
18c20 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d   pList!=0 if pF-
18c30 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c  >pFunc->needColl
18c40 53 65 71 20 69 73 20 74 72 75 65 20 2a 2f 0a 20  Seq is true */. 
18c50 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
18c60 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70  tem=pList->a; !p
18c70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20  Coll && j<nArg; 
18c80 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
18c90 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
18ca0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
18cb0 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
18cc0 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >pExpr);.      }
18cd0 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
18ce0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
18cf0 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
18d00 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
18d10 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
18d20 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
18d30 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
18d40 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
18d50 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
18d60 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
18d70 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
18d80 50 5f 41 67 67 53 74 65 70 2c 20 70 46 2d 3e 69  P_AggStep, pF->i
18d90 4d 65 6d 2c 20 6e 41 72 67 2c 20 30 2c 20 0a 20  Mem, nArg, 0, . 
18da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18db0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
18dc0 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
18dd0 46 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  F);.    if( addr
18de0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71  Next ){.      sq
18df0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
18e00 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78  Label(v, addrNex
18e10 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
18e20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67  for(i=0, pC=pAgg
18e30 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41  Info->aCol; i<pA
18e40 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
18e50 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29  ator; i++, pC++)
18e60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
18e70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43  rCode(pParse, pC
18e80 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65  ->pExpr, pC->iMe
18e90 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e  m);.  }.  pAggIn
18ea0 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
18eb0 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   0;.}..#ifndef S
18ec0 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
18ed0 45 52 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ER./*.** This fu
18ee0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 77  nction is used w
18ef0 68 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  hen a SELECT sta
18f00 74 65 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74  tement is used t
18f10 6f 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 74 65  o create a.** te
18f20 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 66 6f  mporary table fo
18f30 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
18f40 75 67 68 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ugh when running
18f50 20 61 6e 20 49 4e 53 54 45 41 44 20 4f 46 0a 2a   an INSTEAD OF.*
18f60 2a 20 55 50 44 41 54 45 20 6f 72 20 49 4e 53 54  * UPDATE or INST
18f70 45 41 44 20 4f 46 20 44 45 4c 45 54 45 20 74 72  EAD OF DELETE tr
18f80 69 67 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  igger. .**.** If
18f90 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 53   possible, the S
18fa0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
18fb0 69 73 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74  is modified so t
18fc0 68 61 74 20 4e 55 4c 4c 20 76 61 6c 75 65 73 0a  hat NULL values.
18fd0 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
18fe0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
18ff0 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 63 6f 6c  able for all col
19000 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20 74  umns for which t
19010 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  he .** correspon
19020 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75  ding bit in argu
19030 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 6e 6f 74  ment mask is not
19040 20 73 65 74 2e 20 49 66 20 6d 61 73 6b 20 74 61   set. If mask ta
19050 6b 65 73 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  kes the.** speci
19060 61 6c 20 76 61 6c 75 65 20 30 78 66 66 66 66 66  al value 0xfffff
19070 66 66 66 2c 20 74 68 65 6e 20 61 6c 6c 20 63 6f  fff, then all co
19080 6c 75 6d 6e 73 20 61 72 65 20 70 6f 70 75 6c 61  lumns are popula
19090 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
190a0 74 65 33 53 65 6c 65 63 74 4d 61 73 6b 28 50 61  te3SelectMask(Pa
190b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
190c0 65 63 74 20 2a 70 2c 20 75 33 32 20 6d 61 73 6b  ect *p, u32 mask
190d0 29 7b 0a 20 20 69 66 28 20 21 70 2d 3e 70 50 72  ){.  if( !p->pPr
190e0 69 6f 72 20 26 26 20 21 70 2d 3e 69 73 44 69 73  ior && !p->isDis
190f0 74 69 6e 63 74 20 26 26 20 6d 61 73 6b 21 3d 30  tinct && mask!=0
19100 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
19110 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
19120 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
19130 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
19140 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
19150 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20 20  e, p, 0) ){.    
19160 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19170 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
19180 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
19190 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ist;.    for(i=0
191a0 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
191b0 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b  r && i<32; i++){
191c0 0a 20 20 20 20 20 20 69 66 28 20 21 28 6d 61 73  .      if( !(mas
191d0 6b 26 28 28 75 33 32 29 31 3c 3c 69 29 29 20 29  k&((u32)1<<i)) )
191e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
191f0 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 4c 69  3ExprDelete(pELi
19200 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
19210 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d  .        pEList-
19220 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71  >a[i].pExpr = sq
19230 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73 65  lite3Expr(pParse
19240 2d 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30  ->db, TK_NULL, 0
19250 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
19260 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
19270 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19280 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
19290 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
192a0 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43   the given SELEC
192b0 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  T statement..**.
192c0 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  ** The results a
192d0 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20 69  re distributed i
192e0 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73 20 64  n various ways d
192f0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a  epending on the.
19300 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
19310 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74  he SelectDest st
19320 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
19330 74 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70  to by argument p
19340 44 65 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f  Dest.** as follo
19350 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44  ws:.**.**     pD
19360 65 73 74 2d 3e 65 44 65 73 74 20 20 20 20 52 65  est->eDest    Re
19370 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d  sult.**     ----
19380 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
19390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
193a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
193b0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53  -------.**     S
193c0 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49  RT_Callback    I
193d0 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61  nvoke the callba
193e0 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  ck for each row 
193f0 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  of the result..*
19400 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d  *.**     SRT_Mem
19410 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66           Store f
19420 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d  irst result in m
19430 65 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74  emory cell pDest
19440 2d 3e 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  ->iParm.**.**   
19450 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20    SRT_Set       
19460 20 20 53 74 6f 72 65 20 6e 6f 6e 2d 6e 75 6c 6c    Store non-null
19470 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73   results as keys
19480 20 6f 66 20 74 61 62 6c 65 20 70 44 65 73 74 2d   of table pDest-
19490 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20  >iParm. .**     
194a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194b0 41 70 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69  Apply the affini
194c0 74 79 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69  ty pDest->affini
194d0 74 79 20 62 65 66 6f 72 65 20 73 74 6f 72 69 6e  ty before storin
194e0 67 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20  g them..**.**   
194f0 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20    SRT_Union     
19500 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
19510 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65  as a key in a te
19520 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
19530 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  est->iParm..**.*
19540 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74  *     SRT_Except
19550 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73        Remove res
19560 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65  ults from the te
19570 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
19580 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  est->iParm..**.*
19590 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20  *     SRT_Table 
195a0 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
195b0 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  lts in temporary
195c0 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
195d0 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  arm.**.**     SR
195e0 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20 43 72  T_EphemTab    Cr
195f0 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72 61 72  eate an temporar
19600 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
19610 50 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a  Parm and store.*
19620 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
19630 20 20 20 20 20 20 74 68 65 20 72 65 73 75 6c 74        the result
19640 20 74 68 65 72 65 2e 20 54 68 65 20 63 75 72 73   there. The curs
19650 6f 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20  or is left open 
19660 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  after.**        
19670 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
19680 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  urning..**.**   
19690 20 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65    SRT_Subroutine
196a0 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20 72    For each row r
196b0 65 74 75 72 6e 65 64 2c 20 70 75 73 68 20 74 68  eturned, push th
196c0 65 20 72 65 73 75 6c 74 73 20 6f 6e 74 6f 20 74  e results onto t
196d0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
196e0 20 20 20 20 20 20 20 20 20 20 76 64 62 65 20 73            vdbe s
196f0 74 61 63 6b 20 61 6e 64 20 63 61 6c 6c 20 74 68  tack and call th
19700 65 20 73 75 62 72 6f 75 74 69 6e 65 20 28 76 69  e subroutine (vi
19710 61 20 4f 50 5f 47 6f 73 75 62 29 0a 2a 2a 20 20  a OP_Gosub).**  
19720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19730 20 20 20 61 74 20 61 64 64 72 65 73 73 20 70 44     at address pD
19740 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  est->iParm..**.*
19750 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73 74 73  *     SRT_Exists
19760 20 20 20 20 20 20 53 74 6f 72 65 20 61 20 31 20        Store a 1 
19770 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70  in memory cell p
19780 44 65 73 74 2d 3e 69 50 61 72 6d 20 69 66 20 74  Dest->iParm if t
19790 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20  he result.**    
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197b0 20 73 65 74 20 69 73 20 6e 6f 74 20 65 6d 70 74   set is not empt
197c0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  y..**.**     SRT
197d0 5f 44 69 73 63 61 72 64 20 20 20 20 20 54 68 72  _Discard     Thr
197e0 6f 77 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  ow the results a
197f0 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74  way..**.** See t
19800 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
19810 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  op() function fo
19820 72 20 61 20 63 61 6e 6f 6e 69 63 61 6c 20 6c 69  r a canonical li
19830 73 74 69 6e 67 20 6f 66 20 74 68 65 20 0a 2a 2a  sting of the .**
19840 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   allowed values 
19850 6f 66 20 65 44 65 73 74 20 61 6e 64 20 74 68 65  of eDest and the
19860 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a  ir meanings..**.
19870 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19880 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
19890 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  er of errors.  I
198a0 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
198b0 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c  .** encountered,
198c0 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72   then an appropr
198d0 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  iate error messa
198e0 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a  ge is left in.**
198f0 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
19900 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
19910 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72  tine does NOT fr
19920 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74  ee the Select st
19930 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69  ructure passed i
19940 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  n.  The.** calli
19950 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64  ng function need
19960 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a  s to do that..**
19970 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c  .** The pParent,
19980 20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20   parentTab, and 
19990 2a 70 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c  *pParentAgg fiel
199a0 64 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e  ds are filled in
199b0 20 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45   if this.** SELE
199c0 43 54 20 69 73 20 61 20 73 75 62 71 75 65 72 79  CT is a subquery
199d0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
199e0 6d 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69  may try to combi
199f0 6e 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a  ne this SELECT.*
19a00 2a 20 77 69 74 68 20 69 74 73 20 70 61 72 65 6e  * with its paren
19a10 74 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67  t to form a sing
19a20 6c 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20  le flat query.  
19a30 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20  In so doing, it 
19a40 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20  might.** change 
19a50 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
19a60 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72   from a non-aggr
19a70 65 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72  egate to an aggr
19a80 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20  egate query..** 
19a90 46 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  For that reason,
19aa0 20 74 68 65 20 70 50 61 72 65 6e 74 41 67 67 20   the pParentAgg 
19ab0 66 6c 61 67 20 69 73 20 70 61 73 73 65 64 20 61  flag is passed a
19ac0 73 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20  s a pointer, so 
19ad0 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61  it.** can be cha
19ae0 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  nged..**.** Exam
19af0 70 6c 65 20 31 3a 20 20 20 54 68 65 20 6d 65 61  ple 1:   The mea
19b00 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 50 61 72  ning of the pPar
19b10 65 6e 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ent parameter..*
19b20 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
19b30 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53   FROM t1 JOIN (S
19b40 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a  ELECT x, count(*
19b50 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20  ) FROM t2) JOIN 
19b60 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20  t3;.**    \     
19b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b80 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65   \_______ subque
19b90 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  ry _______/     
19ba0 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20     /.**     \   
19bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19be0 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f     /.**      \__
19bf0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
19c00 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
19c10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
19c20 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  __/.**.** This r
19c30 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
19c40 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71   for the outer q
19c50 75 65 72 79 20 66 69 72 73 74 2e 20 20 20 46 6f  uery first.   Fo
19c60 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20  r that call,.** 
19c70 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 62 65 20  pParent will be 
19c80 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74 68  NULL.  During th
19c90 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20  e processing of 
19ca0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2c  the outer query,
19cb0 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e   this .** routin
19cc0 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75  e is called recu
19cd0 72 73 69 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c  rsively to handl
19ce0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20  e the subquery. 
19cf0 20 46 6f 72 20 74 68 65 20 72 65 63 75 72 73 69   For the recursi
19d00 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72  ve.** call, pPar
19d10 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74  ent will point t
19d20 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
19d30 79 2e 20 20 42 65 63 61 75 73 65 20 74 68 65 20  y.  Because the 
19d40 73 75 62 71 75 65 72 79 20 69 73 0a 2a 2a 20 74  subquery is.** t
19d50 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  he second elemen
19d60 74 20 69 6e 20 61 20 74 68 72 65 65 2d 77 61 79  t in a three-way
19d70 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72 65 6e   join, the paren
19d80 74 54 61 62 20 70 61 72 61 6d 65 74 65 72 20 77  tTab parameter w
19d90 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68 65  ill.** be 1 (the
19da0 20 32 6e 64 20 76 61 6c 75 65 20 6f 66 20 61 20   2nd value of a 
19db0 30 2d 69 6e 64 65 78 65 64 20 61 72 72 61 79 2e  0-indexed array.
19dc0 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ).*/.int sqlite3
19dd0 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
19de0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
19df0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
19e00 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
19e10 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
19e20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
19e30 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
19e40 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c   coded. */.  Sel
19e50 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
19e60 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
19e70 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72 79  o with the query
19e80 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 53 65   results */.  Se
19e90 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20  lect *pParent,  
19ea0 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
19eb0 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68  SELECT for which
19ec0 20 74 68 69 73 20 69 73 20 61 20 73 75 62 2d 71   this is a sub-q
19ed0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61  uery */.  int pa
19ee0 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20  rentTab,        
19ef0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61   /* Index in pPa
19f00 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68  rent->pSrc of th
19f10 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  is query */.  in
19f20 74 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 20  t *pParentAgg,  
19f30 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
19f40 70 50 61 72 65 6e 74 20 75 73 65 73 20 61 67 67  pParent uses agg
19f50 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
19f60 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20   */.  char *aff 
19f70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19f80 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f  If eDest is SRT_
19f90 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e  Union, the affin
19fa0 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ity string */.){
19fb0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
19fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
19fd0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
19fe0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
19ff0 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  o;     /* Return
1a000 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65   from sqlite3Whe
1a010 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56  reBegin() */.  V
1a020 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
1a030 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
1a040 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64  tual machine und
1a050 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1a060 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20  */.  int isAgg; 
1a070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1a080 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c  rue for select l
1a090 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74  ists like "count
1a0a0 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69  (*)" */.  ExprLi
1a0b0 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
1a0c0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
1a0d0 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20  mns to extract. 
1a0e0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
1a0f0 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c  abList;     /* L
1a100 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ist of tables to
1a110 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a   select from */.
1a120 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
1a130 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1a140 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d  WHERE clause.  M
1a150 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1a160 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
1a170 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  By;    /* The OR
1a180 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
1a190 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1a1a0 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
1a1b0 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47  pBy;    /* The G
1a1c0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
1a1d0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
1a1e0 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b    Expr *pHaving;
1a1f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1a200 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
1a210 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1a220 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b   int isDistinct;
1a230 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1a240 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
1a250 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
1a260 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74  nt */.  int dist
1a270 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f  inct;          /
1a280 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66  * Table to use f
1a290 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
1a2a0 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  set */.  int rc 
1a2b0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
1a2c0 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
1a2d0 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  rn from this fun
1a2e0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
1a2f0 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20  ddrSortIndex;   
1a300 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1a310 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  an OP_OpenEpheme
1a320 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
1a330 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
1a340 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
1a350 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
1a360 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
1a370 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ries */.  int iE
1a380 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
1a390 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1a3a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75  he end of the qu
1a3b0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
1a3c0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
1a3d0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1a3e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
1a3f0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1a400 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
1a410 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a420 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1a430 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1a440 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
1a450 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1a460 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
1a470 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
1a480 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
1a490 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
1a4a0 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
1a4b0 29 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d  );..  pOrderBy =
1a4c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
1a4d0 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64  if( IgnorableOrd
1a4e0 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
1a4f0 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
1a500 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 20 74   0;..    /* In t
1a510 68 65 73 65 20 63 61 73 65 73 20 74 68 65 20 44  hese cases the D
1a520 49 53 54 49 4e 43 54 20 6f 70 65 72 61 74 6f 72  ISTINCT operator
1a530 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72   makes no differ
1a540 65 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20  ence to the.    
1a550 2a 2a 20 72 65 73 75 6c 74 73 2c 20 73 6f 20 72  ** results, so r
1a560 65 6d 6f 76 65 20 69 74 20 69 66 20 69 74 20 77  emove it if it w
1a570 65 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a 20  ere specified.. 
1a580 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1a590 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53  (pDest->eDest==S
1a5a0 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65  RT_Exists || pDe
1a5b0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55  st->eDest==SRT_U
1a5c0 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20  nion || .       
1a5d0 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
1a5e0 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20  ==SRT_Except || 
1a5f0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1a600 54 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20  T_Discard);.    
1a610 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  p->isDistinct = 
1a620 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
1a630 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
1a640 65 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 20  e(pParse, p, 0) 
1a650 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
1a660 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d  ct_end;.  }.  p-
1a670 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
1a680 65 72 42 79 3b 0a 0a 23 69 66 6e 64 65 66 20 53  erBy;..#ifndef S
1a690 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
1a6a0 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
1a6b0 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20  If there is are 
1a6c0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75  a sequence of qu
1a6d0 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61  eries, do the ea
1a6e0 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74  rlier ones first
1a6f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
1a700 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
1a710 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ( p->pRightmost=
1a720 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  =0 ){.      Sele
1a730 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69 67  ct *pLoop, *pRig
1a740 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  ht = 0;.      in
1a750 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  t cnt = 0;.     
1a760 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
1a770 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
1a780 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29  ->pPrior, cnt++)
1a790 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  {.        pLoop-
1a7a0 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b  >pRightmost = p;
1a7b0 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
1a7c0 70 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a  pNext = pRight;.
1a7d0 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
1a7e0 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a   pLoop;.      }.
1a7f0 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
1a800 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
1a810 4c 45 43 54 3e 30 20 26 26 20 63 6e 74 3e 53 51  LECT>0 && cnt>SQ
1a820 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
1a830 44 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  D_SELECT ){.    
1a840 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1a850 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
1a860 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63   many terms in c
1a870 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29  ompound SELECT")
1a880 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1a890 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1a8a0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  }.    return mul
1a8b0 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
1a8c0 20 70 2c 20 70 44 65 73 74 2c 20 61 66 66 29 3b   p, pDest, aff);
1a8d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1a8e0 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70  * Make local cop
1a8f0 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d  ies of the param
1a900 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20 71  eters for this q
1a910 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61  uery..  */.  pTa
1a920 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
1a930 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
1a940 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
1a950 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
1a960 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
1a970 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 41 67 67  pHaving;.  isAgg
1a980 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 69   = p->isAgg;.  i
1a990 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
1a9a0 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 45 4c  sDistinct;.  pEL
1a9b0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
1a9c0 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
1a9d0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
1a9e0 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  nd;..  /* .  ** 
1a9f0 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65  Do not even atte
1aa00 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20  mpt to generate 
1aa10 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68  any code if we h
1aa20 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e  ave already seen
1aa30 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66  .  ** errors bef
1aa40 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
1aa50 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20   starts..  */.  
1aa60 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1aa70 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  >0 ) goto select
1aa80 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  _end;..  /* If w
1aa90 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79  riting to memory
1aaa0 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61   or generating a
1aab0 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61   set.  ** only a
1aac0 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d   single column m
1aad0 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ay be output..  
1aae0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1aaf0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1ab00 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75    if( checkForMu
1ab10 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
1ab20 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65  rror(pParse, pDe
1ab30 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  st, pEList->nExp
1ab40 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  r) ){.    goto s
1ab50 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23  elect_end;.  }.#
1ab60 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45  endif..  /* ORDE
1ab70 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20  R BY is ignored 
1ab80 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61  for some destina
1ab90 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
1aba0 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72  ( IgnorableOrder
1abb0 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
1abc0 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
1abd0 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67   }..  /* Begin g
1abe0 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a  enerating code..
1abf0 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
1ac00 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1ac10 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
1ac20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1ac30 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1ac40 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
1ac50 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
1ac60 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
1ac70 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1ac80 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1ac90 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1aca0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1acb0 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ).  for(i=0; i<p
1acc0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
1acd0 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
1ace0 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43  har *zSavedAuthC
1acf0 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ontext = 0;.    
1ad00 69 6e 74 20 6e 65 65 64 52 65 73 74 6f 72 65 43  int needRestoreC
1ad10 6f 6e 74 65 78 74 3b 0a 20 20 20 20 73 74 72 75  ontext;.    stru
1ad20 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1ad30 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
1ad40 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65  st->a[i];.    Se
1ad50 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 0a  lectDest dest;..
1ad60 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
1ad70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 49 74  Select==0 || pIt
1ad80 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20  em->isPopulated 
1ad90 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1ada0 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  if( pItem->zName
1adb0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61  !=0 ){.      zSa
1adc0 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
1add0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1ade0 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61  ntext;.      pPa
1adf0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1ae00 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  t = pItem->zName
1ae10 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74  ;.      needRest
1ae20 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a  oreContext = 1;.
1ae30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ae40 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
1ae50 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  ext = 0;.    }.#
1ae60 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1ae70 45 5f 54 45 53 54 29 20 7c 7c 20 53 51 4c 49 54  E_TEST) || SQLIT
1ae80 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
1ae90 3e 30 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  >0.    /* Increm
1aea0 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68  ent Parse.nHeigh
1aeb0 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20  t by the height 
1aec0 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  of the largest e
1aed0 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
1aee0 20 74 72 65 65 20 72 65 66 65 72 65 64 20 74 6f   tree refered to
1aef0 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61   by this, the pa
1af00 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65  rent select. The
1af10 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20   child select.  
1af20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e    ** may contain
1af30 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
1af40 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20  s of at most.   
1af50 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f   ** (SQLITE_MAX_
1af60 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65  EXPR_DEPTH-Parse
1af70 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74  .nHeight) height
1af80 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a  . This is a bit.
1af90 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73      ** more cons
1afa0 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65  ervative than ne
1afb0 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63  cessary, but muc
1afc0 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e  h easier than en
1afd0 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61  forcing.    ** a
1afe0 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20  n exact limit.. 
1aff0 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65     */.    pParse
1b000 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c  ->nHeight += sql
1b010 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
1b020 69 67 68 74 28 70 29 3b 0a 23 65 6e 64 69 66 0a  ight(p);.#endif.
1b030 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1b040 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
1b050 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70   SRT_EphemTab, p
1b060 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
1b070 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1b080 74 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  t(pParse, pItem-
1b090 3e 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 2c  >pSelect, &dest,
1b0a0 20 70 2c 20 69 2c 20 26 69 73 41 67 67 2c 20 30   p, i, &isAgg, 0
1b0b0 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
1b0c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1b0d0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
1b0e0 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 23 69 66 20  _end;.    }.#if 
1b0f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1b100 45 53 54 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  EST) || SQLITE_M
1b110 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
1b120 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
1b130 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65  ght -= sqlite3Se
1b140 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
1b150 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
1b160 28 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e  ( needRestoreCon
1b170 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50  text ){.      pP
1b180 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1b190 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
1b1a0 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ontext;.    }.  
1b1b0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
1b1c0 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65  pSrc;.    pWhere
1b1d0 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
1b1e0 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65    if( !Ignorable
1b1f0 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
1b200 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  {.      pOrderBy
1b210 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
1b220 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75 70      }.    pGroup
1b230 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
1b240 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d 20  ;.    pHaving = 
1b250 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20  p->pHaving;.    
1b260 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
1b270 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  isDistinct;.  }.
1b280 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65  #endif..  /* Che
1b290 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ck for the speci
1b2a0 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e  al case of a min
1b2b0 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63  () or max() func
1b2c0 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20  tion by itself. 
1b2d0 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
1b2e0 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 23 69 66 20  t set..  */.#if 
1b2f0 30 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d 69  0.  if( simpleMi
1b300 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72 73 65  nMaxQuery(pParse
1b310 2c 20 70 2c 20 70 44 65 73 74 29 20 29 7b 0a 20  , p, pDest) ){. 
1b320 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 67     rc = 0;.    g
1b330 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
1b340 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1b350 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1b360 20 74 68 69 73 20 69 73 20 61 20 73 75 62 71 75   this is a subqu
1b370 65 72 79 20 74 68 61 74 20 63 61 6e 20 62 65 20  ery that can be 
1b380 22 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f  "flattened" into
1b390 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a   its parent..  *
1b3a0 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
1b3b0 69 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c  is a possiblity,
1b3c0 20 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72   do so and retur
1b3d0 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20  n immediately.  
1b3e0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
1b3f0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
1b400 20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20   if( pParent && 
1b410 70 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20  pParentAgg &&.  
1b420 20 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75      flattenSubqu
1b430 65 72 79 28 64 62 2c 20 70 50 61 72 65 6e 74 2c  ery(db, pParent,
1b440 20 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61   parentTab, *pPa
1b450 72 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20  rentAgg, isAgg) 
1b460 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67  ){.    if( isAgg
1b470 20 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d   ) *pParentAgg =
1b480 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   1;.    goto sel
1b490 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e  ect_end;.  }.#en
1b4a0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73  dif..  /* If pos
1b4b0 73 69 62 6c 65 2c 20 72 65 77 72 69 74 65 20 74  sible, rewrite t
1b4c0 68 65 20 71 75 65 72 79 20 74 6f 20 75 73 65 20  he query to use 
1b4d0 47 52 4f 55 50 20 42 59 20 69 6e 73 74 65 61 64  GROUP BY instead
1b4e0 20 6f 66 20 44 49 53 54 49 4e 43 54 2e 0a 20 20   of DISTINCT..  
1b4f0 2a 2a 20 47 52 4f 55 50 20 42 59 20 6d 61 79 20  ** GROUP BY may 
1b500 75 73 65 20 61 6e 20 69 6e 64 65 78 2c 20 44 49  use an index, DI
1b510 53 54 49 4e 43 54 20 6e 65 76 65 72 20 64 6f 65  STINCT never doe
1b520 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
1b530 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 21  >isDistinct && !
1b540 70 2d 3e 69 73 41 67 67 20 26 26 20 21 70 2d 3e  p->isAgg && !p->
1b550 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
1b560 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
1b570 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
1b580 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  (db, p->pEList);
1b590 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
1b5a0 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
1b5b0 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d   p->isDistinct =
1b5c0 20 30 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e   0;.    isDistin
1b5d0 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ct = 0;.  }..  /
1b5e0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
1b5f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1b600 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74  , then this sort
1b610 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d  ing.  ** index m
1b620 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e  ight end up bein
1b630 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20  g unused if the 
1b640 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a  data can be .  *
1b650 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70  * extracted in p
1b660 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  re-sorted order.
1b670 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65    If that is the
1b680 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a   case, then the.
1b690 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65    ** OP_OpenEphe
1b6a0 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
1b6b0 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  n will be change
1b6c0 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20  d to an OP_Noop 
1b6d0 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67  once.  ** we fig
1b6e0 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65  ure out that the
1b6f0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
1b700 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54  s not needed.  T
1b710 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  he addrSortIndex
1b720 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69  .  ** variable i
1b730 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69  s used to facili
1b740 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65  tate that change
1b750 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
1b760 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79  derBy ){.    Key
1b770 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
1b780 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
1b790 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 67 6f  nErr ){.      go
1b7a0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
1b7b0 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 49 6e 66     }.    pKeyInf
1b7c0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
1b7d0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1b7e0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70  pOrderBy);.    p
1b7f0 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
1b800 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
1b810 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f  ++;.    p->addrO
1b820 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64  penEphm[2] = add
1b830 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20  rSortIndex =.   
1b840 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b850 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
1b860 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
1b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b880 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69       pOrderBy->i
1b890 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42  ECursor, pOrderB
1b8a0 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20  y->nExpr+2, 0,. 
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8c0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
1b8d0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
1b8e0 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
1b8f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
1b900 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b  rSortIndex = -1;
1b910 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
1b920 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74  e output is dest
1b930 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f  ined for a tempo
1b940 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e  rary table, open
1b950 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a   that table..  *
1b960 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65  /.  if( pDest->e
1b970 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
1b980 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
1b990 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b9a0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
1b9b0 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 70   pDest->iParm, p
1b9c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
1b9d0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
1b9e0 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20   limiter..  */. 
1b9f0 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
1ba00 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1ba10 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
1ba20 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
1ba30 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a   p, iEnd);..  /*
1ba40 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20   Open a virtual 
1ba50 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
1ba60 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
1ba70 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  t..  */.  if( is
1ba80 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
1ba90 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1baa0 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  o;.    assert( i
1bab0 73 41 67 67 20 7c 7c 20 70 47 72 6f 75 70 42 79  sAgg || pGroupBy
1bac0 20 29 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74   );.    distinct
1bad0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1bae0 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  +;.    pKeyInfo 
1baf0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
1bb00 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d  rList(pParse, p-
1bb10 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71  >pEList);.    sq
1bb20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1bb30 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
1bb40 72 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30  ral, distinct, 0
1bb50 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1bb70 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
1bb80 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
1bb90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1bba0 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  distinct = -1;. 
1bbb0 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61   }..  /* Aggrega
1bbc0 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65  te and non-aggre
1bbd0 67 61 74 65 20 71 75 65 72 69 65 73 20 61 72 65  gate queries are
1bbe0 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
1bbf0 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69  ntly */.  if( !i
1bc00 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79  sAgg && pGroupBy
1bc10 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
1bc20 69 73 20 63 61 73 65 20 69 73 20 66 6f 72 20 6e  is case is for n
1bc30 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
1bc40 72 69 65 73 0a 20 20 20 20 2a 2a 20 42 65 67 69  ries.    ** Begi
1bc50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
1bc60 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  can.    */.    p
1bc70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
1bc80 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
1bc90 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
1bca0 72 65 2c 20 26 70 4f 72 64 65 72 42 79 2c 20 30  re, &pOrderBy, 0
1bcb0 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
1bcc0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
1bcd0 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20  ct_end;..    /* 
1bce0 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  If sorting index
1bcf0 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65   that was create
1bd00 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f  d by a prior OP_
1bd10 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20  OpenEphemeral . 
1bd20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
1bd30 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62  n ended up not b
1bd40 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65  eing needed, the
1bd50 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  n change the OP_
1bd60 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20  OpenEphemeral.  
1bd70 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f    ** into an OP_
1bd80 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Noop..    */.   
1bd90 20 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64   if( addrSortInd
1bda0 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42  ex>=0 && pOrderB
1bdb0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  y==0 ){.      sq
1bdc0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
1bdd0 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72  oNoop(v, addrSor
1bde0 74 49 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20 20  tIndex, 1);.    
1bdf0 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
1be00 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  m[2] = -1;.    }
1be10 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
1be20 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
1be30 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20  loop.    */.    
1be40 61 73 73 65 72 74 28 21 69 73 44 69 73 74 69 6e  assert(!isDistin
1be50 63 74 29 3b 0a 20 20 20 20 69 66 28 20 73 65 6c  ct);.    if( sel
1be60 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
1be70 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20  rse, p, pEList, 
1be80 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20  0, 0, pOrderBy, 
1be90 2d 31 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20  -1, pDest,.     
1bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1beb0 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
1bec0 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
1bed0 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20  , aff) ){.      
1bee0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1bef0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1bf00 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
1bf10 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
1bf20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  */.    sqlite3Wh
1bf30 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
1bf40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1bf50 54 68 69 73 20 69 73 20 74 68 65 20 70 72 6f 63  This is the proc
1bf60 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
1bf70 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
1bf80 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
1bf90 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
1bfa0 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
1bfb0 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
1bfc0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
1bfd0 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
1bfe0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1bff0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
1c000 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
1c010 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
1c020 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
1c030 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
1c040 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
1c050 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
1c060 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
1c070 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
1c080 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
1c090 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
1c0a0 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0c0 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
1c0d0 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
1c0e0 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
1c0f0 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
1c100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c110 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
1c120 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
1c130 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
1c140 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
1c150 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
1c160 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
1c170 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
1c180 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
1c190 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
1c1a0 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
1c1b0 72 64 65 72 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  rder */...    /*
1c1c0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
1c1d0 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 61 64  ariables hold ad
1c1e0 64 72 65 73 73 65 73 20 6f 72 20 6c 61 62 65 6c  dresses or label
1c1f0 73 20 66 6f 72 20 70 61 72 74 73 20 6f 66 20 74  s for parts of t
1c200 68 65 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  he.    ** virtua
1c210 6c 20 6d 61 63 68 69 6e 65 20 70 72 6f 67 72 61  l machine progra
1c220 6d 20 77 65 20 61 72 65 20 70 75 74 74 69 6e 67  m we are putting
1c230 20 74 6f 67 65 74 68 65 72 20 2a 2f 0a 20 20 20   together */.   
1c240 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52   int addrOutputR
1c250 6f 77 3b 20 20 20 20 20 20 2f 2a 20 53 74 61 72  ow;      /* Star
1c260 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20  t of subroutine 
1c270 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72  that outputs a r
1c280 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20  esult row */.   
1c290 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72   int addrSetAbor
1c2a0 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  t;       /* Set 
1c2b0 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
1c2c0 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
1c2d0 20 69 6e 74 20 61 64 64 72 49 6e 69 74 69 61 6c   int addrInitial
1c2e0 69 7a 65 4c 6f 6f 70 3b 20 2f 2a 20 53 74 61 72  izeLoop; /* Star
1c2f0 74 20 6f 66 20 63 6f 64 65 20 74 68 61 74 20 69  t of code that i
1c300 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 69  nitializes the i
1c310 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
1c320 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f   int addrTopOfLo
1c330 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70 20  op;      /* Top 
1c340 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  of the input loo
1c350 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  p */.    int add
1c360 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 3b 20  rGroupByChange; 
1c370 20 2f 2a 20 43 6f 64 65 20 74 68 61 74 20 72 75   /* Code that ru
1c380 6e 73 20 77 68 65 6e 20 61 6e 79 20 47 52 4f 55  ns when any GROU
1c390 50 20 42 59 20 74 65 72 6d 20 63 68 61 6e 67 65  P BY term change
1c3a0 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  s */.    int add
1c3b0 72 50 72 6f 63 65 73 73 52 6f 77 3b 20 20 20 20  rProcessRow;    
1c3c0 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70 72 6f 63   /* Code to proc
1c3d0 65 73 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 70  ess a single inp
1c3e0 75 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e  ut row */.    in
1c3f0 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
1c400 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
1c410 61 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  all processing *
1c420 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f  /.    int addrSo
1c430 72 74 69 6e 67 49 64 78 3b 20 20 20 20 20 2f 2a  rtingIdx;     /*
1c440 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
1c450 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f  meral for the so
1c460 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  rting index */. 
1c470 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74     int addrReset
1c480 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75  ;          /* Su
1c490 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
1c4a0 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
1c4b0 75 6c 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 61  ulator */..    a
1c4c0 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  ddrEnd = sqlite3
1c4d0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1c4e0 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ;..    /* Conver
1c4f0 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  t TK_COLUMN node
1c500 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  s into TK_AGG_CO
1c510 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e  LUMN and make en
1c520 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  tries in.    ** 
1c530 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c  sAggInfo for all
1c540 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
1c550 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73   nodes in expres
1c560 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20  sions of the.   
1c570 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
1c580 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ment..    */.   
1c590 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
1c5a0 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
1c5b0 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
1c5c0 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
1c5d0 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
1c5e0 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67  ist;.    sNC.pAg
1c5f0 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66  gInfo = &sAggInf
1c600 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  o;.    sAggInfo.
1c610 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d  nSortingColumn =
1c620 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f   pGroupBy ? pGro
1c630 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20  upBy->nExpr+1 : 
1c640 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  0;.    sAggInfo.
1c650 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
1c660 70 42 79 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pBy;.    if( sql
1c670 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1c680 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
1c690 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ist) ){.      go
1c6a0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
1c6b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
1c6c0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1c6d0 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72  ggList(&sNC, pOr
1c6e0 64 65 72 42 79 29 20 29 7b 0a 20 20 20 20 20 20  derBy) ){.      
1c6f0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1c700 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1c710 48 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65  Having && sqlite
1c720 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
1c730 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61  egates(&sNC, pHa
1c740 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
1c750 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
1c760 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
1c770 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  fo.nAccumulator 
1c780 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  = sAggInfo.nColu
1c790 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  mn;.    for(i=0;
1c7a0 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e   i<sAggInfo.nFun
1c7b0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; i++){.      i
1c7c0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  f( sqlite3ExprAn
1c7d0 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
1c7e0 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  C, sAggInfo.aFun
1c7f0 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73  c[i].pExpr->pLis
1c800 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  t) ){.        go
1c810 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
1c820 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1c830 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1c840 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
1c850 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a  ect_end;..    /*
1c860 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   Processing for 
1c870 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20  aggregates with 
1c880 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79  GROUP BY is very
1c890 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20   different and. 
1c8a0 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20     ** much more 
1c8b0 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67  complex than agg
1c8c0 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20  regates without 
1c8d0 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20  a GROUP BY..    
1c8e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
1c8f0 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79  pBy ){.      Key
1c900 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
1c910 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72   /* Keying infor
1c920 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67  mation for the g
1c930 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
1c940 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  /..      /* Crea
1c950 74 65 20 6c 61 62 65 6c 73 20 74 68 61 74 20 77  te labels that w
1c960 65 20 77 69 6c 6c 20 62 65 20 6e 65 65 64 69 6e  e will be needin
1c970 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
1c980 0a 20 20 20 20 20 20 61 64 64 72 49 6e 69 74 69  .      addrIniti
1c990 61 6c 69 7a 65 4c 6f 6f 70 20 3d 20 73 71 6c 69  alizeLoop = sqli
1c9a0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1c9b0 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72 47  (v);.      addrG
1c9c0 72 6f 75 70 42 79 43 68 61 6e 67 65 20 3d 20 73  roupByChange = s
1c9d0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1c9e0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 64  bel(v);.      ad
1c9f0 64 72 50 72 6f 63 65 73 73 52 6f 77 20 3d 20 73  drProcessRow = s
1ca00 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1ca10 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f  bel(v);..      /
1ca20 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
1ca30 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
1ca40 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20  we might need a 
1ca50 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f  sorting index to
1ca60 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d  .      ** implem
1ca70 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74  ent it.  Allocat
1ca80 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69  e that sorting i
1ca90 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74  ndex now.  If it
1caa0 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20   turns out.     
1cab0 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
1cac0 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72  ot need it after
1cad0 20 61 6c 6c 2c 20 74 68 65 20 4f 70 65 6e 45 70   all, the OpenEp
1cae0 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
1caf0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  ion.      ** wil
1cb00 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
1cb10 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20  nto a Noop.  .  
1cb20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67      */.      sAg
1cb30 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
1cb40 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1cb50 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  +;.      pKeyInf
1cb60 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
1cb70 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1cb80 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20  pGroupBy);.     
1cb90 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20   addrSortingIdx 
1cba0 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  =.          sqli
1cbb0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1cbc0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1cbd0 6c 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  l, sAggInfo.sort
1cbe0 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20  ingIdx,.        
1cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc00 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
1cc10 6e 67 43 6f 6c 75 6d 6e 2c 20 30 2c 0a 20 20 20  ngColumn, 0,.   
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc30 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
1cc40 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
1cc50 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20  O_HANDOFF);..   
1cc60 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
1cc70 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
1cc80 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20  s used by GROUP 
1cc90 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f  BY aggregate pro
1cca0 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f  cessing.      */
1ccb0 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20  .      iUseFlag 
1ccc0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1ccd0 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c  ;.      iAbortFl
1cce0 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
1ccf0 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d  Mem;.      iAMem
1cd00 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
1cd10 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
1cd20 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
1cd30 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
1cd40 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65    iBMem = pParse
1cd50 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
1cd60 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
1cd70 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
1cd80 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
1cd90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1cda0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62  _Integer, 0, iAb
1cdb0 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
1cdc0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1cdd0 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61  "clear abort fla
1cde0 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
1cdf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ce00 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
1ce10 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
1ce20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1ce30 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d   "indicate accum
1ce40 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b  ulator empty"));
1ce50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ce60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1ce70 6f 74 6f 2c 20 30 2c 20 61 64 64 72 49 6e 69 74  oto, 0, addrInit
1ce80 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 0a 20 20  ializeLoop);..  
1ce90 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
1cea0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
1ceb0 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67  t outputs a sing
1cec0 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
1ced0 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
1cee0 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74  t.  This subrout
1cef0 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20  ine first looks 
1cf00 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e  at the iUseFlag.
1cf10 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20    If iUseFlag.  
1cf20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74      ** is less t
1cf30 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1cf40 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75  zero, the subrou
1cf50 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
1cf60 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68    If.      ** th
1cf70 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c  e processing cal
1cf80 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  ls for the query
1cf90 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20   to abort, this 
1cfa0 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
1cfb0 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74   ** increments t
1cfc0 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65  he iAbortFlag me
1cfd0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65  mory location be
1cfe0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
1cff0 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
1d000 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63   to signal the c
1d010 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a  aller to abort..
1d020 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
1d030 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71  ddrSetAbort = sq
1d040 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1d050 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
1d060 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d070 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1d080 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  1, iAbortFlag);.
1d090 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1d0a0 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74  t((v, "set abort
1d0b0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
1d0c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d0d0 32 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  2(v, OP_Return, 
1d0e0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64  0, 0);.      add
1d0f0 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
1d100 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1d110 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
1d120 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d130 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20  v, OP_IfMemPos, 
1d140 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75  iUseFlag, addrOu
1d150 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20  tputRow+2);.    
1d160 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1d170 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c  , "Groupby resul
1d180 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72  t generator entr
1d190 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20  y point"));.    
1d1a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d1b0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op2(v, OP_Return
1d1c0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  , 0, 0);.      f
1d1d0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
1d1e0 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
1d1f0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  gInfo);.      if
1d200 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
1d210 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1d220 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1d230 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74  pHaving, addrOut
1d240 70 75 74 52 6f 77 2b 31 2c 20 31 29 3b 0a 20 20  putRow+1, 1);.  
1d250 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1d260 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
1d270 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
1d280 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
1d290 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
1d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2b0 20 20 64 69 73 74 69 6e 63 74 2c 20 70 44 65 73    distinct, pDes
1d2c0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
1d2e0 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61  drOutputRow+1, a
1d2f0 64 64 72 53 65 74 41 62 6f 72 74 2c 20 61 66 66  ddrSetAbort, aff
1d300 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1d310 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1d320 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
1d330 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1d340 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d350 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b  P_Return, 0, 0);
1d360 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1d370 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75  nt((v, "end grou
1d380 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
1d390 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
1d3a0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1d3b0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
1d3c0 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f  ll reset the gro
1d3d0 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f  up-by accumulato
1d3e0 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
1d3f0 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c   addrReset = sql
1d400 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1d410 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 72 65  ddr(v);.      re
1d420 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
1d430 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
1d440 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d450 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d460 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a  _Return, 0, 0);.
1d470 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  .      /* Begin 
1d480 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
1d490 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75   extract all sou
1d4a0 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55  rce rows in GROU
1d4b0 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20  P BY order..    
1d4c0 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
1d4d0 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61  involve two sepa
1d4e0 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20  rate loops with 
1d4f0 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65  an OP_Sort in be
1d500 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20  tween, or.      
1d510 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ** it might be a
1d520 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61   single loop tha
1d530 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20  t uses an index 
1d540 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72  to extract infor
1d550 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  mation.      ** 
1d560 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64  in the right ord
1d570 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68  er to begin with
1d580 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1d590 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1d5a0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
1d5b0 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b  InitializeLoop);
1d5c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d5d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1d5e0 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 52 65 73  osub, 0, addrRes
1d5f0 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  et);.      pWInf
1d600 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
1d610 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
1d620 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
1d630 26 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20  &pGroupBy, 0);. 
1d640 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
1d650 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
1d660 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  _end;.      if( 
1d670 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
1d680 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
1d690 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20  timizer is able 
1d6a0 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20  to deliver rows 
1d6b0 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65  in group by orde
1d6c0 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  r so.        ** 
1d6d0 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  we do not have t
1d6e0 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f  o sort.  The OP_
1d6f0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61  OpenEphemeral ta
1d700 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ble will be.    
1d710 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64      ** cancelled
1d720 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77   later because w
1d730 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
1d740 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f  use the pKeyInfo
1d750 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1d760 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
1d770 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
1d780 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
1d790 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
1d7a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  {.        /* Row
1d7b0 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74  s are coming out
1d7c0 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64   in undetermined
1d7d0 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65   order.  We have
1d7e0 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20   to push.       
1d7f0 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74   ** each row int
1d800 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  o a sorting inde
1d810 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  x, terminate the
1d820 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20   first loop,.   
1d830 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f       ** then loo
1d840 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69  p over the sorti
1d850 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65  ng index in orde
1d860 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74  r to get the out
1d870 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  put.        ** i
1d880 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20  n sorted order. 
1d890 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1d8a0 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
1d8b0 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
1d8c0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
1d8d0 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
1d8e0 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  pBy, 0);.       
1d8f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d900 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
1d910 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  e, sAggInfo.sort
1d920 69 6e 67 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  ingIdx, 0);.    
1d930 20 20 20 20 6a 20 3d 20 70 47 72 6f 75 70 42 79      j = pGroupBy
1d940 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 20  ->nExpr+1;.     
1d950 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
1d960 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
1d970 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1d980 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
1d990 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67  ol *pCol = &sAgg
1d9a0 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20  Info.aCol[i];.  
1d9b0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
1d9c0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
1d9d0 6a 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  j ) continue;.  
1d9e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1d9f0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1da00 28 76 2c 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20  (v, pCol->pTab, 
1da10 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 70 43  pCol->iColumn,pC
1da20 6f 6c 2d 3e 69 54 61 62 6c 65 2c 30 29 3b 0a 20  ol->iTable,0);. 
1da30 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
1da40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1da50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1da60 32 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  2(v, OP_MakeReco
1da70 72 64 2c 20 6a 2c 20 30 29 3b 0a 20 20 20 20 20  rd, j, 0);.     
1da80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1da90 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
1daa0 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  sert, sAggInfo.s
1dab0 6f 72 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a 20  ortingIdx, 0);. 
1dac0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
1dad0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
1dae0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1daf0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1db00 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
1db10 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
1db20 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
1db30 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52  eComment((v, "GR
1db40 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a  OUP BY sort"));.
1db50 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
1db60 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d  .useSortingIdx =
1db70 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   1;.      }..   
1db80 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
1db90 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
1dba0 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74   BY terms and st
1dbb0 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62  ore in b0, b1, b
1dbc0 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62  2....      ** (b
1dbd0 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  0 is memory loca
1dbe0 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31  tion iBMem+0, b1
1dbf0 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64   is iBMem+1, and
1dc00 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20   so forth).     
1dc10 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65   ** Then compare
1dc20 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
1dc30 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69  UP BY terms agai
1dc40 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  nst the GROUP BY
1dc50 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20   terms.      ** 
1dc60 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
1dc70 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20  s row currently 
1dc80 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31  stored in a0, a1
1dc90 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  , a2....      */
1dca0 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66  .      addrTopOf
1dcb0 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
1dcc0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1dcd0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1dce0 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
1dcf0 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
1dd00 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
1dd10 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
1dd20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1dd30 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
1dd40 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
1dd50 64 78 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20  dx, j);.        
1dd60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1dd70 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74   sAggInfo.direct
1dd80 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Mode = 1;.      
1dd90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1dda0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ode(pParse, pGro
1ddb0 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  upBy->a[j].pExpr
1ddc0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
1ddd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1dde0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6a 3c 70  dbeAddOp2(v, j<p
1ddf0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31  GroupBy->nExpr-1
1de00 3f 4f 50 5f 4d 6f 76 65 3a 4f 50 5f 43 6f 70 79  ?OP_Move:OP_Copy
1de10 2c 20 30 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  , 0, iBMem+j);. 
1de20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
1de30 28 6a 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  (j=pGroupBy->nEx
1de40 70 72 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  pr-1; j>=0; j--)
1de50 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  {.        if( j<
1de60 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d  pGroupBy->nExpr-
1de70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  1 ){.          s
1de80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1de90 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 42  (v, OP_SCopy, iB
1dea0 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20 20 20  Mem+j, 0);.     
1deb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
1dec0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ded0 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 41 4d 65  , OP_SCopy, iAMe
1dee0 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  m+j, 0);.       
1def0 20 69 66 28 20 6a 3d 3d 30 20 29 7b 0a 20 20 20   if( j==0 ){.   
1df00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1df10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45  beAddOp2(v, OP_E
1df20 71 2c 20 30 78 32 30 30 2c 20 61 64 64 72 50 72  q, 0x200, addrPr
1df30 6f 63 65 73 73 52 6f 77 29 3b 0a 20 20 20 20 20  ocessRow);.     
1df40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1df50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1df60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp2(v, OP_Ne, 
1df70 30 78 32 30 30 2c 20 61 64 64 72 47 72 6f 75 70  0x200, addrGroup
1df80 42 79 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  ByChange);.     
1df90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
1dfa0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1dfb0 28 76 2c 20 2d 31 2c 20 28 76 6f 69 64 2a 29 70  (v, -1, (void*)p
1dfc0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
1dfd0 5d 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  ], P4_COLLSEQ);.
1dfe0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1dff0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1e000 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76  that runs whenev
1e010 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  er the GROUP BY 
1e020 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a  changes..      *
1e030 2a 20 43 68 61 6e 67 65 20 69 6e 20 74 68 65 20  * Change in the 
1e040 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74  GROUP BY are det
1e050 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65  ected by the pre
1e060 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20  vious code.     
1e070 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74   ** block.  If t
1e080 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61  here were no cha
1e090 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b  nges, this block
1e0a0 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   is skipped..   
1e0b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
1e0c0 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20  his code copies 
1e0d0 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79  current group by
1e0e0 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c   terms in b0,b1,
1e0f0 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  b2,....      ** 
1e100 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32  over to a0,a1,a2
1e110 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73  .  It then calls
1e120 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
1e130 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
1e140 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61  and resets the a
1e150 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
1e160 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69  ator registers i
1e170 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20  n preparation.  
1e180 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e      ** for the n
1e190 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74  ext GROUP BY bat
1e1a0 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
1e1b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1e1c0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
1e1d0 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29  drGroupByChange)
1e1e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1e1f0 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
1e200 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
1e210 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e220 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20  Op2(v, OP_Move, 
1e230 69 42 4d 65 6d 2b 6a 2c 20 69 41 4d 65 6d 2b 6a  iBMem+j, iAMem+j
1e240 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e250 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e260 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1e270 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  0, addrOutputRow
1e280 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1e290 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
1e2a0 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20   one row"));.   
1e2b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e2c0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  dOp2(v, OP_IfMem
1e2d0 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c  Pos, iAbortFlag,
1e2e0 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
1e2f0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1e300 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c   "check abort fl
1e310 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
1e320 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e330 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61  , OP_Gosub, 0, a
1e340 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
1e350 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1e360 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61   "reset accumula
1e370 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
1e380 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67  * Update the agg
1e390 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
1e3a0 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ors based on the
1e3b0 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20   content of.    
1e3c0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
1e3d0 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20   row.      */.  
1e3e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1e3f0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
1e400 64 64 72 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a  ddrProcessRow);.
1e410 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
1e420 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
1e430 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
1e440 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e450 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1e460 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 1, iUseFlag);
1e470 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1e480 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
1e490 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c   data in accumul
1e4a0 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
1e4b0 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f  /* End of the lo
1e4c0 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  op.      */.    
1e4d0 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
1e4e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1e4f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e500 2c 20 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49  , OP_Next, sAggI
1e510 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
1e520 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a  addrTopOfLoop);.
1e530 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e540 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
1e550 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
1e560 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e570 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
1e580 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 2c   addrSortingIdx,
1e590 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   1);.      }..  
1e5a0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68      /* Output th
1e5b0 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72  e final row of r
1e5c0 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20  esult.      */. 
1e5d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e5e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1e5f0 75 62 2c 20 30 2c 20 61 64 64 72 4f 75 74 70 75  ub, 0, addrOutpu
1e600 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
1e610 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75  eComment((v, "ou
1e620 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29  tput final row")
1e630 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 20  );.      .    } 
1e640 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42  /* endif pGroupB
1e650 79 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a  y */.    else {.
1e660 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
1e670 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20  pMinMax = 0;.   
1e680 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65     ExprList *pDe
1e690 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 38 20  l = 0;.      u8 
1e6a0 66 6c 61 67 3b 0a 0a 20 20 20 20 20 20 66 6c 61  flag;..      fla
1e6b0 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28  g = minMaxQuery(
1e6c0 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
1e6d0 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20    if( flag ){.  
1e6e0 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20        pMinMax = 
1e6f0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1e700 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  up(db, p->pEList
1e710 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 70 4c  ->a[0].pExpr->pL
1e720 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ist);.        if
1e730 28 20 70 4d 69 6e 4d 61 78 20 29 7b 0a 20 20 20  ( pMinMax ){.   
1e740 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
1e750 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
1e760 20 28 28 66 6c 61 67 3d 3d 4f 52 44 45 52 42 59   ((flag==ORDERBY
1e770 5f 4d 49 4e 29 3f 30 3a 31 29 3b 0a 20 20 20 20  _MIN)?0:1);.    
1e780 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
1e790 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20  [0].pExpr->op = 
1e7a0 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
1e7b0 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e       pDel = pMin
1e7c0 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Max;.        }. 
1e7d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1e7e0 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20   This case runs 
1e7f0 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  if the aggregate
1e800 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   has no GROUP BY
1e810 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20   clause.  The.  
1e820 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
1e830 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65  g is much simple
1e840 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  r since there is
1e850 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72   only a single r
1e860 6f 77 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f  ow.      ** of o
1e870 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  utput..      */.
1e880 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
1e890 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
1e8a0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
1e8b0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
1e8c0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
1e8d0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
1e8e0 68 65 72 65 2c 20 26 70 4d 69 6e 4d 61 78 2c 20  here, &pMinMax, 
1e8f0 66 6c 61 67 29 3b 0a 20 20 20 20 20 20 69 66 28  flag);.      if(
1e900 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20   pWInfo==0 ){.  
1e910 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e920 72 4c 69 73 74 44 65 6c 65 74 65 28 70 44 65 6c  rListDelete(pDel
1e930 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
1e940 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
1e950 20 20 7d 0a 20 20 20 20 20 20 75 70 64 61 74 65    }.      update
1e960 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
1e970 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
1e980 20 20 20 20 20 20 69 66 28 20 21 70 4d 69 6e 4d        if( !pMinM
1e990 61 78 20 26 26 20 66 6c 61 67 20 29 7b 0a 20 20  ax && flag ){.  
1e9a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e9b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1e9c0 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69  to, 0, pWInfo->i
1e9d0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
1e9e0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1e9f0 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c  "%s() by index",
1ea00 20 28 66 6c 61 67 3d 3d 4f 52 44 45 52 42 59 5f   (flag==ORDERBY_
1ea10 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29  MIN?"min":"max")
1ea20 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
1ea30 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
1ea40 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
1ea50 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
1ea60 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
1ea70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
1ea80 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1ea90 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
1eaa0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1eab0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1eac0 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
1ead0 64 64 72 45 6e 64 2c 20 31 29 3b 0a 20 20 20 20  ddrEnd, 1);.    
1eae0 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74    }.      select
1eaf0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
1eb00 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
1eb10 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20  0, 0, 0, -1, .  
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb30 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45      pDest, addrE
1eb40 6e 64 2c 20 61 64 64 72 45 6e 64 2c 20 61 66 66  nd, addrEnd, aff
1eb50 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
1eb60 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1eb70 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pDel);.    }.   
1eb80 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1eb90 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
1eba0 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f  End);.    .  } /
1ebb0 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74  * endif aggregat
1ebc0 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a  e query */..  /*
1ebd0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
1ebe0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
1ebf0 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f   then we need to
1ec00 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74   sort the result
1ec10 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20  s.  ** and send 
1ec20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c  them to the call
1ec30 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  back one by one.
1ec40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
1ec50 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65  erBy ){.    gene
1ec60 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
1ec70 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73  rse, p, v, pELis
1ec80 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29  t->nExpr, pDest)
1ec90 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
1eca0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1ecb0 45 52 59 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  ERY.  /* If this
1ecc0 20 77 61 73 20 61 20 73 75 62 71 75 65 72 79 2c   was a subquery,
1ecd0 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63 6f 6e   we have now con
1ece0 76 65 72 74 65 64 20 74 68 65 20 73 75 62 71 75  verted the subqu
1ecf0 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20  ery into a.  ** 
1ed00 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
1ed10 20 20 53 6f 20 73 65 74 20 74 68 65 20 53 72 63    So set the Src
1ed20 4c 69 73 74 5f 69 74 65 6d 2e 69 73 50 6f 70 75  List_item.isPopu
1ed30 6c 61 74 65 64 20 66 6c 61 67 20 74 6f 20 70 72  lated flag to pr
1ed40 65 76 65 6e 74 0a 20 20 2a 2a 20 74 68 69 73 20  event.  ** this 
1ed50 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65  subquery from be
1ed60 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61 67  ing evaluated ag
1ed70 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65  ain and to force
1ed80 20 74 68 65 20 75 73 65 20 6f 66 0a 20 20 2a 2a   the use of.  **
1ed90 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
1eda0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
1edb0 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20   pParent ){.    
1edc0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1edd0 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65  >pSrc->nSrc>pare
1ede0 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73  ntTab );.    ass
1edf0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53  ert( pParent->pS
1ee00 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d  rc->a[parentTab]
1ee10 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20  .pSelect==p );. 
1ee20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63     pParent->pSrc
1ee30 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 69  ->a[parentTab].i
1ee40 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a  sPopulated = 1;.
1ee50 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1ee60 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
1ee70 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  ip this query.  
1ee80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1ee90 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1eea0 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  iEnd);..  /* The
1eeb0 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63   SELECT was succ
1eec0 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20  essfully coded. 
1eed0 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e    Set the return
1eee0 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20   code to 0.  ** 
1eef0 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65  to indicate no e
1ef00 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rrors..  */.  rc
1ef10 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74   = 0;..  /* Cont
1ef20 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72  rol jumps to her
1ef30 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
1ef40 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f   encountered abo
1ef50 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a  ve, or upon.  **
1ef60 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69   successful codi
1ef70 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ng of the SELECT
1ef80 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e  ..  */.select_en
1ef90 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66  d:..  /* Identif
1efa0 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  y column names i
1efb0 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69  f we will be usi
1efc0 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61 6c  ng them in a cal
1efd0 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a  lback.  This.  *
1efe0 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  * step is skippe
1eff0 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
1f000 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65  is going to some
1f010 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74 69   other destinati
1f020 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  on..  */.  if( r
1f030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1f040 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1f050 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
1f060 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
1f070 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
1f080 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
1f090 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
1f0a0 66 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61 43  free(sAggInfo.aC
1f0b0 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ol);.  sqlite3_f
1f0c0 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61 46 75  ree(sAggInfo.aFu
1f0d0 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nc);.  return rc
1f0e0 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
1f0f0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
1f100 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1f110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f150 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1f160 6e 67 20 63 6f 64 65 20 69 73 20 75 73 65 64 20  ng code is used 
1f170 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
1f180 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20  debugging only. 
1f190 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61   The code.** tha
1f1a0 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e  t follows does n
1f1b0 6f 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72  ot appear in nor
1f1c0 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a  mal builds..**.*
1f1d0 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
1f1e0 20 61 72 65 20 75 73 65 64 20 74 6f 20 70 72 69   are used to pri
1f1f0 6e 74 20 6f 75 74 20 74 68 65 20 63 6f 6e 74 65  nt out the conte
1f200 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72  nt of all or par
1f210 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73 65  t of a .** parse
1f220 20 73 74 72 75 63 74 75 72 65 73 20 73 75 63 68   structures such
1f230 20 61 73 20 53 65 6c 65 63 74 20 6f 72 20 45 78   as Select or Ex
1f240 70 72 2e 20 20 53 75 63 68 20 70 72 69 6e 74 6f  pr.  Such printo
1f250 75 74 73 20 61 72 65 20 75 73 65 66 75 6c 0a 2a  uts are useful.*
1f260 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f  * for helping to
1f270 20 75 6e 64 65 72 73 74 61 6e 64 20 77 68 61 74   understand what
1f280 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 69 6e   is happening in
1f290 73 69 64 65 20 74 68 65 20 63 6f 64 65 20 67 65  side the code ge
1f2a0 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e  nerator.** durin
1f2b0 67 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20  g the execution 
1f2c0 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43  of complex SELEC
1f2d0 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  T statements..**
1f2e0 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
1f2f0 65 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64  e are not called
1f300 20 61 6e 79 77 68 65 72 65 20 66 72 6f 6d 20 77   anywhere from w
1f310 69 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c  ithin the normal
1f320 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e 20 20  .** code base.  
1f330 54 68 65 6e 20 61 72 65 20 69 6e 74 65 6e 64 65  Then are intende
1f340 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66  d to be called f
1f350 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 64  rom within the d
1f360 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72  ebugger.** or fr
1f370 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20 22 70 72  om temporary "pr
1f380 69 6e 74 66 22 20 73 74 61 74 65 6d 65 6e 74 73  intf" statements
1f390 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20 64 65   inserted for de
1f3a0 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64  bugging..*/.void
1f3b0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
1f3c0 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  r(Expr *p){.  if
1f3d0 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20  ( p->token.z && 
1f3e0 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a  p->token.n>0 ){.
1f3f0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1f400 50 72 69 6e 74 66 28 22 28 25 2e 2a 73 22 2c 20  Printf("(%.*s", 
1f410 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74  p->token.n, p->t
1f420 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65  oken.z);.  }else
1f430 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
1f440 75 67 50 72 69 6e 74 66 28 22 28 25 64 22 2c 20  ugPrintf("(%d", 
1f450 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69 66  p->op);.  }.  if
1f460 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  ( p->pLeft ){.  
1f470 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1f480 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73  intf(" ");.    s
1f490 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
1f4a0 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20  p->pLeft);.  }. 
1f4b0 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29   if( p->pRight )
1f4c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
1f4d0 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20  ugPrintf(" ");. 
1f4e0 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
1f4f0 78 70 72 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a  xpr(p->pRight);.
1f500 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
1f510 75 67 50 72 69 6e 74 66 28 22 29 22 29 3b 0a 7d  ugPrintf(")");.}
1f520 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69  .void sqlite3Pri
1f530 6e 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  ntExprList(ExprL
1f540 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
1f550 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1f560 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
1f570 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
1f580 65 33 50 72 69 6e 74 45 78 70 72 28 70 4c 69 73  e3PrintExpr(pLis
1f590 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
1f5a0 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d      if( i<pList-
1f5b0 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20  >nExpr-1 ){.    
1f5c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1f5d0 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20 20 20 20  intf(", ");.    
1f5e0 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  }.  }.}.void sql
1f5f0 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28  ite3PrintSelect(
1f600 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
1f610 6e 64 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65  ndent){.  sqlite
1f620 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
1f630 73 53 45 4c 45 43 54 28 25 70 29 20 22 2c 20 69  sSELECT(%p) ", i
1f640 6e 64 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a 20  ndent, "", p);. 
1f650 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
1f660 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 29  rList(p->pEList)
1f670 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
1f680 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
1f690 69 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20  if( p->pSrc ){. 
1f6a0 20 20 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78     char *zPrefix
1f6b0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
1f6c0 20 7a 50 72 65 66 69 78 20 3d 20 22 46 52 4f 4d   zPrefix = "FROM
1f6d0 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ";.    for(i=0; 
1f6e0 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b  i<p->pSrc->nSrc;
1f6f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
1f700 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1f710 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53   *pItem = &p->pS
1f720 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
1f730 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1f740 74 66 28 22 25 2a 73 20 22 2c 20 69 6e 64 65 6e  tf("%*s ", inden
1f750 74 2b 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20  t+6, zPrefix);. 
1f760 20 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22       zPrefix = "
1f770 22 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ";.      if( pIt
1f780 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
1f790 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
1f7a0 62 75 67 50 72 69 6e 74 66 28 22 28 5c 6e 22 29  bugPrintf("(\n")
1f7b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1f7c0 33 50 72 69 6e 74 53 65 6c 65 63 74 28 70 49 74  3PrintSelect(pIt
1f7d0 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e 64  em->pSelect, ind
1f7e0 65 6e 74 2b 31 30 29 3b 0a 20 20 20 20 20 20 20  ent+10);.       
1f7f0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1f800 6e 74 66 28 22 25 2a 73 29 22 2c 20 69 6e 64 65  ntf("%*s)", inde
1f810 6e 74 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20 20  nt+8, "");.     
1f820 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d   }else if( pItem
1f830 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ->zName ){.     
1f840 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1f850 72 69 6e 74 66 28 22 25 73 22 2c 20 70 49 74 65  rintf("%s", pIte
1f860 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m->zName);.     
1f870 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
1f880 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20  em->pTab ){.    
1f890 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1f8a0 50 72 69 6e 74 66 28 22 28 74 61 62 6c 65 3a 20  Printf("(table: 
1f8b0 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  %s)", pItem->pTa
1f8c0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
1f8d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
1f8e0 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  em->zAlias ){.  
1f8f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
1f900 75 67 50 72 69 6e 74 66 28 22 20 41 53 20 25 73  ugPrintf(" AS %s
1f910 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  ", pItem->zAlias
1f920 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f930 20 69 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d 3e   if( i<p->pSrc->
1f940 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20  nSrc-1 ){.      
1f950 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1f960 69 6e 74 66 28 22 2c 22 29 3b 0a 20 20 20 20 20  intf(",");.     
1f970 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1f980 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
1f990 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
1f9a0 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a  f( p->pWhere ){.
1f9b0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1f9c0 50 72 69 6e 74 66 28 22 25 2a 73 20 57 48 45 52  Printf("%*s WHER
1f9d0 45 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  E ", indent, "")
1f9e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
1f9f0 6e 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  ntExpr(p->pWhere
1fa00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
1fa10 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
1fa20 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47  .  }.  if( p->pG
1fa30 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71  roupBy ){.    sq
1fa40 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1fa50 28 22 25 2a 73 20 47 52 4f 55 50 20 42 59 20 22  ("%*s GROUP BY "
1fa60 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20  , indent, "");. 
1fa70 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
1fa80 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
1fa90 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBy);.    sqlite
1faa0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
1fab0 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ");.  }.  if( p-
1fac0 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
1fad0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1fae0 74 66 28 22 25 2a 73 20 48 41 56 49 4e 47 20 22  tf("%*s HAVING "
1faf0 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20  , indent, "");. 
1fb00 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
1fb10 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b  xpr(p->pHaving);
1fb20 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1fb30 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
1fb40 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64   }.  if( p->pOrd
1fb50 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
1fb60 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1fb70 25 2a 73 20 4f 52 44 45 52 20 42 59 20 22 2c 20  %*s ORDER BY ", 
1fb80 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20  indent, "");.   
1fb90 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
1fba0 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
1fbb0 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  y);.    sqlite3D
1fbc0 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
1fbd0 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f  ;.  }.}./* End o
1fbe0 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  f the structure 
1fbf0 64 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63  debug printing c
1fc00 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ode.************
1fc10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fc20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fc30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fc40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fc50 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  */.#endif /* def
1fc60 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
1fc70 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1fc80 49 54 45 5f 44 45 42 55 47 29 20 2a 2f 0a        ITE_DEBUG) */.