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

Artifact 8570d4db93e115227393fd3cdf88be28d9ac585b:


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 34  select.c,v 1.394
0200: 20 32 30 30 38 2f 30 31 2f 30 39 20 30 32 3a 31   2008/01/09 02:1
0210: 35 3a 34 32 20 64 72 68 20 45 78 70 20 24 0a 2a  5:42 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 31 28 76 2c 20 4f 50  VdbeAddOp1(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 29 3b 0a  rBy->iECursor);.
3100: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3110: 4f 70 31 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  Op1(v, OP_Pull, 
3120: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
3130: 2b 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  + 1);.  sqlite3V
3140: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
3150: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 4f 72 64  MakeRecord, pOrd
3160: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 32 29  erBy->nExpr + 2)
3170: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3180: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp1(v, OP_IdxI
3190: 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79 2d  nsert, pOrderBy-
31a0: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 69 66  >iECursor);.  if
31b0: 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69  ( pSelect->iLimi
31c0: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t>=0 ){.    int 
31d0: 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20  addr1, addr2;.  
31e0: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
31f0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
3200: 50 5f 49 66 5a 65 72 6f 2c 20 70 53 65 6c 65 63  P_IfZero, pSelec
3210: 74 2d 3e 69 4c 69 6d 69 74 2b 31 29 3b 0a 20 20  t->iLimit+1);.  
3220: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3230: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
3240: 2c 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69  , pSelect->iLimi
3250: 74 2b 31 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64  t+1, -1);.    ad
3260: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
3270: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
3280: 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  to);.    sqlite3
3290: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
32a0: 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69  addr1);.    sqli
32b0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
32c0: 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72   OP_Last, pOrder
32d0: 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  By->iECursor);. 
32e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
32f0: 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74  dOp1(v, OP_Delet
3300: 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  e, pOrderBy->iEC
3310: 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69  ursor);.    sqli
3320: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
3330: 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 70  v, addr2);.    p
3340: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d  Select->iLimit =
3350: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
3360: 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d  * Add code to im
3370: 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53  plement the OFFS
3380: 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ET.*/.static voi
3390: 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20  d codeOffset(.  
33a0: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
33b0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
33c0: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20  de into this VM 
33d0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
33e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
33f0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
3400: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
3410: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
3420: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
3430: 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65  o skip the curre
3440: 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  nt record */.  i
3450: 6e 74 20 6e 50 6f 70 20 20 20 20 20 20 20 20 20  nt nPop         
3460: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69   /* Number of ti
3470: 6d 65 73 20 74 6f 20 70 6f 70 20 73 74 61 63 6b  mes to pop stack
3480: 20 77 68 65 6e 20 6a 75 6d 70 69 6e 67 20 2a 2f   when jumping */
3490: 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66  .){.  if( p->iOf
34a0: 66 73 65 74 3e 3d 30 20 26 26 20 69 43 6f 6e 74  fset>=0 && iCont
34b0: 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20 69  inue!=0 ){.    i
34c0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c  nt addr;.    sql
34d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
34e0: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e  , OP_AddImm, p->
34f0: 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20  iOffset, -1);.  
3500: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
3510: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
3520: 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73  _IfNeg, p->iOffs
3530: 65 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 50 6f  et);.    if( nPo
3540: 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  p>0 ){.      sql
3550: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
3560: 2c 20 4f 50 5f 50 6f 70 2c 20 6e 50 6f 70 29 3b  , OP_Pop, nPop);
3570: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
3580: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3590: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
35a0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65  tinue);.    Vdbe
35b0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69  Comment((v, "ski
35c0: 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73  p OFFSET records
35d0: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
35e0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
35f0: 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  addr);.  }.}../*
3600: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
3610: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
3620: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 6f  make sure the to
3630: 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  p N elements of 
3640: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 61 72 65  the.** stack are
3650: 20 64 69 73 74 69 6e 63 74 2e 20 20 69 54 61 62   distinct.  iTab
3660: 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e   is a sorting in
3670: 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70  dex that holds p
3680: 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65  reviously.** see
3690: 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  n combinations o
36a0: 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20  f the N values. 
36b0: 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   A new entry is 
36c0: 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20  made in iTab.** 
36d0: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e  if the current N
36e0: 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e   values are new.
36f0: 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f  .**.** A jump to
3700: 20 61 64 64 72 52 65 70 65 61 74 20 69 73 20 6d   addrRepeat is m
3710: 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20  ade and the N+1 
3720: 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65  values are poppe
3730: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74  d from the.** st
3740: 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e  ack if the top N
3750: 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f   elements are no
3760: 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73  t distinct..*/.s
3770: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44  tatic void codeD
3780: 69 73 74 69 6e 63 74 5f 4f 4c 44 28 0a 20 20 56  istinct_OLD(.  V
3790: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
37a0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
37b0: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20  de into this VM 
37c0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
37d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72          /* A sor
37e0: 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20  ting index used 
37f0: 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74  to test for dist
3800: 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e  inctness */.  in
3810: 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20  t addrRepeat,   
3820: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
3830: 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74   if not distinct
3840: 20 2a 2f 0a 20 20 69 6e 74 20 4e 20 20 20 20 20   */.  int N     
3850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3860: 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 6f  top N elements o
3870: 66 20 74 68 65 20 73 74 61 63 6b 20 6d 75 73 74  f the stack must
3880: 20 62 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a   be distinct */.
3890: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
38a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp2(v, OP_Mak
38b0: 65 52 65 63 6f 72 64 2c 20 2d 4e 2c 20 30 29 3b  eRecord, -N, 0);
38c0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
38d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 44 69 73 74 69  dOp2(v, OP_Disti
38e0: 6e 63 74 2c 20 69 54 61 62 2c 20 73 71 6c 69 74  nct, iTab, sqlit
38f0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
3900: 72 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74  r(v)+3);.  sqlit
3910: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3920: 4f 50 5f 50 6f 70 2c 20 4e 2b 31 2c 20 30 29 3b  OP_Pop, N+1, 0);
3930: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3940: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
3950: 20 30 2c 20 61 64 64 72 52 65 70 65 61 74 29 3b   0, addrRepeat);
3960: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
3970: 76 2c 20 22 73 6b 69 70 20 69 6e 64 69 73 74 69  v, "skip indisti
3980: 6e 63 74 20 72 65 63 6f 72 64 73 22 29 29 3b 0a  nct records"));.
3990: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
39a0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
39b0: 65 72 74 2c 20 69 54 61 62 2c 20 30 29 3b 0a 7d  ert, iTab, 0);.}
39c0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65  ../*.** Add code
39d0: 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b   that will check
39e0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
39f0: 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73  e top N elements
3a00: 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b   of the.** stack
3a10: 20 61 72 65 20 64 69 73 74 69 6e 63 74 2e 20 20   are distinct.  
3a20: 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e  iTab is a sortin
3a30: 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  g index that hol
3a40: 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  ds previously.**
3a50: 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f   seen combinatio
3a60: 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75  ns of the N valu
3a70: 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  es.  A new entry
3a80: 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62   is made in iTab
3a90: 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65  .** if the curre
3aa0: 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20  nt N values are 
3ab0: 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d  new..**.** A jum
3ac0: 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20  p to addrRepeat 
3ad0: 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20  is made and the 
3ae0: 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70  N+1 values are p
3af0: 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  opped from the.*
3b00: 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74  * stack if the t
3b10: 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72  op N elements ar
3b20: 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a  e not distinct..
3b30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3b40: 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 56  odeDistinct(.  V
3b50: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
3b60: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
3b70: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20  de into this VM 
3b80: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
3b90: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72          /* A sor
3ba0: 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20  ting index used 
3bb0: 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74  to test for dist
3bc0: 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e  inctness */.  in
3bd0: 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20  t addrRepeat,   
3be0: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
3bf0: 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74   if not distinct
3c00: 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20   */.  int N,    
3c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3c20: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a  er of elements *
3c30: 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20  /.  int iMem    
3c40: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
3c50: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  element */.){.  
3c60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3c70: 32 28 76 2c 20 4f 50 5f 52 65 67 4d 61 6b 65 52  2(v, OP_RegMakeR
3c80: 65 63 2c 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20  ec, iMem, N);.  
3c90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3ca0: 32 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74  2(v, OP_Distinct
3cb0: 2c 20 69 54 61 62 2c 20 73 71 6c 69 74 65 33 56  , iTab, sqlite3V
3cc0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
3cd0: 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  )+3);.  sqlite3V
3ce0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3cf0: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71  Pop, 1, 0);.  sq
3d00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3d10: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
3d20: 64 64 72 52 65 70 65 61 74 29 3b 0a 20 20 56 64  ddrRepeat);.  Vd
3d30: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
3d40: 6b 69 70 20 69 6e 64 69 73 74 69 6e 63 74 20 72  kip indistinct r
3d50: 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 73 71 6c  ecords"));.  sql
3d60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3d70: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
3d80: 69 54 61 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  iTab, 0);.}../*.
3d90: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65  ** Generate an e
3da0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65  rror message whe
3db0: 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20 75 73  n a SELECT is us
3dc0: 65 64 20 77 69 74 68 69 6e 20 61 20 73 75 62 65  ed within a sube
3dd0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78  xpression.** (ex
3de0: 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53  ample:  "a IN (S
3df0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
3e00: 6c 65 29 22 29 20 62 75 74 20 69 74 20 68 61 73  le)") but it has
3e10: 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73   more than 1 res
3e20: 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20  ult.** column.  
3e30: 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20  We do this in a 
3e40: 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75  subroutine becau
3e50: 73 65 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  se the error occ
3e60: 75 72 73 20 69 6e 20 6d 75 6c 74 69 70 6c 65 0a  urs in multiple.
3e70: 2a 2a 20 70 6c 61 63 65 73 2e 0a 2a 2f 0a 73 74  ** places..*/.st
3e80: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f  atic int checkFo
3e90: 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65  rMultiColumnSele
3ea0: 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65  ctError(.  Parse
3eb0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3ec0: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
3ed0: 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
3ee0: 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44  t *pDest,   /* D
3ef0: 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45  estination of SE
3f00: 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a  LECT results */.
3f10: 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20    int nExpr     
3f20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3f30: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
3f40: 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ns returned by S
3f50: 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ELECT */.){.  in
3f60: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
3f70: 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45  >eDest;.  if( nE
3f80: 78 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d  xpr>1 && (eDest=
3f90: 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
3fa0: 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20  t==SRT_Set) ){. 
3fb0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3fc0: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79  sg(pParse, "only
3fd0: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
3fe0: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20   allowed for ". 
3ff0: 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20        "a SELECT 
4000: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
4010: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b  an expression");
4020: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
4030: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
4040: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
4050: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4060: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
4070: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
4080: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
4090: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
40a0: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63  CT..**.** If src
40b0: 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20  Tab and nColumn 
40c0: 61 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74  are both zero, t
40d0: 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65  hen the pEList e
40e0: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72  xpressions.** ar
40f0: 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f  e evaluated in o
4100: 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
4110: 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f  data for this ro
4120: 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30  w.  If nColumn>0
4130: 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73  .** then data is
4140: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63   pulled from src
4150: 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69  Tab and pEList i
4160: 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67  s used only to g
4170: 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79  et the.** dataty
4180: 70 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  pes for each col
4190: 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  umn..*/.static i
41a0: 6e 74 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  nt selectInnerLo
41b0: 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  op(.  Parse *pPa
41c0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
41d0: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
41e0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
41f0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
4200: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65   /* The complete
4210: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
4220: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
4230: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
4240: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69  ist,       /* Li
4250: 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69  st of values bei
4260: 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a  ng extracted */.
4270: 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20    int srcTab,   
4280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c            /* Pul
4290: 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73  l data from this
42a0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
42b0: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  nColumn,        
42c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
42d0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
42e0: 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a  source table */.
42f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
4300: 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20  erBy,     /* If 
4310: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72  not NULL, sort r
4320: 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69  esults using thi
4330: 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64  s key */.  int d
4340: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20  istinct,        
4350: 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61     /* If >=0, ma
4360: 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74 73 20  ke sure results 
4370: 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  are distinct */.
4380: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
4390: 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77  est,      /* How
43a0: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
43b0: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
43c0: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
43d0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
43e0: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
43f0: 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a   with next row *
4400: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 2c 20  /.  int iBreak, 
4410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
4420: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
4430: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  k out of the inn
4440: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61  er loop */.  cha
4450: 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20  r *aff          
4460: 20 20 20 20 20 2f 2a 20 61 66 66 69 6e 69 74 79       /* affinity
4470: 20 73 74 72 69 6e 67 20 69 66 20 65 44 65 73 74   string if eDest
4480: 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f   is SRT_Union */
4490: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
44a0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
44b0: 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 6e 74   int i, n;.  int
44c0: 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20   hasDistinct;   
44d0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
44e0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
44f0: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
4500: 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 20 20  */.  int iMem;  
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4520: 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20  Start of memory 
4530: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 73  holding result s
4540: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  et */.  int eDes
4550: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
4560: 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  ;.  int iParm = 
4570: 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20  pDest->iParm;.. 
4580: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
4590: 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
45a0: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20  pEList!=0 );..  
45b0: 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
45c0: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  a LIMIT clause o
45d0: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
45e0: 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20  tement, then do 
45f0: 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74  the check.  ** t
4600: 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 72 6f  o see if this ro
4610: 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75 74 70  w should be outp
4620: 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61 73 44 69  ut..  */.  hasDi
4630: 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69 6e 63  stinct = distinc
4640: 74 3e 3d 30 20 26 26 20 70 45 4c 69 73 74 2d 3e  t>=0 && pEList->
4650: 6e 45 78 70 72 3e 30 3b 0a 20 20 69 66 28 20 70  nExpr>0;.  if( p
4660: 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21 68  OrderBy==0 && !h
4670: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
4680: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
4690: 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 30 29  p, iContinue, 0)
46a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c  ;.  }..  /* Pull
46b0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
46c0: 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  olumns..  */.  i
46d0: 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a  f( nColumn>0 ){.
46e0: 20 20 20 20 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b      n = nColumn;
46f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 20  .  }else{.    n 
4700: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
4710: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73 74  .  }.  if( pDest
4720: 2d 3e 69 4d 65 6d 3e 30 20 29 7b 0a 20 20 20 20  ->iMem>0 ){.    
4730: 69 4d 65 6d 20 3d 20 70 44 65 73 74 2d 3e 69 4d  iMem = pDest->iM
4740: 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  em;.  }else{.   
4750: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 69   pDest->iMem = i
4760: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
4770: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
4780: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 3b 0a 20 20 7d  ->nMem += n;.  }
4790: 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30  .  if( nColumn>0
47a0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
47b0: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
47c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
47d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
47e0: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
47f0: 69 2c 20 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20  i, iMem+i);.    
4800: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44  }.  }else if( eD
4810: 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20  est!=SRT_Exists 
4820: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
4830: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
4840: 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65  an EXISTS(...) e
4850: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61  xpression, the a
4860: 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c  ctual.    ** val
4870: 75 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ues returned by 
4880: 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e  the SELECT are n
4890: 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  ot required..   
48a0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
48b0: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
48c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
48d0: 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  e(pParse, pEList
48e0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 4d  ->a[i].pExpr, iM
48f0: 65 6d 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  em+i);.    }.  }
4900: 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 3b 0a  .  nColumn = n;.
4910: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
4920: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
4930: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
4940: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4950: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
4960: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
4970: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
4980: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
4990: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
49a0: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
49b0: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
49c0: 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nct ){.    asser
49d0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
49e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
49f0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75  st->nExpr==nColu
4a00: 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65 44 69  mn );.    codeDi
4a10: 73 74 69 6e 63 74 28 76 2c 20 64 69 73 74 69 6e  stinct(v, distin
4a20: 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e  ct, iContinue, n
4a30: 43 6f 6c 75 6d 6e 2c 20 69 4d 65 6d 29 3b 0a 20  Column, iMem);. 
4a40: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d     if( pOrderBy=
4a50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  =0 ){.      code
4a60: 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f  Offset(v, p, iCo
4a70: 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 29  ntinue, nColumn)
4a80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
4a90: 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69  f( checkForMulti
4aa0: 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f  ColumnSelectErro
4ab0: 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c  r(pParse, pDest,
4ac0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20   pEList->nExpr) 
4ad0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
4ae0: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
4af0: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
4b00: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
4b10: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
4b20: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
4b30: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
4b40: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
4b50: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  Parm..    */.#if
4b60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4b70: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
4b80: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
4b90: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ion: {.      sql
4ba0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4bb0: 2c 20 4f 50 5f 52 65 67 4d 61 6b 65 52 65 63 2c  , OP_RegMakeRec,
4bc0: 20 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b   iMem, nColumn);
4bd0: 0a 20 20 20 20 20 20 69 66 28 20 61 66 66 20 29  .      if( aff )
4be0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4bf0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
4c00: 20 2d 31 2c 20 61 66 66 2c 20 50 34 5f 53 54 41   -1, aff, P4_STA
4c10: 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
4c20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4c30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
4c40: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 30 29  nsert, iParm, 0)
4c50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4c60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e     }..    /* Con
4c70: 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20  struct a record 
4c80: 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72  from the query r
4c90: 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65  esult, but inste
4ca0: 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76  ad of.    ** sav
4cb0: 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c  ing that record,
4cc0: 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79   use it as a key
4cd0: 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65   to delete eleme
4ce0: 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  nts from.    ** 
4cf0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
4d00: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
4d10: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
4d20: 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 69  xcept: {.      i
4d30: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61  nt addr;.      a
4d40: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
4d50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
4d60: 67 4d 61 6b 65 52 65 63 2c 20 69 4d 65 6d 2c 20  gMakeRec, iMem, 
4d70: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
4d80: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
4d90: 65 50 34 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20  eP4(v, -1, aff, 
4da0: 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
4db0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4dc0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Op2(v, OP_NotFou
4dd0: 6e 64 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 2b  nd, iParm, addr+
4de0: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
4df0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4e00: 50 5f 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c  P_Delete, iParm,
4e10: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
4e20: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
4e30: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
4e40: 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
4e50: 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
4e60: 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
4e70: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
4e80: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
4e90: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71  mTab: {.      sq
4ea0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4eb0: 76 2c 20 4f 50 5f 52 65 67 4d 61 6b 65 52 65 63  v, OP_RegMakeRec
4ec0: 2c 20 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29  , iMem, nColumn)
4ed0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
4ee0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
4ef0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
4f00: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
4f10: 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   p);.      }else
4f20: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4f30: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
4f40: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
4f50: 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
4f60: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4f70: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
4f80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4f90: 43 6f 64 65 49 6e 73 65 72 74 28 70 50 61 72 73  CodeInsert(pPars
4fa0: 65 2c 20 69 50 61 72 6d 2c 20 4f 50 46 4c 41 47  e, iParm, OPFLAG
4fb0: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
4fc0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4fd0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
4fe0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
4ff0: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
5000: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
5010: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
5020: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
5030: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
5040: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
5050: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
5060: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
5070: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
5080: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
5090: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
50a0: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
50b0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
50c0: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
50d0: 20 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20 20 20   int addr2;..   
50e0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
50f0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61  mn==1 );.      a
5100: 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
5110: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
5120: 73 4e 75 6c 6c 2c 20 69 4d 65 6d 2c 20 30 29 3b  sNull, iMem, 0);
5130: 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e 69  .      p->affini
5140: 74 79 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ty = sqlite3Comp
5150: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69  areAffinity(pELi
5160: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
5170: 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 29  pDest->affinity)
5180: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
5190: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
51a0: 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e  /* At first glan
51b0: 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69  ce you would thi
51c0: 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69  nk we could opti
51d0: 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20  mize out the.   
51e0: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
51f0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69   in this case si
5200: 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  nce the order of
5210: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
5220: 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  set.        ** d
5230: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20  oes not matter. 
5240: 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74   But there might
5250: 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   be a LIMIT clau
5260: 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20  se, in which.   
5270: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65       ** case the
5280: 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74   order does matt
5290: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  er */.        sq
52a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
52b0: 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 4d 65  v, OP_SCopy, iMe
52c0: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  m, 0);.        p
52d0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
52e0: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
52f0: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  p);.      }else{
5300: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5310: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
5320: 5f 52 65 67 4d 61 6b 65 52 65 63 2c 20 69 4d 65  _RegMakeRec, iMe
5330: 6d 2c 20 31 2c 20 30 2c 20 26 70 2d 3e 61 66 66  m, 1, 0, &p->aff
5340: 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
5350: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5360: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
5370: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b  sert, iParm, 0);
5380: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
5390: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
53a0: 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20  re(v, addr2);.  
53b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
53c0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20  ..    /* If any 
53d0: 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65  row exist in the
53e0: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63   result set, rec
53f0: 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e  ord that fact an
5400: 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a  d abort..    */.
5410: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69      case SRT_Exi
5420: 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  sts: {.      sql
5430: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5440: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
5450: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f   iParm);.      /
5460: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
5470: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
5480: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
5490: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
54a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
54b0: 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
54c0: 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
54d0: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
54e0: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
54f0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
5500: 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
5510: 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
5520: 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b  y cell and break
5530: 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74   out.    ** of t
5540: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
5550: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
5560: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
5570: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
5580: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
5590: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
55a0: 4f 50 5f 53 43 6f 70 79 2c 20 69 4d 65 6d 2c 20  OP_SCopy, iMem, 
55b0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  0);.      if( pO
55c0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
55d0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
55e0: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
55f0: 79 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  y, p);.      }el
5600: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5610: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5620: 20 4f 50 5f 4d 6f 76 65 2c 20 30 2c 20 69 50 61   OP_Move, 0, iPa
5630: 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  rm);.        /* 
5640: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
5650: 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f   will jump out o
5660: 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  f the loop for u
5670: 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s */.      }.   
5680: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5690: 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
56a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
56b0: 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
56c0: 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74 61 20  * Send the data 
56d0: 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
56e0: 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61  function or to a
56f0: 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e   subroutine.  In
5700: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65   the.    ** case
5710: 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
5720: 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
5730: 20 69 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f   itself is respo
5740: 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a  nsible for.    *
5750: 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61  * popping the da
5760: 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ta from the stac
5770: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  k..    */.    ca
5780: 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e  se SRT_Subroutin
5790: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
57a0: 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20  Callback: {.    
57b0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
57c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
57d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
57e0: 50 5f 52 65 67 4d 61 6b 65 52 65 63 2c 20 69 4d  P_RegMakeRec, iM
57f0: 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  em, nColumn);.  
5800: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
5810: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
5820: 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20  derBy, p);.     
5830: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
5840: 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65  ==SRT_Subroutine
5850: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5860: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5870: 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50   OP_Gosub, 0, iP
5880: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  arm);.      }els
5890: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
58a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
58b0: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 4d  OP_ResultRow, iM
58c0: 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  em, nColumn);.  
58d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
58e0: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64  k;.    }..#if !d
58f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5900: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
5910: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
5920: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
5930: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
5940: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
5950: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
5960: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
5970: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
5980: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
5990: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
59a0: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
59b0: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
59c0: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
59d0: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
59e0: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
59f0: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
5a00: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
5a10: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
5a20: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
5a30: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
5a40: 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72  card );.      br
5a50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5a60: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  f.  }..  /* Jump
5a70: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
5a80: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
5a90: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
5aa0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
5ab0: 4c 69 6d 69 74 3e 3d 30 20 26 26 20 70 4f 72 64  Limit>=0 && pOrd
5ac0: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73  erBy==0 ){.    s
5ad0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5ae0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70  (v, OP_AddImm, p
5af0: 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20  ->iLimit, -1);. 
5b00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5b10: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp2(v, OP_IfZer
5b20: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
5b30: 72 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74  reak);.  }.  ret
5b40: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
5b50: 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73  Given an express
5b60: 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61  ion list, genera
5b70: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  te a KeyInfo str
5b80: 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f  ucture that reco
5b90: 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61  rds.** the colla
5ba0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
5bb0: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
5bc0: 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  n in that expres
5bd0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
5be0: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
5bf0: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
5c00: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
5c10: 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  se then the resu
5c20: 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f  lting.** KeyInfo
5c30: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
5c40: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
5c50: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
5c60: 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a  tual index to.**
5c70: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20   implement that 
5c80: 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20  clause.  If the 
5c90: 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20  ExprList is the 
5ca0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
5cb0: 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74  SELECT.** then t
5cc0: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
5cd0: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
5ce0: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
5cf0: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a  zing a virtual.*
5d00: 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65  * index to imple
5d10: 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20  ment a DISTINCT 
5d20: 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  test..**.** Spac
5d30: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65  e to hold the Ke
5d40: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
5d50: 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20 6d  is obtain from m
5d60: 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c  alloc.  The call
5d70: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
5d80: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
5d90: 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74  or seeing that t
5da0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
5db0: 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
5dc0: 72 65 65 64 2e 20 20 41 64 64 20 74 68 65 20 4b  reed.  Add the K
5dd0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5de0: 20 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c 64   to the P4 field
5df0: 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75 73   of an opcode us
5e00: 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e 46  ing.** P4_KEYINF
5e10: 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68 65  O_HANDOFF is the
5e20: 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64 65   usual way of de
5e30: 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73 2e  aling with this.
5e40: 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e  .*/.static KeyIn
5e50: 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  fo *keyInfoFromE
5e60: 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a 70  xprList(Parse *p
5e70: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
5e80: 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pList){.  sqlit
5e90: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5ea0: 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72  >db;.  int nExpr
5eb0: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
5ec0: 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  fo;.  struct Exp
5ed0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
5ee0: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e  m;.  int i;..  n
5ef0: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Expr = pList->nE
5f00: 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73  xpr;.  pInfo = s
5f10: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
5f20: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
5f30: 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73  Info) + nExpr*(s
5f40: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
5f50: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66  1) );.  if( pInf
5f60: 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  o ){.    pInfo->
5f70: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
5f80: 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  *)&pInfo->aColl[
5f90: 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e 66  nExpr];.    pInf
5fa0: 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78 70  o->nField = nExp
5fb0: 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e  r;.    pInfo->en
5fc0: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
5fd0: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
5fe0: 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70  pList->a; i<nExp
5ff0: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
6000: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
6010: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
6020: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
6030: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
6040: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
6050: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
6060: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
6070: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
6080: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
6090: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d   pInfo->aColl[i]
60a0: 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
60b0: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
60c0: 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  r[i] = pItem->so
60d0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
60e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
60f0: 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  o;.}.../*.** If 
6100: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
6110: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
6120: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
6130: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
6140: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
6150: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
6160: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
6170: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
6180: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
6190: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
61a0: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
61b0: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
61c0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
61d0: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
61e0: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
61f0: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
6200: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6210: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
6220: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6230: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
6240: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
6250: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
6260: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
6270: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62  atement */.  Vdb
6280: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
6290: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
62a0: 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  into this VDBE *
62b0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
62c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
62d0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
62e0: 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
62f0: 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69  st *pDest /* Wri
6300: 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65  te the sorted re
6310: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
6320: 0a 20 20 69 6e 74 20 62 72 6b 20 3d 20 73 71 6c  .  int brk = sql
6330: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
6340: 6c 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f 6e 74  l(v);.  int cont
6350: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
6360: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e  keLabel(v);.  in
6370: 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54  t addr;.  int iT
6380: 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f  ab;.  int pseudo
6390: 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c  Tab = 0;.  ExprL
63a0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
63b0: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20  p->pOrderBy;..  
63c0: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
63d0: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20  t->eDest;.  int 
63e0: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
63f0: 50 61 72 6d 3b 0a 0a 20 20 69 54 61 62 20 3d 20  Parm;..  iTab = 
6400: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
6410: 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  or;.  if( eDest=
6420: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c  =SRT_Callback ||
6430: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75 62 72   eDest==SRT_Subr
6440: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73  outine ){.    ps
6450: 65 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65  eudoTab = pParse
6460: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71  ->nTab++;.    sq
6470: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6480: 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
6490: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b  , pseudoTab, 0);
64a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
64b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74  AddOp2(v, OP_Set
64c0: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 73 65 75  NumColumns, pseu
64d0: 64 6f 54 61 62 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  doTab, nColumn);
64e0: 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 31 20  .  }.  addr = 1 
64f0: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
6500: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
6510: 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f  iTab, brk);.  co
6520: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 63  deOffset(v, p, c
6530: 6f 6e 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 65  ont, 0);.  if( e
6540: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
6550: 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ck || eDest==SRT
6560: 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20  _Subroutine ){. 
6570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6580: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
6590: 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20  er, 1, 0);.  }. 
65a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
65b0: 70 32 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p2(v, OP_Column,
65c0: 20 69 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d   iTab, pOrderBy-
65d0: 3e 6e 45 78 70 72 20 2b 20 31 29 3b 0a 20 20 73  >nExpr + 1);.  s
65e0: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
65f0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
6600: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
6610: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
6620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6630: 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp1(v, OP_NewRo
6640: 77 69 64 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  wid, iParm);.   
6650: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6660: 64 4f 70 32 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  dOp2(v, OP_Pull,
6670: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
6680: 6c 69 74 65 33 43 6f 64 65 49 6e 73 65 72 74 28  lite3CodeInsert(
6690: 70 50 61 72 73 65 2c 20 69 50 61 72 6d 2c 20 4f  pParse, iParm, O
66a0: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
66b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
66c0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
66d0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
66e0: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
66f0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 2c   {.      int j1,
6700: 20 6a 32 3b 0a 20 20 20 20 20 20 61 73 73 65 72   j2;.      asser
6710: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
6720: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6730: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 53  beAddOp0(v, OP_S
6740: 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 6a 31 20  Copy);.      j1 
6750: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
6760: 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op0(v, OP_NotNul
6770: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
6780: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
6790: 50 5f 50 6f 70 2c 20 31 29 3b 0a 20 20 20 20 20  P_Pop, 1);.     
67a0: 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
67b0: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
67c0: 74 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  to);.      sqlit
67d0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
67e0: 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , j1);.      sql
67f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
6800: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
6810: 20 31 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 61 66   1, 0, 0, &p->af
6820: 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
6830: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6840: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
6850: 65 72 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  ert, iParm, 0);.
6860: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6870: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29  eJumpHere(v, j2)
6880: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6890: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
68a0: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
68b0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
68c0: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
68d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
68e0: 4f 50 5f 4d 6f 76 65 2c 20 30 2c 20 69 50 61 72  OP_Move, 0, iPar
68f0: 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  m);.      /* The
6900: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
6910: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
6920: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
6930: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6940: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
6950: 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a  se SRT_Callback:
6960: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 75  .    case SRT_Su
6970: 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20  broutine: {.    
6980: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73    int i;.      s
6990: 71 6c 69 74 65 33 43 6f 64 65 49 6e 73 65 72 74  qlite3CodeInsert
69a0: 28 70 50 61 72 73 65 2c 20 70 73 65 75 64 6f 54  (pParse, pseudoT
69b0: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f  ab, 0);.      fo
69c0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e  r(i=0; i<nColumn
69d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
69e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
69f0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
6a00: 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20 70 44  pseudoTab, i, pD
6a10: 65 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20 20  est->iMem+i);.  
6a20: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6a30: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
6a40: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ack ){.        s
6a50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6a60: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
6a70: 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e  , pDest->iMem, n
6a80: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
6a90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
6aa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6ab0: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
6ac0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  iParm);.      }.
6ad0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6ae0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
6af0: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
6b00: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
6b10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
6b20: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
6b30: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
6b40: 70 20 77 68 65 6e 20 74 68 65 20 4c 49 4d 49 54  p when the LIMIT
6b50: 20 69 73 20 72 65 61 63 68 65 64 0a 20 20 2a 2f   is reached.  */
6b60: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
6b70: 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
6b80: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6b90: 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c  OP_AddImm, p->iL
6ba0: 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 73  imit, -1);.    s
6bb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6bc0: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70  (v, OP_IfZero, p
6bd0: 2d 3e 69 4c 69 6d 69 74 2c 20 62 72 6b 29 3b 0a  ->iLimit, brk);.
6be0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f    }..  /* The bo
6bf0: 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
6c00: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
6c10: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
6c20: 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69  v, cont);.  sqli
6c30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6c40: 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
6c50: 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  addr);.  sqlite3
6c60: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
6c70: 28 76 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28 20  (v, brk);.  if( 
6c80: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
6c90: 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  ack || eDest==SR
6ca0: 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a  T_Subroutine ){.
6cb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6cc0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
6cd0: 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29  e, pseudoTab, 0)
6ce0: 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ;.  }..}../*.** 
6cf0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
6d00: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
6d10: 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63  taining the 'dec
6d20: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f  laration type' o
6d30: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
6d40: 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73  ion pExpr. The s
6d50: 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65  tring may be tre
6d60: 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62  ated as static b
6d70: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
6d80: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
6d90: 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20  ion type is the 
6da0: 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64  exact datatype d
6db0: 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63  efinition extrac
6dc0: 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ted from the.** 
6dd0: 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20  original CREATE 
6de0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
6df0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
6e00: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54  n is a column. T
6e10: 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f  he.** declaratio
6e20: 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57  n type for a ROW
6e30: 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45  ID field is INTE
6e40: 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65  GER. Exactly whe
6e50: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  n an expression.
6e60: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
6e70: 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65   a column can be
6e80: 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20   complex in the 
6e90: 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71  presence of subq
6ea0: 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72  ueries. The.** r
6eb0: 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73  esult-set expres
6ec0: 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74  sion in all of t
6ed0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c  he following SEL
6ee0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
6ef0: 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  s .** considered
6f00: 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69   a column by thi
6f10: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
6f20: 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46  *   SELECT col F
6f30: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
6f40: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
6f50: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
6f60: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
6f70: 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  ol FROM tbl);.**
6f80: 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52     SELECT abc FR
6f90: 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41  OM (SELECT col A
6fa0: 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b  S abc FROM tbl);
6fb0: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c  .** .** The decl
6fc0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
6fd0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
6fe0: 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c  other than a col
6ff0: 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  umn is NULL..*/.
7000: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
7010: 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20  r *columnType(. 
7020: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
7030: 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  C, .  Expr *pExp
7040: 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  r,.  const char 
7050: 2a 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20  **pzOriginDb,.  
7060: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
7070: 72 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73  riginTab,.  cons
7080: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69  t char **pzOrigi
7090: 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63  nCol.){.  char c
70a0: 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b  onst *zType = 0;
70b0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
70c0: 4f 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20  OriginDb = 0;.  
70d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
70e0: 67 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68  ginTab = 0;.  ch
70f0: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69  ar const *zOrigi
7100: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nCol = 0;.  int 
7110: 6a 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  j;.  if( pExpr==
7120: 30 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  0 || pNC->pSrcLi
7130: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
7140: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
7150: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
7160: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
7170: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
7180: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
7190: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
71a0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63  is a column. Loc
71b0: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68  ate the table th
71c0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e  e column is bein
71d0: 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61  g.      ** extra
71e0: 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d  cted from in Nam
71f0: 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73  eContext.pSrcLis
7200: 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61  t. This table ma
7210: 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20  y be real.      
7220: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ** database tabl
7230: 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  e or a subquery.
7240: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
7250: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
7260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7270: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  able structure c
7280: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
7290: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
72a0: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b   Select *pS = 0;
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
72c0: 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  Select the colum
72d0: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
72e0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rom */.      int
72f0: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
7300: 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65  Column;  /* Inde
7310: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  x of column in p
7320: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  Tab */.      whi
7330: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
7340: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
7350: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
7360: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
7370: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
7380: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
7390: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
73a0: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
73b0: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
73c0: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
73d0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
73e0: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
73f0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
7400: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
7410: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
7420: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
7430: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7440: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
7450: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
7460: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7470: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
7480: 20 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45         /* FIX ME
7490: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  :.        ** Thi
74a0: 73 20 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20  s can occurs if 
74b0: 79 6f 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69  you have somethi
74c0: 6e 67 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20  ng like "SELECT 
74d0: 6e 65 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20  new.x;" inside. 
74e0: 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67         ** a trig
74f0: 67 65 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ger.  In other w
7500: 6f 72 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66  ords, if you ref
7510: 65 72 65 6e 63 65 20 74 68 65 20 73 70 65 63 69  erence the speci
7520: 61 6c 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20  al "new".       
7530: 20 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65   ** table in the
7540: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
7550: 20 73 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20   select.  We do 
7560: 6e 6f 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20  not have a good 
7570: 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  way.        ** t
7580: 6f 20 66 69 6e 64 20 74 68 65 20 61 63 74 75 61  o find the actua
7590: 6c 20 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f  l table type, so
75a0: 20 63 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e   call it "TEXT".
75b0: 20 20 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79    This is really
75c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65  .        ** some
75d0: 74 68 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20  thing of a bug, 
75e0: 62 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f  but I do not kno
75f0: 77 20 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e  w how to fix it.
7600: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
7610: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
7620: 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63   does not produc
7630: 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
7640: 73 77 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70  swer - it just p
7650: 72 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20  revents.        
7660: 2a 2a 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20  ** a segfault.  
7670: 53 65 65 20 74 69 63 6b 65 74 20 23 31 32 32 39  See ticket #1229
7680: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
7690: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45       zType = "TE
76a0: 58 54 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65  XT";.        bre
76b0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
76c0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20     assert( pTab 
76d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20  );.      if( pS 
76e0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
76f0: 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74  e "table" is act
7700: 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65  ually a sub-sele
7710: 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20  ct or a view in 
7720: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
7730: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
7740: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
7750: 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  nt. Return the d
7760: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
7770: 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20  and origin.     
7780: 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74     ** data for t
7790: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f  he result-set co
77a0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d  lumn of the sub-
77b0: 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20  select..        
77c0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
77d0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
77e0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  S->pEList->nExpr
77f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
7800: 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73   If iCol is less
7810: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
7820: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7830: 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20  requests the.   
7840: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20         ** rowid 
7850: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
7860: 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20  t or view. This 
7870: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65  expression is le
7880: 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20  gal (see .      
7890: 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65      ** test case
78a0: 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74   misc2.2.2) - it
78b0: 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65   always evaluate
78c0: 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  s to NULL..     
78d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
78e0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
78f0: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  C;.          Exp
7900: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
7910: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
7920: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
7930: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
7940: 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Src;.          s
7950: 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  NC.pNext = 0;.  
7960: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72          sNC.pPar
7970: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
7980: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  ;.          zTyp
7990: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
79a0: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e  sNC, p, &zOrigin
79b0: 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c  Db, &zOriginTab,
79c0: 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a   &zOriginCol); .
79d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
79e0: 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e  }else if( pTab->
79f0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
7a00: 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62     /* A real tab
7a10: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  le */.        as
7a20: 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20  sert( !pS );.   
7a30: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
7a40: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
7a50: 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73  PKey;.        as
7a60: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
7a70: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
7a80: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
7a90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
7aa0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
7ab0: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
7ac0: 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ER";.          z
7ad0: 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f 77  OriginCol = "row
7ae0: 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  id";.        }el
7af0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se{.          zT
7b00: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
7b10: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
7b20: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43          zOriginC
7b30: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
7b40: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
7b50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
7b60: 4f 72 69 67 69 6e 54 61 62 20 3d 20 70 54 61 62  OriginTab = pTab
7b70: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
7b80: 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65   if( pNC->pParse
7b90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
7ba0: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
7bb0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43  chemaToIndex(pNC
7bc0: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  ->pParse->db, pT
7bd0: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
7be0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 44          zOriginD
7bf0: 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d  b = pNC->pParse-
7c00: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
7c10: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ame;.        }. 
7c20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7c30: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
7c40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
7c50: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
7c60: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
7c70: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
7c80: 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65  sion is a sub-se
7c90: 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65  lect. Return the
7ca0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
7cb0: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f  e and.      ** o
7cc0: 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74  rigin info for t
7cd0: 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e  he single column
7ce0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
7cf0: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
7d00: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
7d10: 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
7d20: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
7d30: 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  sNC;.      Selec
7d40: 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 70  t *pS = pExpr->p
7d50: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78  Select;.      Ex
7d60: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
7d70: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
7d80: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
7d90: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
7da0: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
7db0: 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e   pNC;.      sNC.
7dc0: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
7dd0: 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70  arse;.      zTyp
7de0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
7df0: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e  sNC, p, &zOrigin
7e00: 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c  Db, &zOriginTab,
7e10: 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a   &zOriginCol); .
7e20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7e30: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
7e40: 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69 6e 44  .  if( pzOriginD
7e50: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
7e60: 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26 26 20   pzOriginTab && 
7e70: 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a 20  pzOriginCol );. 
7e80: 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20 3d     *pzOriginDb =
7e90: 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20 20   zOriginDb;.    
7ea0: 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 7a  *pzOriginTab = z
7eb0: 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20 20 2a  OriginTab;.    *
7ec0: 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f  pzOriginCol = zO
7ed0: 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20  riginCol;.  }.  
7ee0: 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a  return zType;.}.
7ef0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
7f00: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
7f10: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
7f20: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
7f30: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
7f40: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
7f50: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  et..*/.static vo
7f60: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
7f70: 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20  nTypes(.  Parse 
7f80: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
7f90: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
7fa0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
7fb0: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
7fc0: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
7fd0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
7fe0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
7ff0: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
8000: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
8010: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
8020: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
8030: 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t i;.  NameConte
8040: 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53  xt sNC;.  sNC.pS
8050: 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
8060: 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20  t;.  sNC.pParse 
8070: 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28  = pParse;.  for(
8080: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
8090: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
80a0: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
80b0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
80c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
80d0: 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63  rigDb = 0;.    c
80e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
80f0: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  Tab = 0;.    con
8100: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f  st char *zOrigCo
8110: 6c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  l = 0;.    const
8120: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 63   char *zType = c
8130: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
8140: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
8150: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
8160: 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  l);..    /* The 
8170: 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69  vdbe must make i
8180: 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74  ts own copy of t
8190: 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61  he column-type a
81a0: 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a  nd other .    **
81b0: 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63   column specific
81c0: 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73   strings, in cas
81d0: 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  e the schema is 
81e0: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
81f0: 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  s.    ** virtual
8200: 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65   machine is dele
8210: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
8220: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8230: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8240: 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54  AME_DECLTYPE, zT
8250: 79 70 65 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e  ype, P4_TRANSIEN
8260: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
8270: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8280: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41   i, COLNAME_DATA
8290: 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 50  BASE, zOrigDb, P
82a0: 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  4_TRANSIENT);.  
82b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
82c0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
82d0: 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72  LNAME_TABLE, zOr
82e0: 69 67 54 61 62 2c 20 50 34 5f 54 52 41 4e 53 49  igTab, P4_TRANSI
82f0: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
8300: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8310: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f  v, i, COLNAME_CO
8320: 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20  LUMN, zOrigCol, 
8330: 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  P4_TRANSIENT);. 
8340: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
8350: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
8360: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
8370: 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  E the names of c
8380: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
8390: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68   result set.  Th
83a0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
83b0: 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64  s used to provid
83c0: 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d  e the.** azCol[]
83d0: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63   values in the c
83e0: 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  allback..*/.stat
83f0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
8400: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50  ColumnNames(.  P
8410: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8420: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
8430: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
8440: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
8450: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
8460: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
8470: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
8480: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
8490: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
84a0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
84b0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
84c0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73  .  int i, j;.  s
84d0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
84e0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66  rse->db;.  int f
84f0: 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e  ullNames, shortN
8500: 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ames;..#ifndef S
8510: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
8520: 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  IN.  /* If this 
8530: 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73  is an EXPLAIN, s
8540: 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f  kip this step */
8550: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
8560: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65  xplain ){.    re
8570: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
8580: 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ..  assert( v!=0
8590: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
85a0: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c  ->colNamesSet ||
85b0: 20 76 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   v==0 || db->mal
85c0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
85d0: 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f  rn;.  pParse->co
85e0: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
85f0: 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62   fullNames = (db
8600: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
8610: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
8620: 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20  0;.  shortNames 
8630: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
8640: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
8650: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  mes)!=0;.  sqlit
8660: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
8670: 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
8680: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
8690: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
86a0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
86b0: 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  p;.    p = pELis
86c0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
86d0: 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f     if( p==0 ) co
86e0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
86f0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
8700: 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  me ){.      char
8710: 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   *zName = pEList
8720: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
8730: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8740: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8750: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
8760: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
8770: 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  e));.      conti
8780: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
8790: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
87a0: 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20  UMN && pTabList 
87b0: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
87c0: 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72  pTab;.      char
87d0: 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e   *zCol;.      in
87e0: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
87f0: 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  umn;.      for(j
8800: 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; j<pTabList->
8810: 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74  nSrc && pTabList
8820: 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d  ->a[j].iCursor!=
8830: 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b  p->iTable; j++){
8840: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
8850: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
8860: 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   );.      pTab =
8870: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
8880: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
8890: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
88a0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
88b0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
88c0: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
88d0: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
88e0: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
88f0: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
8900: 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64     zCol = "rowid
8910: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
8920: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70          zCol = p
8930: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
8940: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zName;.      }. 
8950: 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e       if( !shortN
8960: 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d  ames && !fullNam
8970: 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 20  es && p->span.z 
8980: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
8990: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
89a0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
89b0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
89c0: 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73  AME, (char*)p->s
89d0: 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e  pan.z, p->span.n
89e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
89f0: 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20  f( fullNames || 
8a00: 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20  (!shortNames && 
8a10: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
8a20: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
8a30: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
8a40: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
8a50: 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62  ;. .        zTab
8a60: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
8a70: 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ].zAlias;.      
8a80: 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20    if( fullNames 
8a90: 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61  || zTab==0 ) zTa
8aa0: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
8ab0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8ac0: 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65  SetString(&zName
8ad0: 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f  , zTab, ".", zCo
8ae0: 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  l, (char*)0);.  
8af0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8b00: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8b10: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
8b20: 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49  zName, P4_DYNAMI
8b30: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
8b40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8b50: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8b60: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
8b70: 45 2c 20 7a 43 6f 6c 2c 20 73 74 72 6c 65 6e 28  E, zCol, strlen(
8b80: 7a 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 7d 0a  zCol));.      }.
8b90: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
8ba0: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
8bb0: 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  an.z[0] ){.     
8bc0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8bd0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8be0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68 61 72  NAME_NAME, (char
8bf0: 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e  *)p->span.z, p->
8c00: 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 2f  span.n);.      /
8c10: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d  * sqlite3VdbeCom
8c20: 70 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64  pressSpace(v, ad
8c30: 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  dr); */.    }els
8c40: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4e  e{.      char zN
8c50: 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61  ame[30];.      a
8c60: 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
8c70: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c  _COLUMN || pTabL
8c80: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
8c90: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8ca0: 28 73 69 7a 65 6f 66 28 7a 4e 61 6d 65 29 2c 20  (sizeof(zName), 
8cb0: 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64  zName, "column%d
8cc0: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73  ", i+1);.      s
8cd0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8ce0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8cf0: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
8d00: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
8d10: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
8d20: 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  pes(pParse, pTab
8d30: 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  List, pEList);.}
8d40: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8d50: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
8d60: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  ELECT./*.** Name
8d70: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
8d80: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
8d90: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
8da0: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
8db0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
8dc0: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
8dd0: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
8de0: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
8df0: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
8e00: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
8e10: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
8e20: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
8e30: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
8e40: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
8e50: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
8e60: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
8e70: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
8e80: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
8e90: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
8ea0: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
8eb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
8ec0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
8ed0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
8ee0: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
8ef0: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
8f00: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
8f10: 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53   int prepSelectS
8f20: 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65  tmt(Parse*, Sele
8f30: 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ct*);../*.** Giv
8f40: 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
8f50: 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
8f60: 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
8f70: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
8f80: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
8f90: 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
8fa0: 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
8fb0: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
8fc0: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
8fd0: 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e  rse, char *zTabN
8fe0: 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ame, Select *pSe
8ff0: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
9000: 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  pTab;.  int i, j
9010: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
9020: 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  List;.  Column *
9030: 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 20 20 73  aCol, *pCol;.  s
9040: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9050: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 77 68 69 6c  rse->db;..  whil
9060: 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e( pSelect->pPri
9070: 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70  or ) pSelect = p
9080: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a  Select->pPrior;.
9090: 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74    if( prepSelect
90a0: 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53 65  Stmt(pParse, pSe
90b0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74  lect) ){.    ret
90c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
90d0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
90e0: 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 53  solve(pParse, pS
90f0: 65 6c 65 63 74 2c 20 30 29 20 29 7b 0a 20 20 20  elect, 0) ){.   
9100: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
9110: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
9120: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
9130: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b  sizeof(Table) );
9140: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
9150: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
9160: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66    }.  pTab->nRef
9170: 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e   = 1;.  pTab->zN
9180: 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f  ame = zTabName ?
9190: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
91a0: 28 64 62 2c 20 7a 54 61 62 4e 61 6d 65 29 20 3a  (db, zTabName) :
91b0: 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   0;.  pEList = p
91c0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
91d0: 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70    pTab->nCol = p
91e0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
91f0: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
9200: 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e  ol>0 );.  pTab->
9210: 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71  aCol = aCol = sq
9220: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
9230: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 54 61  o(db, sizeof(pTa
9240: 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61 62  b->aCol[0])*pTab
9250: 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 66 6f 72 28 69  ->nCol);.  for(i
9260: 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69  =0, pCol=aCol; i
9270: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
9280: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 45  , pCol++){.    E
9290: 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a 20 20 20  xpr *p, *pR;.   
92a0: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20   char *zType;.  
92b0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
92c0: 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20     int nName;.  
92d0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
92e0: 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20  ;.    int cnt;. 
92f0: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
9300: 4e 43 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20  NC;.    .    /* 
9310: 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61  Get an appropria
9320: 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  te name for the 
9330: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20  column.    */.  
9340: 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b    p = pEList->a[
9350: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  i].pExpr;.    as
9360: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d  sert( p->pRight=
9370: 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d  =0 || p->pRight-
9380: 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70  >token.z==0 || p
9390: 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e  ->pRight->token.
93a0: 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69  z[0]!=0 );.    i
93b0: 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  f( (zName = pELi
93c0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21  st->a[i].zName)!
93d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
93e0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e  f the column con
93f0: 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61  tains an "AS <na
9400: 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65  me>" phrase, use
9410: 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e   <name> as the n
9420: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
9430: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
9440: 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  rDup(db, zName);
9450: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
9460: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20  ->op==TK_DOT .  
9470: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
9480: 70 52 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30  pR=p->pRight)!=0
9490: 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20   && pR->token.z 
94a0: 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  && pR->token.z[0
94b0: 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f  ] ){.      /* Fo
94c0: 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  r columns of the
94d0: 20 66 72 6f 6d 20 41 2e 42 20 75 73 65 20 42 20   from A.B use B 
94e0: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
94f0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
9500: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
9510: 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e  "%T", &pR->token
9520: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
9530: 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d   p->span.z && p-
9540: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  >span.z[0] ){.  
9550: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f      /* Use the o
9560: 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20  riginal text of 
9570: 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65  the column expre
9580: 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d  ssion as its nam
9590: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
95a0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
95b0: 66 28 64 62 2c 20 22 25 54 22 2c 20 26 70 2d 3e  f(db, "%T", &p->
95c0: 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  span);.    }else
95d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c  {.      /* If al
95e0: 6c 20 65 6c 73 65 20 66 61 69 6c 73 2c 20 6d 61  l else fails, ma
95f0: 6b 65 20 75 70 20 61 20 6e 61 6d 65 20 2a 2f 0a  ke up a name */.
9600: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
9610: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
9620: 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31   "column%d", i+1
9630: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
9640: 20 21 7a 4e 61 6d 65 20 7c 7c 20 64 62 2d 3e 6d   !zName || db->m
9650: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
9660: 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
9670: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
9680: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
9690: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
96a0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70  te3DeleteTable(p
96b0: 54 61 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Tab);.      retu
96c0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
96d0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
96e0: 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d  Name);..    /* M
96f0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
9700: 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
9710: 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
9720: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
9730: 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20      ** append a 
9740: 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e  integer to the n
9750: 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62  ame so that it b
9760: 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20  ecomes unique.. 
9770: 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20     */.    nName 
9780: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
9790: 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30  .    for(j=cnt=0
97a0: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
97b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
97c0: 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e  rICmp(aCol[j].zN
97d0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
97e0: 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b  {.        zName[
97f0: 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20  nName] = 0;.    
9800: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
9810: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
9820: 25 7a 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b  %z:%d", zName, +
9830: 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6a  +cnt);.        j
9840: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69   = -1;.        i
9850: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72  f( zName==0 ) br
9860: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9870: 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61   }.    pCol->zNa
9880: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20  me = zName;..   
9890: 20 2f 2a 20 47 65 74 20 74 68 65 20 74 79 70 65   /* Get the type
98a0: 6e 61 6d 65 2c 20 74 79 70 65 20 61 66 66 69 6e  name, type affin
98b0: 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ity, and collati
98c0: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
98d0: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  the.    ** colum
98e0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65  n..    */.    me
98f0: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
9900: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
9910: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
9920: 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
9930: 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65    zType = sqlite
9940: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f  3DbStrDup(db, co
9950: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
9960: 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20  , 0, 0, 0));.   
9970: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a   pCol->zType = z
9980: 54 79 70 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Type;.    pCol->
9990: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
99a0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
99b0: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  );.    pColl = s
99c0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
99d0: 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
99e0: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
99f0: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c       pCol->zColl
9a00: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
9a10: 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  up(db, pColl->zN
9a20: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
9a30: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
9a40: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61  -1;.  return pTa
9a50: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  b;.}../*.** Prep
9a60: 61 72 65 20 61 20 53 45 4c 45 43 54 20 73 74 61  are a SELECT sta
9a70: 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65  tement for proce
9a80: 73 73 69 6e 67 20 62 79 20 64 6f 69 6e 67 20 74  ssing by doing t
9a90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
9aa0: 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  things:.**.**   
9ab0: 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20   (1)  Make sure 
9ac0: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
9ad0: 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
9ae0: 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a  signed to every.
9af0: 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65  **         eleme
9b00: 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  nt of the FROM c
9b10: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lause..**.**    
9b20: 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  (2)  Fill in the
9b30: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
9b40: 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68  Tab fields in th
9b50: 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a  e SrcList that .
9b60: 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e  **         defin
9b70: 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  es FROM clause. 
9b80: 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65   When views appe
9b90: 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
9ba0: 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20  lause,.**       
9bb0: 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d    fill pTabList-
9bc0: 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74  >a[].pSelect wit
9bd0: 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
9be0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
9bf0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74  .**         that
9c00: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
9c10: 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73  view.  A copy is
9c20: 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65   made of the vie
9c30: 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20  w's SELECT.**   
9c40: 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20        statement 
9c50: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66  so that we can f
9c60: 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20  reely modify or 
9c70: 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74  delete that stat
9c80: 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
9c90: 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e   without worryin
9ca0: 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20  g about messing 
9cb0: 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65 6e  up the presisten
9cc0: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
9cd0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74  .**         of t
9ce0: 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20  he view..**.**  
9cf0: 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73    (3)  Add terms
9d00: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
9d10: 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61  ause to accomoda
9d20: 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
9d30: 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
9d40: 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
9d50: 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
9d60: 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
9d70: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53  .**.**    (4)  S
9d80: 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
9d90: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
9da0: 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
9db0: 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
9dc0: 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
9dd0: 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
9de0: 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
9df0: 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
9e00: 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
9e10: 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
9e20: 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
9e30: 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
9e40: 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
9e50: 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
9e60: 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
9e70: 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
9e80: 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75  * Return 0 on su
9e90: 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 72 65  ccess.  If there
9ea0: 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c   are problems, l
9eb0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
9ec0: 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72  ssage.** in pPar
9ed0: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  se and return no
9ee0: 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n-zero..*/.stati
9ef0: 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74  c int prepSelect
9f00: 53 74 6d 74 28 50 61 72 73 65 20 2a 70 50 61 72  Stmt(Parse *pPar
9f10: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
9f20: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72    int i, j, k, r
9f30: 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  c;.  SrcList *pT
9f40: 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
9f50: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74  st *pEList;.  st
9f60: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
9f70: 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69  m *pFrom;.  sqli
9f80: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9f90: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d  ->db;..  if( p==
9fa0: 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20  0 || p->pSrc==0 
9fb0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
9fc0: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
9fd0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c  n 1;.  }.  pTabL
9fe0: 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
9ff0: 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
a000: 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ist;..  /* Make 
a010: 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  sure cursor numb
a020: 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
a030: 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e  signed to all en
a040: 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68  tries in.  ** th
a050: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
a060: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
a070: 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  ement..  */.  sq
a080: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
a090: 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
a0a0: 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 0a 20 20 2f  , p->pSrc);..  /
a0b0: 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20  * Look up every 
a0c0: 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74  table named in t
a0d0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
a0e0: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49  f the select.  I
a0f0: 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20  f.  ** an entry 
a100: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
a110: 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79  se is a subquery
a120: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61   instead of a ta
a130: 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a  ble or view,.  *
a140: 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  * then create a 
a150: 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
a160: 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73  structure to des
a170: 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65  cribe the subque
a180: 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ry..  */.  for(i
a190: 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
a1a0: 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
a1b0: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
a1c0: 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  rom++){.    Tabl
a1d0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69 66 28  e *pTab;.    if(
a1e0: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20   pFrom->pTab!=0 
a1f0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
a200: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61   statement has a
a210: 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70  lready been prep
a220: 61 72 65 64 2e 20 20 54 68 65 72 65 20 69 73 20  ared.  There is 
a230: 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a  no need.      **
a240: 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20   to go further. 
a250: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
a260: 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72   i==0 );.      r
a270: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
a280: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e     if( pFrom->zN
a290: 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  ame==0 ){.#ifnde
a2a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
a2b0: 42 51 55 45 52 59 0a 20 20 20 20 20 20 2f 2a 20  BQUERY.      /* 
a2c0: 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
a2d0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
a2e0: 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
a2f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
a300: 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b  m->pSelect!=0 );
a310: 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d  .      if( pFrom
a320: 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20  ->zAlias==0 ){. 
a330: 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 7a 41         pFrom->zA
a340: 6c 69 61 73 20 3d 0a 20 20 20 20 20 20 20 20 20  lias =.         
a350: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
a360: 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71  db, "sqlite_subq
a370: 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64  uery_%p_", (void
a380: 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  *)pFrom->pSelect
a390: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a3a0: 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
a3b0: 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
a3c0: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
a3d0: 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73  Tab = .        s
a3e0: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
a3f0: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
a400: 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70  pFrom->zAlias, p
a410: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  From->pSelect);.
a420: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
a430: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
a440: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
a450: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73 45 70       /* The isEp
a460: 68 65 6d 20 66 6c 61 67 20 69 6e 64 69 63 61 74  hem flag indicat
a470: 65 73 20 74 68 61 74 20 74 68 65 20 54 61 62 6c  es that the Tabl
a480: 65 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20  e structure has 
a490: 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20 64 79  been.      ** dy
a4a0: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
a4b0: 74 65 64 20 61 6e 64 20 6d 61 79 20 62 65 20 66  ted and may be f
a4c0: 72 65 65 64 20 61 74 20 61 6e 79 20 74 69 6d 65  reed at any time
a4d0: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
a4e0: 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54 61 62  s,.      ** pTab
a4f0: 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
a500: 20 74 6f 20 61 20 70 65 72 73 69 73 74 65 6e 74   to a persistent
a510: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
a520: 20 74 68 61 74 20 64 65 66 69 6e 65 73 0a 20 20   that defines.  
a530: 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74      ** part of t
a540: 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20  he schema. */.  
a550: 20 20 20 20 70 54 61 62 2d 3e 69 73 45 70 68 65      pTab->isEphe
a560: 6d 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  m = 1;.#endif.  
a570: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
a580: 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
a590: 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
a5a0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
a5b0: 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  use */.      ass
a5c0: 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
a5d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
a5e0: 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
a5f0: 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  = .        sqlit
a600: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
a610: 61 72 73 65 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d  arse,pFrom->zNam
a620: 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61  e,pFrom->zDataba
a630: 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  se);.      if( p
a640: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
a650: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
a660: 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e    }.      pTab->
a670: 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66  nRef++;.#if !def
a680: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
a690: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
a6a0: 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ed (SQLITE_OMIT_
a6b0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
a6c0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
a6d0: 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75  elect || IsVirtu
a6e0: 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
a6f0: 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20      /* We reach 
a700: 68 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65  here if the name
a710: 64 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61  d table is a rea
a720: 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20  lly a view */.  
a730: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
a740: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
a750: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
a760: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
a770: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
a780: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66   }.        /* If
a790: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21   pFrom->pSelect!
a7a0: 3d 30 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  =0 it means we a
a7b0: 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
a7c0: 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65  a.        ** vie
a7d0: 77 20 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e  w within a view.
a7e0: 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 72    The SELECT str
a7f0: 75 63 74 75 72 65 20 68 61 73 20 61 6c 72 65 61  ucture has alrea
a800: 64 79 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  dy been.        
a810: 2a 2a 20 63 6f 70 69 65 64 20 62 79 20 74 68 65  ** copied by the
a820: 20 6f 75 74 65 72 20 76 69 65 77 20 73 6f 20 77   outer view so w
a830: 65 20 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63  e can skip the c
a840: 6f 70 79 20 73 74 65 70 20 68 65 72 65 0a 20 20  opy step here.  
a850: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
a860: 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20  inner view..    
a870: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
a880: 66 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  f( pFrom->pSelec
a890: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
a8a0: 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
a8b0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
a8c0: 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  Dup(db, pTab->pS
a8d0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
a8e0: 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
a8f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
a900: 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
a910: 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
a920: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
a930: 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
a940: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50  */.  if( sqliteP
a950: 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73  rocessJoin(pPars
a960: 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e 20 31  e, p) ) return 1
a970: 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  ;..  /* For ever
a980: 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72  y "*" that occur
a990: 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  s in the column 
a9a0: 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65  list, insert the
a9b0: 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61   names of.  ** a
a9c0: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
a9d0: 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66  l tables.  And f
a9e0: 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a  or every TABLE.*
a9f0: 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
aa00: 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f  s.  ** of all co
aa10: 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20  lumns in TABLE. 
aa20: 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65   The parser inse
aa30: 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65  rted a special e
aa40: 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77  xpression.  ** w
aa50: 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f  ith the TK_ALL o
aa60: 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68  perator for each
aa70: 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75   "*" that it fou
aa80: 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  nd in the column
aa90: 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20   list..  ** The 
aaa0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a  following code j
aab0: 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74  ust has to locat
aac0: 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70  e the TK_ALL exp
aad0: 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70  ressions and exp
aae0: 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e  and.  ** each on
aaf0: 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
ab00: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
ab10: 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  all tables..  **
ab20: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
ab30: 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73  loop just checks
ab40: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
ab50: 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65   are any "*" ope
ab60: 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74  rators.  ** that
ab70: 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e   need expanding.
ab80: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  .  */.  for(k=0;
ab90: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
aba0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; k++){.    Expr
abb0: 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61   *pE = pEList->a
abc0: 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [k].pExpr;.    i
abd0: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  f( pE->op==TK_AL
abe0: 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  L ) break;.    i
abf0: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
ac00: 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20  T && pE->pRight 
ac10: 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  && pE->pRight->o
ac20: 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20  p==TK_ALL.      
ac30: 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20     && pE->pLeft 
ac40: 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70  && pE->pLeft->op
ac50: 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b  ==TK_ID ) break;
ac60: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20  .  }.  rc = 0;. 
ac70: 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e   if( k<pEList->n
ac80: 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  Expr ){.    /*. 
ac90: 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20     ** If we get 
aca0: 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68  here it means th
acb0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e  e result set con
acc0: 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
acd0: 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65  e "*".    ** ope
ace0: 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  rators that need
acf0: 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
ad00: 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65    Loop through e
ad10: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ach expression. 
ad20: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73     ** in the res
ad30: 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61  ult set and expa
ad40: 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f  nd them one by o
ad50: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ne..    */.    s
ad60: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
ad70: 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d  tem *a = pEList-
ad80: 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  >a;.    ExprList
ad90: 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
ada0: 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72  int flags = pPar
adb0: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  se->db->flags;. 
adc0: 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73     int longNames
add0: 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
ade0: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
adf0: 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  !=0 &&.         
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c               (fl
ae10: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
ae20: 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a  rtColNames)==0;.
ae30: 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  .    for(k=0; k<
ae40: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
ae50: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
ae60: 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72  *pE = a[k].pExpr
ae70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
ae80: 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20  op!=TK_ALL &&.  
ae90: 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70           (pE->op
aea0: 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
aeb0: 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d  pRight==0 || pE-
aec0: 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f  >pRight->op!=TK_
aed0: 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ALL) ){.        
aee0: 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  /* This particul
aef0: 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f  ar expression do
af00: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
af10: 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20  e expanded..    
af20: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
af30: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
af40: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
af50: 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  se, pNew, a[k].p
af60: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
af70: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
af80: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
af90: 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
afa0: 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
afb0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  e;.        }else
afc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
afd0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
afe0: 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
aff0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b   = 0;.        a[
b000: 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
b010: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b020: 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
b030: 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
b040: 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
b050: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
b060: 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
b070: 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
b080: 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
b090: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
b0a0: 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
b0b0: 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
b0c0: 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20  char *zTName;   
b0d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74           /* text
b0e0: 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
b0f0: 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
b100: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
b110: 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a  && pE->pLeft ){.
b120: 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
b130: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
b140: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d  omToken(db, &pE-
b150: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a  >pLeft->token);.
b160: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b170: 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
b180: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
b190: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20         for(i=0, 
b1a0: 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
b1b0: 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
b1c0: 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
b1d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61  +){.          Ta
b1e0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
b1f0: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  m->pTab;.       
b200: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
b210: 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  e = pFrom->zAlia
b220: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  s;.          if(
b230: 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20   zTabName==0 || 
b240: 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29  zTabName[0]==0 )
b250: 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  { .            z
b260: 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
b270: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
b280: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
b290: 20 7a 54 4e 61 6d 65 20 26 26 20 28 7a 54 61 62   zTName && (zTab
b2a0: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e  Name==0 || zTabN
b2b0: 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20  ame[0]==0 || .  
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
b2d0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
b2e0: 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21  Name, zTabName)!
b2f0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
b300: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
b310: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b320: 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
b330: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
b340: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
b350: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
b360: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
b370: 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20  , *pRight;.     
b380: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
b390: 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
b3a0: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20  j].zName;..     
b3b0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
b3c0: 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
b3d0: 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72  as 'hidden' (cur
b3e0: 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73  rently only poss
b3f0: 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  ible.           
b400: 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20   ** for virtual 
b410: 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20  tables), do not 
b420: 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68  include it in th
b430: 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
b440: 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
b450: 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20  -set list..     
b460: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
b470: 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64        if( IsHidd
b480: 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
b490: 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  aCol[j]) ){.    
b4a0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
b4b0: 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  (IsVirtual(pTab)
b4c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
b4d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
b4e0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
b4f0: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b        if( i>0 ){
b500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
b510: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
b520: 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61  em *pLeft = &pTa
b530: 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20  bList->a[i-1];. 
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
b550: 20 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74   (pLeft[1].joint
b560: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
b570: 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )!=0 &&.        
b580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b590: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66  columnIndex(pLef
b5a0: 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e  t->pTab, zName)>
b5b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
b5c0: 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41        /* In a NA
b5d0: 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74  TURAL join, omit
b5e0: 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e   the join column
b5f0: 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
b600: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
b610: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
b620: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  t */.           
b630: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
b660: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
b670: 64 65 78 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73  dex(pLeft[1].pUs
b680: 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  ing, zName)>=0 )
b690: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b6a0: 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77    /* In a join w
b6b0: 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75  ith a USING clau
b6c0: 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73  se, omit columns
b6d0: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
b6e0: 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67          ** using
b6f0: 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
b700: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
b710: 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ght. */.        
b720: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
b730: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b740: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
b750: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
b760: 68 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ht = sqlite3PExp
b770: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c  r(pParse, TK_ID,
b780: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
b790: 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68         if( pRigh
b7a0: 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  t==0 ) break;.  
b7b0: 20 20 20 20 20 20 20 20 20 20 73 65 74 51 75 6f            setQuo
b7c0: 74 65 64 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  tedToken(pParse,
b7d0: 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c   &pRight->token,
b7e0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
b7f0: 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
b800: 65 20 26 26 20 28 6c 6f 6e 67 4e 61 6d 65 73 20  e && (longNames 
b810: 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  || pTabList->nSr
b820: 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  c>1) ){.        
b830: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
b840: 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
b850: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20  (pParse, TK_ID, 
b860: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
b870: 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
b880: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
b890: 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65  rse, TK_DOT, pLe
b8a0: 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a  ft, pRight, 0);.
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
b8c0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65  ( pExpr==0 ) bre
b8d0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
b8e0: 20 20 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e    setQuotedToken
b8f0: 28 70 50 61 72 73 65 2c 20 26 70 4c 65 66 74 2d  (pParse, &pLeft-
b900: 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65  >token, zTabName
b910: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
b920: 20 73 65 74 54 6f 6b 65 6e 28 26 70 45 78 70 72   setToken(&pExpr
b930: 2d 3e 73 70 61 6e 2c 20 0a 20 20 20 20 20 20 20  ->span, .       
b940: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
b950: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
b960: 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c  s.%s", zTabName,
b970: 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20   zName));.      
b980: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
b990: 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20  pan.dyn = 1;.   
b9a0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
b9b0: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20  ->token.z = 0;. 
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
b9d0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b  pr->token.n = 0;
b9e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
b9f0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  Expr->token.dyn 
ba00: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
ba10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ba20: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
ba30: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
ba40: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20      pExpr->span 
ba50: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a  = pExpr->token;.
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
ba70: 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20  xpr->span.dyn = 
ba80: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
ba90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
baa0: 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20   longNames ){.  
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
bac0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
bad0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
bae0: 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70   pNew, pExpr, &p
baf0: 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  Expr->span);.   
bb00: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
bb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
bb20: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
bb30: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
bb40: 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20  e, pNew, pExpr, 
bb50: 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b  &pRight->token);
bb60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
bb70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
bb80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
bb90: 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
bba0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
bbb0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
bbc0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
bbd0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
bbe0: 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
bbf0: 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  zTName);.       
bc00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bc10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
bc20: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
bc30: 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
bc40: 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
bc50: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
bc60: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
bc70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
bc80: 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  ee(zTName);.    
bc90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
bca0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
bcb0: 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20  ete(pEList);.   
bcc0: 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
bcd0: 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  w;.  }.  if( p->
bce0: 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c  pEList && p->pEL
bcf0: 69 73 74 2d 3e 6e 45 78 70 72 3e 53 51 4c 49 54  ist->nExpr>SQLIT
bd00: 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  E_MAX_COLUMN ){.
bd10: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
bd20: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
bd30: 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   many columns in
bd40: 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20   result set");. 
bd50: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
bd60: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
bd70: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
bd80: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
bd90: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
bda0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
bdb0: 2a 0a 2a 2a 20 70 45 20 69 73 20 61 20 70 6f 69  *.** pE is a poi
bdc0: 6e 74 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  nter to an expre
bdd0: 73 73 69 6f 6e 20 77 68 69 63 68 20 69 73 20 61  ssion which is a
bde0: 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 0a   single term in.
bdf0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  ** ORDER BY or G
be00: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a  ROUP BY clause..
be10: 2a 2a 0a 2a 2a 20 49 66 20 70 45 20 65 76 61 6c  **.** If pE eval
be20: 75 61 74 65 73 20 74 6f 20 61 6e 20 69 6e 74 65  uates to an inte
be30: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 69 2c 20  ger constant i, 
be40: 74 68 65 6e 20 72 65 74 75 72 6e 20 69 2e 0a 2a  then return i..*
be50: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 64  * This is an ind
be60: 69 63 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63  ication to the c
be70: 61 6c 6c 65 72 20 74 68 61 74 20 69 74 20 73 68  aller that it sh
be80: 6f 75 6c 64 20 73 6f 72 74 0a 2a 2a 20 62 79 20  ould sort.** by 
be90: 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20  the i-th column 
bea0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
beb0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 20 69  t..**.** If pE i
bec0: 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  s a well-formed 
bed0: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 74  expression and t
bee0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
bef0: 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  ent.** is not co
bf00: 6d 70 6f 75 6e 64 2c 20 74 68 65 6e 20 72 65 74  mpound, then ret
bf10: 75 72 6e 20 30 2e 20 20 54 68 69 73 20 69 6e 64  urn 0.  This ind
bf20: 69 63 61 74 65 73 20 74 6f 20 74 68 65 0a 2a 2a  icates to the.**
bf30: 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74 20   caller that it 
bf40: 73 68 6f 75 6c 64 20 73 6f 72 74 20 62 79 20 74  should sort by t
bf50: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
bf60: 4f 52 44 45 52 20 42 59 0a 2a 2a 20 65 78 70 72  ORDER BY.** expr
bf70: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ession..**.** If
bf80: 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 63   the SELECT is c
bf90: 6f 6d 70 6f 75 6e 64 2c 20 74 68 65 6e 20 61 74  ompound, then at
bfa0: 74 65 6d 70 74 20 74 6f 20 6d 61 74 63 68 20 70  tempt to match p
bfb0: 45 20 61 67 61 69 6e 73 74 0a 2a 2a 20 72 65 73  E against.** res
bfc0: 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20  ult set columns 
bfd0: 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  in the left-most
bfe0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
bff0: 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  t.  Return.** th
c000: 65 20 69 6e 64 65 78 20 69 20 6f 66 20 74 68 65  e index i of the
c010: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
c020: 2c 20 61 73 20 61 6e 20 69 6e 64 69 63 61 74 69  , as an indicati
c030: 6f 6e 20 74 6f 20 74 68 65 20 0a 2a 2a 20 63 61  on to the .** ca
c040: 6c 6c 65 72 20 74 68 61 74 20 69 74 20 73 68 6f  ller that it sho
c050: 75 6c 64 20 73 6f 72 74 20 62 79 20 74 68 65 20  uld sort by the 
c060: 69 2d 74 68 20 63 6f 6c 75 6d 6e 2e 20 20 49 66  i-th column.  If
c070: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
c080: 6d 61 74 63 68 2c 20 72 65 74 75 72 6e 20 2d 31  match, return -1
c090: 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72   and leave an er
c0a0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
c0b0: 50 61 72 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  Parse..*/.static
c0c0: 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65 72 42   int matchOrderB
c0d0: 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28  yTermToExprList(
c0e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c0f0: 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
c100: 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72   context for err
c110: 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20  or messages */. 
c120: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
c130: 2c 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43  ,   /* The SELEC
c140: 54 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68  T statement with
c150: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
c160: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
c170: 70 45 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pE,          /* 
c180: 54 68 65 20 73 70 65 63 69 66 69 63 20 4f 52 44  The specific ORD
c190: 45 52 20 42 59 20 74 65 72 6d 20 2a 2f 0a 20 20  ER BY term */.  
c1a0: 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20  int idx,        
c1b0: 20 20 20 2f 2a 20 57 68 65 6e 20 4f 52 44 45 52     /* When ORDER
c1c0: 20 42 59 20 74 65 72 6d 20 69 73 20 74 68 69 73   BY term is this
c1d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70   */.  int isComp
c1e0: 6f 75 6e 64 2c 20 20 20 20 2f 2a 20 54 72 75 65  ound,    /* True
c1f0: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f   if this is a co
c200: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f  mpound SELECT */
c210: 0a 20 20 75 38 20 2a 70 48 61 73 41 67 67 20 20  .  u8 *pHasAgg  
c220: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
c230: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
c240: 61 69 6e 73 20 61 67 67 72 65 67 61 74 65 20 66  ains aggregate f
c250: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
c260: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
c270: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
c280: 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ter */.  ExprLis
c290: 74 20 2a 70 45 4c 69 73 74 3b 20 20 2f 2a 20 54  t *pEList;  /* T
c2a0: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
c2b0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
c2c0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 6e 63    NameContext nc
c2d0: 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  ;    /* Name con
c2e0: 74 65 78 74 20 66 6f 72 20 72 65 73 6f 6c 76 69  text for resolvi
c2f0: 6e 67 20 70 45 20 2a 2f 0a 0a 0a 20 20 2f 2a 20  ng pE */...  /* 
c300: 49 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61  If the term is a
c310: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
c320: 6e 74 2c 20 72 65 74 75 72 6e 20 74 68 65 20 76  nt, return the v
c330: 61 6c 75 65 20 6f 66 20 74 68 61 74 0a 20 20 2a  alue of that.  *
c340: 2a 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20  * constant */.  
c350: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
c360: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
c370: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
c380: 65 67 65 72 28 70 45 2c 20 26 69 29 20 29 7b 0a  eger(pE, &i) ){.
c390: 20 20 20 20 69 66 28 20 69 3c 3d 30 20 29 7b 0a      if( i<=0 ){.
c3a0: 20 20 20 20 20 20 2f 2a 20 49 66 20 69 20 69 73        /* If i is
c3b0: 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 6d 61 6b 65   too small, make
c3c0: 20 69 74 20 74 6f 6f 20 62 69 67 2e 20 20 54 68   it too big.  Th
c3d0: 61 74 20 77 61 79 20 74 68 65 20 63 61 6c 6c 69  at way the calli
c3e0: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  ng.      ** func
c3f0: 74 69 6f 6e 20 73 74 69 6c 6c 20 73 65 65 73 20  tion still sees 
c400: 61 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 20  a value that is 
c410: 6f 75 74 20 6f 66 20 72 61 6e 67 65 2c 20 62 75  out of range, bu
c420: 74 20 64 6f 65 73 0a 20 20 20 20 20 20 2a 2a 20  t does.      ** 
c430: 6e 6f 74 20 63 6f 6e 66 75 73 65 20 74 68 65 20  not confuse the 
c440: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69  column number wi
c450: 74 68 20 30 20 6f 72 20 2d 31 20 72 65 73 75 6c  th 0 or -1 resul
c460: 74 20 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f  t code..      */
c470: 0a 20 20 20 20 20 20 69 20 3d 20 70 45 4c 69 73  .      i = pELis
c480: 74 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20  t->nExpr+1;.    
c490: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a  }.    return i;.
c4a0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
c4b0: 20 74 65 72 6d 20 69 73 20 61 20 73 69 6d 70 6c   term is a simpl
c4c0: 65 20 69 64 65 6e 74 69 66 69 65 72 20 74 68 61  e identifier tha
c4d0: 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74  t try to match t
c4e0: 68 61 74 20 69 64 65 6e 74 69 66 69 65 72 0a 20  hat identifier. 
c4f0: 20 2a 2a 20 61 67 61 69 6e 73 74 20 61 20 63 6f   ** against a co
c500: 6c 75 6d 6e 20 6e 61 6d 65 20 69 6e 20 74 68 65  lumn name in the
c510: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a   result set..  *
c520: 2f 0a 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d  /.  if( pE->op==
c530: 54 4b 5f 49 44 20 7c 7c 20 28 70 45 2d 3e 6f 70  TK_ID || (pE->op
c540: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 26 26 20 70  ==TK_STRING && p
c550: 45 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 27  E->token.z[0]!='
c560: 5c 27 27 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  \'') ){.    sqli
c570: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
c580: 2d 3e 64 62 3b 0a 20 20 20 20 63 68 61 72 20 2a  ->db;.    char *
c590: 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  zCol = sqlite3Na
c5a0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
c5b0: 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  &pE->token);.   
c5c0: 20 69 66 28 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a   if( zCol==0 ){.
c5d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
c5e0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
c5f0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
c600: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
c610: 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c   char *zAs = pEL
c620: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
c630: 0a 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d  .      if( zAs!=
c640: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
c650: 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d  Cmp(zAs, zCol)==
c660: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
c670: 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b  ite3_free(zCol);
c680: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c690: 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i+1;.      }.   
c6a0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
c6b0: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 7d 0a 0a  ree(zCol);.  }..
c6c0: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c    /* Resolve all
c6d0: 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 4f 52   names in the OR
c6e0: 44 45 52 20 42 59 20 74 65 72 6d 20 65 78 70 72  DER BY term expr
c6f0: 65 73 73 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65  ession.  */.  me
c700: 6d 73 65 74 28 26 6e 63 2c 20 30 2c 20 73 69 7a  mset(&nc, 0, siz
c710: 65 6f 66 28 6e 63 29 29 3b 0a 20 20 6e 63 2e 70  eof(nc));.  nc.p
c720: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
c730: 20 20 6e 63 2e 70 53 72 63 4c 69 73 74 20 3d 20    nc.pSrcList = 
c740: 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
c750: 20 6e 63 2e 70 45 4c 69 73 74 20 3d 20 70 45 4c   nc.pEList = pEL
c760: 69 73 74 3b 0a 20 20 6e 63 2e 61 6c 6c 6f 77 41  ist;.  nc.allowA
c770: 67 67 20 3d 20 31 3b 0a 20 20 6e 63 2e 6e 45 72  gg = 1;.  nc.nEr
c780: 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  r = 0;.  if( sql
c790: 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
c7a0: 61 6d 65 73 28 26 6e 63 2c 20 70 45 29 20 29 7b  ames(&nc, pE) ){
c7b0: 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6f  .    if( isCompo
c7c0: 75 6e 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  und ){.      sql
c7d0: 69 74 65 33 45 72 72 6f 72 43 6c 65 61 72 28 70  ite3ErrorClear(p
c7e0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 65  Parse);.      re
c7f0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
c800: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
c810: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  -1;.    }.  }.  
c820: 69 66 28 20 6e 63 2e 68 61 73 41 67 67 20 26 26  if( nc.hasAgg &&
c830: 20 70 48 61 73 41 67 67 20 29 7b 0a 20 20 20 20   pHasAgg ){.    
c840: 2a 70 48 61 73 41 67 67 20 3d 20 31 3b 0a 20 20  *pHasAgg = 1;.  
c850: 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f  }..  /* For a co
c860: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 77  mpound SELECT, w
c870: 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20 74 6f  e need to try to
c880: 20 6d 61 74 63 68 20 74 68 65 20 4f 52 44 45 52   match the ORDER
c890: 20 42 59 0a 20 20 2a 2a 20 65 78 70 72 65 73 73   BY.  ** express
c8a0: 69 6f 6e 20 61 67 61 69 6e 73 74 20 61 6e 20 65  ion against an e
c8b0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
c8c0: 20 72 65 73 75 6c 74 20 73 65 74 0a 20 20 2a 2f   result set.  */
c8d0: 0a 20 20 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e  .  if( isCompoun
c8e0: 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  d ){.    for(i=0
c8f0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
c900: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
c910: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
c920: 6d 70 61 72 65 28 70 45 4c 69 73 74 2d 3e 61 5b  mpare(pEList->a[
c930: 69 5d 2e 70 45 78 70 72 2c 20 70 45 29 20 29 7b  i].pExpr, pE) ){
c940: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c950: 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i+1;.      }.   
c960: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
c970: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  0;.}.../*.** Ana
c980: 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42  lyze and ORDER B
c990: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
c9a0: 61 75 73 65 20 69 6e 20 61 20 73 69 6d 70 6c 65  ause in a simple
c9b0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c9c0: 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  t..** Return the
c9d0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
c9e0: 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 45 76  s seen..**.** Ev
c9f0: 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ery term of the 
ca00: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
ca10: 50 20 42 59 20 63 6c 61 75 73 65 20 6e 65 65 64  P BY clause need
ca20: 73 20 74 6f 20 62 65 20 61 6e 0a 2a 2a 20 65 78  s to be an.** ex
ca30: 70 72 65 73 73 69 6f 6e 2e 20 20 49 66 20 61 6e  pression.  If an
ca40: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  y expression is 
ca50: 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74  an integer const
ca60: 61 6e 74 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 61  ant, then.** tha
ca70: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
ca80: 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20  replaced by the 
ca90: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 2a  corresponding .*
caa0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  * expression fro
cab0: 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  m the result set
cac0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cad0: 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75  processOrderGrou
cae0: 70 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pBy(.  Parse *pP
caf0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
cb00: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e  Parsing context.
cb10: 20 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65    Leave error me
cb20: 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 20  ssages here */. 
cb30: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
cb40: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45  ,      /* The SE
cb50: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63  LECT statement c
cb60: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6c  ontaining the cl
cb70: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
cb80: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
cb90: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
cba0: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
cbb0: 73 65 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73  se to be process
cbc0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 72  ed */.  int isOr
cbd0: 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  der,          /*
cbe0: 20 31 20 66 6f 72 20 4f 52 44 45 52 20 42 59 2e   1 for ORDER BY.
cbf0: 20 20 30 20 66 6f 72 20 47 52 4f 55 50 20 42 59    0 for GROUP BY
cc00: 20 2a 2f 0a 20 20 75 38 20 2a 70 48 61 73 41 67   */.  u8 *pHasAg
cc10: 67 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  g           /* S
cc20: 65 74 20 74 6f 20 54 52 55 45 20 69 66 20 61 6e  et to TRUE if an
cc30: 79 20 74 65 72 6d 20 63 6f 6e 74 61 69 6e 73 20  y term contains 
cc40: 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a  an aggregate */.
cc50: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
cc60: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
cc70: 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 4c 69  se->db;.  ExprLi
cc80: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69  st *pEList;..  i
cc90: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
cca0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
ccb0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
ccc0: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55  >SQLITE_MAX_COLU
ccd0: 4d 4e 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  MN ){.    const 
cce0: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 69 73  char *zType = is
ccf0: 4f 72 64 65 72 20 3f 20 22 4f 52 44 45 52 22 20  Order ? "ORDER" 
cd00: 3a 20 22 47 52 4f 55 50 22 3b 0a 20 20 20 20 73  : "GROUP";.    s
cd10: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
cd20: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
cd30: 20 74 65 72 6d 73 20 69 6e 20 25 73 20 42 59 20   terms in %s BY 
cd40: 63 6c 61 75 73 65 22 2c 20 7a 54 79 70 65 29 3b  clause", zType);
cd50: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
cd60: 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53   }.  pEList = pS
cd70: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
cd80: 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29   if( pEList==0 )
cd90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
cda0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
cdb0: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
cdc0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
cdd0: 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a  iCol;.    Expr *
cde0: 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
cdf0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
ce00: 43 6f 6c 20 3d 20 6d 61 74 63 68 4f 72 64 65 72  Col = matchOrder
ce10: 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74  ByTermToExprList
ce20: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
ce30: 2c 20 70 45 2c 20 69 2b 31 2c 20 30 2c 20 70 48  , pE, i+1, 0, pH
ce40: 61 73 41 67 67 29 3b 0a 20 20 20 20 69 66 28 20  asAgg);.    if( 
ce50: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
ce60: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
ce70: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 70 45 4c      if( iCol>pEL
ce80: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
ce90: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
cea0: 7a 54 79 70 65 20 3d 20 69 73 4f 72 64 65 72 20  zType = isOrder 
ceb0: 3f 20 22 4f 52 44 45 52 22 20 3a 20 22 47 52 4f  ? "ORDER" : "GRO
cec0: 55 50 22 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  UP";.      sqlit
ced0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
cee0: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 22 25 72  e, .         "%r
cef0: 20 25 73 20 42 59 20 74 65 72 6d 20 6f 75 74 20   %s BY term out 
cf00: 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c  of range - shoul
cf10: 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20  d be ".         
cf20: 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25  "between 1 and %
cf30: 64 22 2c 20 69 2b 31 2c 20 7a 54 79 70 65 2c 20  d", i+1, zType, 
cf40: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
cf50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
cf60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
cf70: 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 43 6f  ol>0 ){.      Co
cf80: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
cf90: 45 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  E->pColl;.      
cfa0: 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 45 2d 3e  int flags = pE->
cfb0: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
cfc0: 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 73 71 6c  llate;.      sql
cfd0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
cfe0: 45 29 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 73  E);.      pE = s
cff0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
d000: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  , pEList->a[iCol
d010: 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  -1].pExpr);.    
d020: 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
d030: 2e 70 45 78 70 72 20 3d 20 70 45 3b 0a 20 20 20  .pExpr = pE;.   
d040: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20     if( pColl && 
d050: 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20  flags ){.       
d060: 20 70 45 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f   pE->pColl = pCo
d070: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e  ll;.        pE->
d080: 66 6c 61 67 73 20 7c 3d 20 66 6c 61 67 73 3b 0a  flags |= flags;.
d090: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d0a0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
d0b0: 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61  ./*.** Analyze a
d0c0: 6e 64 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  nd ORDER BY or G
d0d0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69  ROUP BY clause i
d0e0: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
d0f0: 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  ment.  Return.**
d100: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
d110: 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a  rrors seen..**.*
d120: 2a 20 54 68 65 20 70 72 6f 63 65 73 73 69 6e 67  * The processing
d130: 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
d140: 68 65 72 20 74 68 65 20 53 45 4c 45 43 54 20 69  her the SELECT i
d150: 73 20 73 69 6d 70 6c 65 20 6f 72 20 63 6f 6d 70  s simple or comp
d160: 6f 75 6e 64 2e 0a 2a 2a 20 46 6f 72 20 61 20 73  ound..** For a s
d170: 69 6d 70 6c 65 20 53 45 4c 45 43 54 20 73 74 61  imple SELECT sta
d180: 74 65 6d 65 6e 74 2c 20 65 76 72 79 20 74 65 72  tement, evry ter
d190: 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
d1a0: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 0a 2a 2a  Y or GROUP BY.**
d1b0: 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f   clause needs to
d1c0: 20 62 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f   be an expressio
d1d0: 6e 2e 20 20 49 66 20 61 6e 79 20 65 78 70 72 65  n.  If any expre
d1e0: 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65  ssion is an inte
d1f0: 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 2c  ger.** constant,
d200: 20 74 68 65 6e 20 74 68 61 74 20 65 78 70 72 65   then that expre
d210: 73 73 69 6f 6e 20 69 73 20 72 65 70 6c 61 63 65  ssion is replace
d220: 64 20 62 79 20 74 68 65 20 63 6f 72 72 65 73 70  d by the corresp
d230: 6f 6e 64 69 6e 67 20 0a 2a 2a 20 65 78 70 72 65  onding .** expre
d240: 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 72  ssion from the r
d250: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  esult set..**.**
d260: 20 46 6f 72 20 63 6f 6d 70 6f 75 6e 64 20 53 45   For compound SE
d270: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2c  LECT statements,
d280: 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
d290: 6e 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 66  n needs to be of
d2a0: 0a 2a 2a 20 74 79 70 65 20 54 4b 5f 43 4f 4c 55  .** type TK_COLU
d2b0: 4d 4e 20 77 69 74 68 20 61 20 69 54 61 62 6c 65  MN with a iTable
d2c0: 20 76 61 6c 75 65 20 61 73 20 67 69 76 65 6e 20   value as given 
d2d0: 69 6e 20 74 68 65 20 34 74 68 20 70 61 72 61 6d  in the 4th param
d2e0: 65 74 65 72 2e 0a 2a 2a 20 49 66 20 61 6e 79 20  eter..** If any 
d2f0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
d300: 20 69 6e 74 65 67 65 72 2c 20 74 68 61 74 20 62   integer, that b
d310: 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6c 75 6d  ecomes the colum
d320: 6e 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 4f 74 68  n number..** Oth
d330: 65 72 77 69 73 65 2c 20 6d 61 74 63 68 20 74 68  erwise, match th
d340: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61  e expression aga
d350: 69 6e 73 74 20 72 65 73 75 6c 74 20 73 65 74 20  inst result set 
d360: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 2a 2a 20  columns from.** 
d370: 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 53 45  the left-most SE
d380: 4c 45 43 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  LECT..*/.static 
d390: 69 6e 74 20 70 72 6f 63 65 73 73 43 6f 6d 70 6f  int processCompo
d3a0: 75 6e 64 4f 72 64 65 72 42 79 28 0a 20 20 50 61  undOrderBy(.  Pa
d3b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
d3c0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
d3d0: 6f 6e 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65  ontext.  Leave e
d3e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65  rror messages he
d3f0: 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  re */.  Select *
d400: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a  pSelect,      /*
d410: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
d420: 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67  ement containing
d430: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 2a 2f   the ORDER BY */
d440: 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 20 20 20  .  int iTable   
d450: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
d460: 75 74 20 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d  ut table for com
d470: 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
d480: 74 65 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  tements */.){.  
d490: 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73  int i;.  ExprLis
d4a0: 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 45  t *pOrderBy;.  E
d4b0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
d4c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
d4d0: 20 20 69 6e 74 20 6d 6f 72 65 54 6f 44 6f 20 3d    int moreToDo =
d4e0: 20 31 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20   1;..  pOrderBy 
d4f0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65  = pSelect->pOrde
d500: 72 42 79 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  rBy;.  if( pOrde
d510: 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rBy==0 ) return 
d520: 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  0;.  if( pOrderB
d530: 79 2d 3e 6e 45 78 70 72 3e 53 51 4c 49 54 45 5f  y->nExpr>SQLITE_
d540: 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  MAX_COLUMN ){.  
d550: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d560: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
d570: 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 4f 52 44  any terms in ORD
d580: 45 52 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a  ER BY clause");.
d590: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
d5a0: 7d 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  }.  db = pParse-
d5b0: 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  >db;.  for(i=0; 
d5c0: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
d5d0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4f 72  r; i++){.    pOr
d5e0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
d5f0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c   = 0;.  }.  whil
d600: 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e( pSelect->pPri
d610: 6f 72 20 29 7b 0a 20 20 20 20 70 53 65 6c 65 63  or ){.    pSelec
d620: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
d630: 69 6f 72 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  ior;.  }.  while
d640: 28 20 70 53 65 6c 65 63 74 20 26 26 20 6d 6f 72  ( pSelect && mor
d650: 65 54 6f 44 6f 20 29 7b 0a 20 20 20 20 6d 6f 72  eToDo ){.    mor
d660: 65 54 6f 44 6f 20 3d 20 30 3b 0a 20 20 20 20 66  eToDo = 0;.    f
d670: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
d680: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
d690: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b  .      int iCol;
d6a0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 2c  .      Expr *pE,
d6b0: 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66   *pDup;.      if
d6c0: 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  ( pOrderBy->a[i]
d6d0: 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65  .done ) continue
d6e0: 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72  ;.      pE = pOr
d6f0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
d700: 72 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20  r;.      pDup = 
d710: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
d720: 62 2c 20 70 45 29 3b 0a 20 20 20 20 20 20 69 66  b, pE);.      if
d730: 28 20 70 44 75 70 3d 3d 30 20 29 7b 0a 20 20 20  ( pDup==0 ){.   
d740: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
d750: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43 6f       }.      iCo
d760: 6c 20 3d 20 6d 61 74 63 68 4f 72 64 65 72 42 79  l = matchOrderBy
d770: 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 70  TermToExprList(p
d780: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
d790: 70 44 75 70 2c 20 69 2b 31 2c 20 31 2c 20 30 29  pDup, i+1, 1, 0)
d7a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
d7b0: 78 70 72 44 65 6c 65 74 65 28 70 44 75 70 29 3b  xprDelete(pDup);
d7c0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
d7d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
d7e0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
d7f0: 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 53       pEList = pS
d800: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
d810: 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 3d       if( pEList=
d820: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
d830: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
d840: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 70        if( iCol>p
d850: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
d860: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
d870: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
d880: 0a 20 20 20 20 20 20 20 20 20 20 20 22 25 72 20  .           "%r 
d890: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 75  ORDER BY term ou
d8a0: 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f  t of range - sho
d8b0: 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
d8c0: 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61      "between 1 a
d8d0: 6e 64 20 25 64 22 2c 20 69 2b 31 2c 20 70 45 4c  nd %d", i+1, pEL
d8e0: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
d8f0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
d900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d910: 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20   iCol>0 ){.     
d920: 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43     pE->op = TK_C
d930: 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70  OLUMN;.        p
d940: 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  E->iTable = iTab
d950: 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e  le;.        pE->
d960: 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20  iAgg = -1;.     
d970: 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d     pE->iColumn =
d980: 20 69 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 20   iCol-1;.       
d990: 20 70 45 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20   pE->pTab = 0;. 
d9a0: 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
d9b0: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a  >a[i].done = 1;.
d9c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d9d0: 20 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20       moreToDo = 
d9e0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
d9f0: 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70  .    pSelect = p
da00: 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74 3b 0a 20  Select->pNext;. 
da10: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
da20: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
da30: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
da40: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
da50: 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ne==0 ){.      s
da60: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
da70: 50 61 72 73 65 2c 20 22 25 72 20 4f 52 44 45 52  Parse, "%r ORDER
da80: 20 42 59 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f   BY term does no
da90: 74 20 6d 61 74 63 68 20 61 6e 79 20 22 0a 20 20  t match any ".  
daa0: 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d            "colum
dab0: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
dac0: 73 65 74 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20  set", i+1);.    
dad0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
dae0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
daf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
db00: 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69   VDBE for the gi
db10: 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65  ven parser conte
db20: 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  xt.  Create a ne
db30: 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
db40: 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  ry..** If an err
db50: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
db60: 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
db70: 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50   a message in pP
db80: 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  arse..*/.Vdbe *s
db90: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61  qlite3GetVdbe(Pa
dba0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
dbb0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
dbc0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76  ->pVdbe;.  if( v
dbd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70  ==0 ){.    v = p
dbe0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73  Parse->pVdbe = s
dbf0: 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
dc00: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
dc10: 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a  }.  return v;.}.
dc20: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
dc30: 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  the iLimit and i
dc40: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66  Offset fields of
dc50: 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65   the SELECT base
dc60: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d  d on the.** pLim
dc70: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65  it and pOffset e
dc80: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69  xpressions.  pLi
dc90: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
dca0: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
dcb0: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70  ions.** that app
dcc0: 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69  ear in the origi
dcd0: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
dce0: 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49  t after the LIMI
dcf0: 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20  T and OFFSET.** 
dd00: 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55  keywords.  Or NU
dd10: 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77  LL if those keyw
dd20: 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64  ords are omitted
dd30: 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  . iLimit and iOf
dd40: 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65  fset .** are the
dd50: 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20   integer memory 
dd60: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
dd70: 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73   for counters us
dd80: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a  ed to compute .*
dd90: 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20  * the limit and 
dda0: 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72  offset.  If ther
ddb0: 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e  e is no limit an
ddc0: 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65  d/or offset, the
ddd0: 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64  n .** iLimit and
dde0: 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67   iOffset are neg
ddf0: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ative..**.** Thi
de00: 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
de10: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  s the values of 
de20: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
de30: 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20  et only if.** a 
de40: 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20  limit or offset 
de50: 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c  is defined by pL
de60: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
de70: 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a  .  iLimit and.**
de80: 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20   iOffset should 
de90: 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74  have been preset
dea0: 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   to appropriate 
deb0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a  default values.*
dec0: 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e  * (usually but n
ded0: 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72  ot always -1) pr
dee0: 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
def0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20  his routine..** 
df00: 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d  Only if pLimit!=
df10: 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20  0 or pOffset!=0 
df20: 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  do the limit reg
df30: 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65  isters get.** re
df40: 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e  defined.  The UN
df50: 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
df60: 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65   uses this prope
df70: 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20  rty to force.** 
df80: 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65  the reuse of the
df90: 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20   same limit and 
dfa0: 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73  offset registers
dfb0: 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65   across multiple
dfc0: 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
dfd0: 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
dfe0: 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d   void computeLim
dff0: 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73  itRegisters(Pars
e000: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
e010: 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b  t *p, int iBreak
e020: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30  ){.  Vdbe *v = 0
e030: 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d  ;.  int iLimit =
e040: 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   0;.  int iOffse
e050: 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20  t;.  int addr1, 
e060: 61 64 64 72 32 3b 0a 0a 20 20 2f 2a 20 0a 20 20  addr2;..  /* .  
e070: 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c  ** "LIMIT -1" al
e080: 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72  ways shows all r
e090: 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73  ows.  There is s
e0a0: 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76  ome.  ** contrav
e0b0: 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20  ersy about what 
e0c0: 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
e0d0: 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a  vior should be..
e0e0: 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74    ** The current
e0f0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
e100: 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49  interprets "LIMI
e110: 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a  T 0" to mean.  *
e120: 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a  * no rows..  */.
e130: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
e140: 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  ){.    p->iLimit
e150: 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50   = iLimit = ++pP
e160: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
e170: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
e180: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
e190: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
e1a0: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
e1b0: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
e1c0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e1d0: 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 30 29  e, p->pLimit, 0)
e1e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e1f0: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4d 75  eAddOp0(v, OP_Mu
e200: 73 74 42 65 49 6e 74 29 3b 0a 20 20 20 20 73 71  stBeInt);.    sq
e210: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e220: 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 30 2c 20 69  v, OP_Move, 0, i
e230: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 56 64 62 65  Limit);.    Vdbe
e240: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
e250: 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
e260: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e270: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp2(v, OP_IfZer
e280: 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  o, iLimit, iBrea
e290: 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  k);.    sqlite3V
e2a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e2b0: 53 43 6f 70 79 2c 20 69 4c 69 6d 69 74 2c 20 30  SCopy, iLimit, 0
e2c0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
e2d0: 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70  pOffset ){.    p
e2e0: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  ->iOffset = iOff
e2f0: 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
e300: 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71  nMem;.    v = sq
e310: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
e320: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
e330: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
e340: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e350: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66  (pParse, p->pOff
e360: 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  set, 0);.    sql
e370: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
e380: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 29 3b  , OP_MustBeInt);
e390: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e3a0: 41 64 64 4f 70 32 28 76 2c 20 70 2d 3e 70 4c 69  AddOp2(v, p->pLi
e3b0: 6d 69 74 3d 3d 30 20 3f 20 4f 50 5f 4d 6f 76 65  mit==0 ? OP_Move
e3c0: 20 3a 20 4f 50 5f 43 6f 70 79 2c 20 30 2c 20 69   : OP_Copy, 0, i
e3d0: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 56 64 62  Offset);.    Vdb
e3e0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
e3f0: 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  FSET counter"));
e400: 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
e410: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
e420: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66  , OP_IfPos, iOff
e430: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
e440: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e450: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
e460: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e470: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
e480: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  r, 0, 0);.    sq
e490: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
e4a0: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
e4b0: 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
e4c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
e4d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e4e0: 41 64 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Add, 0, 0);.    
e4f0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  }.  }.  if( p->p
e500: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 61 64 64  Limit ){.    add
e510: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
e520: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
e530: 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  os, iLimit);.   
e540: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e550: 70 31 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 29  p1(v, OP_Pop, 1)
e560: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e570: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
e580: 74 65 67 65 72 2c 20 2d 31 2c 20 69 4c 69 6d 69  teger, -1, iLimi
e590: 74 2b 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20  t+1);.    addr2 
e5a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
e5b0: 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
e5c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e5d0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
e5e0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
e5f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e600: 4d 6f 76 65 2c 20 30 2c 20 69 4c 69 6d 69 74 2b  Move, 0, iLimit+
e610: 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  1);.    VdbeComm
e620: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f  ent((v, "LIMIT+O
e630: 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 73 71  FFSET"));.    sq
e640: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
e650: 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d  e(v, addr2);.  }
e660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
e670: 74 65 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  te a virtual ind
e680: 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 73 6f  ex to use for so
e690: 72 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rting..*/.static
e6a0: 20 76 6f 69 64 20 63 72 65 61 74 65 53 6f 72 74   void createSort
e6b0: 69 6e 67 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ingIndex(Parse *
e6c0: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
e6d0: 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  p, ExprList *pOr
e6e0: 64 65 72 42 79 29 7b 0a 20 20 69 66 28 20 70 4f  derBy){.  if( pO
e6f0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e  rderBy ){.    in
e700: 74 20 61 64 64 72 3b 0a 20 20 20 20 61 73 73 65  t addr;.    asse
e710: 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  rt( pOrderBy->iE
e720: 43 75 72 73 6f 72 3d 3d 30 20 29 3b 0a 20 20 20  Cursor==0 );.   
e730: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
e740: 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
e750: 61 62 2b 2b 3b 0a 20 20 20 20 61 64 64 72 20 3d  ab++;.    addr =
e760: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e770: 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
e780: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
e790: 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7b0: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
e7c0: 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  or, pOrderBy->nE
e7d0: 78 70 72 2b 31 29 3b 0a 20 20 20 20 61 73 73 65  xpr+1);.    asse
e7e0: 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
e7f0: 70 68 6d 5b 32 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[2] == -1 );.
e800: 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
e810: 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[2] = addr;. 
e820: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
e830: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
e840: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
e850: 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  Return the appro
e860: 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67  priate collating
e870: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
e880: 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
e890: 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   of.** the resul
e8a0: 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f  t set for the co
e8b0: 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74  mpound-select st
e8c0: 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65  atement "p".  Re
e8d0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20  turn NULL if.** 
e8e0: 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e  the column has n
e8f0: 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  o default collat
e900: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
e910: 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e  .** The collatin
e920: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
e930: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
e940: 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ct is taken from
e950: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
e960: 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65  t term of the se
e970: 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20  lect that has a 
e980: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
e990: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  ce..*/.static Co
e9a0: 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65  llSeq *multiSele
e9b0: 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  ctCollSeq(Parse 
e9c0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
e9d0: 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  *p, int iCol){. 
e9e0: 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a   CollSeq *pRet;.
e9f0: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
ea00: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75  ){.    pRet = mu
ea10: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
ea20: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69  (pParse, p->pPri
ea30: 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c  or, iCol);.  }el
ea40: 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30  se{.    pRet = 0
ea50: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65 74  ;.  }.  if( pRet
ea60: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52 65 74 20  ==0 ){.    pRet 
ea70: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
ea80: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
ea90: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
eaa0: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
eab0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e  turn pRet;.}.#en
eac0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
ead0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
eae0: 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CT */..#ifndef S
eaf0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
eb00: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
eb10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
eb20: 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
eb30: 73 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20  ss a query that 
eb40: 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75 6e  is really the un
eb50: 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73  ion.** or inters
eb60: 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72  ection of two or
eb70: 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71   more separate q
eb80: 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70  ueries..**.** "p
eb90: 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  " points to the 
eba0: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68  right-most of th
ebb0: 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20  e two queries.  
ebc0: 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65  the query on the
ebd0: 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70  .** left is p->p
ebe0: 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74  Prior.  The left
ebf0: 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73   query could als
ec00: 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20  o be a compound 
ec10: 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63  query.** in whic
ec20: 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  h case this rout
ec30: 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
ec40: 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20  ed recursively. 
ec50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
ec60: 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20  ts of the total 
ec70: 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20  query are to be 
ec80: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64  written into a d
ec90: 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  estination.** of
eca0: 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68   type eDest with
ecb0: 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d   parameter iParm
ecc0: 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20  ..**.** Example 
ecd0: 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74  1:  Consider a t
ece0: 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e  hree-way compoun
ecf0: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  d SQL statement.
ed00: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
ed10: 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f  T a FROM t1 UNIO
ed20: 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  N SELECT b FROM 
ed30: 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t2 UNION SELECT 
ed40: 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20  c FROM t3.**.** 
ed50: 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
ed60: 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66  s parsed up as f
ed70: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
ed80: 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20    SELECT c FROM 
ed90: 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20  t3.**      |.** 
eda0: 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45       `----->  SE
edb0: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a  LECT b FROM t2.*
edc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
edd0: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
ede0: 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53       `------>  S
edf0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a  ELECT a FROM t1.
ee00: 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73  **.** The arrows
ee10: 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20   in the diagram 
ee20: 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20  above represent 
ee30: 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f  the Select.pPrio
ee40: 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f  r pointer..** So
ee50: 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
ee60: 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
ee70: 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  p equal to the t
ee80: 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a  3 query, then.**
ee90: 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20   pPrior will be 
eea0: 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70  the t2 query.  p
eeb0: 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f  ->op will be TK_
eec0: 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61  UNION in this ca
eed0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65  se..**.** Notice
eee0: 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66   that because of
eef0: 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20   the way SQLite 
ef00: 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20  parses compound 
ef10: 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20  SELECTs, the.** 
ef20: 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63  individual selec
ef30: 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20  ts always group 
ef40: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
ef50: 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ht..*/.static in
ef60: 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20  t multiSelect(. 
ef70: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ef80: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
ef90: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
efa0: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
efb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
efc0: 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
efd0: 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
efe0: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
eff0: 44 65 73 74 2c 20 20 20 20 2f 2a 20 57 68 61 74  Dest,    /* What
f000: 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
f010: 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 63  y results */.  c
f020: 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20  har *aff        
f030: 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74       /* If eDest
f040: 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74   is SRT_Union, t
f050: 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
f060: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ng */.){.  int r
f070: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
f080: 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
f090: 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
f0a0: 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
f0b0: 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
f0c0: 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
f0d0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
f0e0: 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
f0f0: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
f100: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
f110: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
f120: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
f130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f140: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
f150: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
f160: 65 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  et */.  ExprList
f170: 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a   *pOrderBy;   /*
f180: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
f190: 61 75 73 65 20 6f 6e 20 70 20 2a 2f 0a 20 20 69  ause on p */.  i
f1a0: 6e 74 20 61 53 65 74 50 32 5b 32 5d 3b 20 20 20  nt aSetP2[2];   
f1b0: 20 20 20 20 20 2f 2a 20 53 65 74 20 50 32 20 76       /* Set P2 v
f1c0: 61 6c 75 65 20 6f 66 20 74 68 65 73 65 20 6f 70  alue of these op
f1d0: 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f   to number of co
f1e0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
f1f0: 53 65 74 50 32 20 3d 20 30 3b 20 20 20 20 20 20  SetP2 = 0;      
f200: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c   /* Number of sl
f210: 6f 74 73 20 69 6e 20 61 53 65 74 50 32 5b 5d 20  ots in aSetP2[] 
f220: 75 73 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  used */.  Select
f230: 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
f240: 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64  /* Alternative d
f250: 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ata destination 
f260: 2a 2f 0a 0a 20 20 64 65 73 74 20 3d 20 2a 70 44  */..  dest = *pD
f270: 65 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  est;..  /* Make 
f280: 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
f290: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
f2a0: 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
f2b0: 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
f2c0: 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
f2d0: 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c  (right-most) SEL
f2e0: 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
f2f0: 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
f300: 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e  DER BY or LIMIT.
f310: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30  .  */.  if( p==0
f320: 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30   || p->pPrior==0
f330: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
f340: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
f350: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
f360: 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
f370: 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ior;.  assert( p
f380: 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
f390: 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61  t!=pPrior );.  a
f3a0: 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
f3b0: 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52  Rightmost==p->pR
f3c0: 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 69 66  ightmost );.  if
f3d0: 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
f3e0: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
f3f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f400: 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
f410: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
f420: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
f430: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
f440: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
f450: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
f460: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
f470: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
f480: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
f490: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
f4a0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
f4b0: 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
f4c0: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
f4d0: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
f4e0: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
f4f0: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
f500: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
f510: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
f520: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
f530: 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76  sure we have a v
f540: 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e  alid query engin
f550: 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61  e.  If not, crea
f560: 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20  te a new one..  
f570: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
f580: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
f590: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
f5a0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
f5b0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
f5c0: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
f5d0: 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
f5e0: 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
f5f0: 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
f600: 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ary.  */.  if( d
f610: 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45  est.eDest==SRT_E
f620: 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61  phemTab ){.    a
f630: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
f640: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f650: 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28 61 53  nSetP2<sizeof(aS
f660: 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61 53 65  etP2)/sizeof(aSe
f670: 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20 61  tP2[0]) );.    a
f680: 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20  SetP2[nSetP2++] 
f690: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f6a0: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
f6b0: 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 50  hemeral, dest.iP
f6c0: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 64 65 73  arm, 0);.    des
f6d0: 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61  t.eDest = SRT_Ta
f6e0: 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ble;.  }..  /* G
f6f0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
f700: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
f710: 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
f720: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 4f  ments..  */.  pO
f730: 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
f740: 65 72 42 79 3b 0a 20 20 73 77 69 74 63 68 28 20  erBy;.  switch( 
f750: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
f760: 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20  e TK_ALL: {.    
f770: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
f780: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
f790: 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20   addr = 0;.     
f7a0: 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
f7b0: 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
f7c0: 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
f7d0: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
f7e0: 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72  ;.        pPrior
f7f0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70  ->pOffset = p->p
f800: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
f810: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
f820: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
f830: 72 2c 20 26 64 65 73 74 2c 20 30 2c 20 30 2c 20  r, &dest, 0, 0, 
f840: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20  0, aff);.       
f850: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
f860: 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73          p->pOffs
f870: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
f880: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
f890: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
f8a0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
f8b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
f8c0: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
f8d0: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
f8e0: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
f8f0: 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73          p->iOffs
f900: 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
f910: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66  fset;.        if
f920: 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29  ( p->iLimit>=0 )
f930: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72  {.          addr
f940: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f950: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp1(v, OP_IfZer
f960: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20  o, p->iLimit);. 
f970: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
f980: 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61  ment((v, "Jump a
f990: 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65  head if LIMIT re
f9a0: 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ached"));.      
f9b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
f9c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
f9d0: 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 2c  Parse, p, &dest,
f9e0: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
f9f0: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
fa00: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
fa10: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
fa20: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
fa30: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
fa40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fa50: 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20   if( addr ){.   
fa60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
fa70: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
fa80: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dr);.        }. 
fa90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
faa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
fab0: 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e  or UNION ALL ...
fac0: 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74   ORDER BY fall t
fad0: 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
fae0: 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  xt case */.    }
faf0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
fb00: 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
fb10: 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
fb20: 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
fb30: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
fb40: 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
fb50: 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
fb60: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
fb70: 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20 20   int op = 0;    
fb80: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
fb90: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
fba0: 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
fbb0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
fbc0: 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
fbd0: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
fbe0: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
fbf0: 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
fc00: 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
fc10: 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53  , *pOffset; /* S
fc20: 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
fc30: 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
fc40: 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
fc50: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
fc60: 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f   SelectDest unio
fc70: 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 70 72  ndest;..      pr
fc80: 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54  iorOp = p->op==T
fc90: 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c  K_ALL ? SRT_Tabl
fca0: 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  e : SRT_Union;. 
fcb0: 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
fcc0: 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20  est==priorOp && 
fcd0: 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21  pOrderBy==0 && !
fce0: 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21 70 2d  p->pLimit && !p-
fcf0: 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
fd00: 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
fd10: 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
fd20: 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
fd30: 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
fd40: 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69  ur.        ** ri
fd50: 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ght..        */.
fd60: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
fd70: 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20   = dest.iParm;. 
fd80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fd90: 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
fda0: 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
fdb0: 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
fdc0: 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
fdd0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  e.        ** int
fde0: 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
fdf0: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
fe00: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
fe10: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
fe20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 72 6f  .        if( pro
fe30: 63 65 73 73 43 6f 6d 70 6f 75 6e 64 4f 72 64 65  cessCompoundOrde
fe40: 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 75  rBy(pParse, p, u
fe50: 6e 69 6f 6e 54 61 62 29 20 29 7b 0a 20 20 20 20  nionTab) ){.    
fe60: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
fe70: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
fe80: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
fe90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fea0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
feb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fec0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75  OpenEphemeral, u
fed0: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
fee0: 20 20 20 20 20 69 66 28 20 70 72 69 6f 72 4f 70       if( priorOp
fef0: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20  ==SRT_Table ){. 
ff00: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
ff10: 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28 61   nSetP2<sizeof(a
ff20: 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61 53  SetP2)/sizeof(aS
ff30: 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20  etP2[0]) );.    
ff40: 20 20 20 20 20 20 61 53 65 74 50 32 5b 6e 53 65        aSetP2[nSe
ff50: 74 50 32 2b 2b 5d 20 3d 20 61 64 64 72 3b 0a 20  tP2++] = addr;. 
ff60: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ff70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ff80: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
ff90: 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
ffa0: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
ffb0: 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
ffc0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 52  .          p->pR
ffd0: 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70  ightmost->usesEp
ffe0: 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  hm = 1;.        
fff0: 7d 0a 20 20 20 20 20 20 20 20 63 72 65 61 74 65  }.        create
10000 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61  SortingIndex(pPa
10010 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42 79  rse, p, pOrderBy
10020 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
10030 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
10040 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
10050 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
10060 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
10070 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
10080 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
10090 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
100a0 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  y );.      sqlit
100b0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
100c0 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69  (&uniondest, pri
100d0 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b  orOp, unionTab);
100e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
100f0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
10100 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e  , pPrior, &union
10110 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61  dest, 0, 0, 0, a
10120 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ff);.      if( r
10130 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
10140 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
10150 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
10160 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
10170 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74  urrent SELECT st
10180 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f  atement.      */
10190 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70  .      switch( p
101a0 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ->op ){.        
101b0 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
101c0 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70    op = SRT_Excep
101d0 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  t;   break;.    
101e0 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49       case TK_UNI
101f0 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55  ON:   op = SRT_U
10200 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a  nion;    break;.
10210 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
10220 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53  _ALL:     op = S
10230 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65  RT_Table;    bre
10240 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
10250 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
10260 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
10270 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  By = 0;.      p-
10280 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79  >disallowOrderBy
10290 20 3d 20 70 4f 72 64 65 72 42 79 21 3d 30 3b 0a   = pOrderBy!=0;.
102a0 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
102b0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
102c0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
102d0 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
102e0 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
102f0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
10300 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74  .      uniondest
10310 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20  .eDest = op;.   
10320 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
10330 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
10340 20 26 75 6e 69 6f 6e 64 65 73 74 2c 20 30 2c 20   &uniondest, 0, 
10350 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20  0, 0, aff);.    
10360 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74    /* Query flatt
10370 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33  ening in sqlite3
10380 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72  Select() might r
10390 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42  efill p->pOrderB
103a0 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73  y..      ** Be s
103b0 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d  ure to delete p-
103c0 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65  >pOrderBy, there
103d0 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61  fore, to avoid a
103e0 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f   memory leak. */
103f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10400 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
10410 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
10420 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
10430 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  ior;.      p->pO
10440 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
10450 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  y;.      sqlite3
10460 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
10470 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
10480 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
10490 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
104a0 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
104b0 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d     p->iLimit = -
104c0 31 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  1;.      p->iOff
104d0 73 65 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  set = -1;.      
104e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
104f0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
10500 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
10510 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ...      /* Conv
10520 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
10530 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
10540 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
10550 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
10560 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
10570 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
10580 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20      */      .   
10590 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
105a0 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e  t!=priorOp || un
105b0 69 6f 6e 54 61 62 21 3d 64 65 73 74 2e 69 50 61  ionTab!=dest.iPa
105c0 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  rm ){.        in
105d0 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
105e0 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
105f0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
10600 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
10610 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
10620 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
10630 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
10640 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
10650 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
10660 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
10670 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
10680 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Prior;.         
10690 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
106a0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
106b0 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
106c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
106d0 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
106e0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
106f0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
10700 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
10710 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
10720 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
10730 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
10740 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
10750 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10760 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10770 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62  Rewind, unionTab
10780 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
10790 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
107a0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
107b0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72  dr(v);.        r
107c0 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  c = selectInnerL
107d0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
107e0 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54  ->pEList, unionT
107f0 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ab, p->pEList->n
10800 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
10810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10820 20 20 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c     pOrderBy, -1,
10830 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
10840 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Break, 0);.     
10850 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10860 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
10870 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
10880 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
10890 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
108a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
108b0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
108c0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
108d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
108e0 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e  , OP_Next, union
108f0 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  Tab, iStart);.  
10900 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10910 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
10920 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
10930 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10940 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
10950 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
10960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
10970 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
10980 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
10990 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62   {.      int tab
109a0 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69  1, tab2;.      i
109b0 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
109c0 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
109d0 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
109e0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e  Offset;.      in
109f0 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65  t addr;.      Se
10a00 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65  lectDest interse
10a10 63 74 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 2f  ctdest;..      /
10a20 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64  * INTERSECT is d
10a30 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
10a40 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69  e others since i
10a50 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
10a60 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72   ** two temporar
10a70 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65  y tables.  Hence
10a80 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20   it has its own 
10a90 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20  case.  Begin.   
10aa0 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
10ab0 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
10ac0 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
10ad0 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31     */.      tab1
10ae0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
10af0 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20  +;.      tab2 = 
10b00 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
10b10 20 20 20 20 20 20 69 66 28 20 70 72 6f 63 65 73        if( proces
10b20 73 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79  sCompoundOrderBy
10b30 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61 62 31  (pParse, p, tab1
10b40 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
10b50 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
10b60 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
10b70 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
10b80 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49    createSortingI
10b90 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20  ndex(pParse, p, 
10ba0 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20 20 20  pOrderBy);..    
10bb0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
10bc0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10bd0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
10be0 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
10bf0 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
10c00 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
10c10 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
10c20 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61  rOpenEphm[0] = a
10c30 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52  ddr;.      p->pR
10c40 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70  ightmost->usesEp
10c50 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73  hm = 1;.      as
10c60 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
10c70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
10c80 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
10c90 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
10ca0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
10cb0 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  tab1"..      */.
10cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
10cd0 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74  ectDestInit(&int
10ce0 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f  ersectdest, SRT_
10cf0 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20  Union, tab1);.  
10d00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10d10 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
10d20 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63  Prior, &intersec
10d30 74 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  tdest, 0, 0, 0, 
10d40 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  aff);.      if( 
10d50 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
10d60 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
10d70 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
10d80 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
10d90 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
10da0 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
10db0 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20  ble "tab2".     
10dc0 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d   */.      addr =
10dd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10de0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
10df0 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29  emeral, tab2, 0)
10e00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10e10 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
10e20 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  1] == -1 );.    
10e30 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
10e40 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[1] = addr;.   
10e50 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
10e60 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
10e70 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
10e80 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
10e90 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
10ea0 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
10eb0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
10ec0 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65  0;.      interse
10ed0 63 74 64 65 73 74 2e 69 50 61 72 6d 20 3d 20 74  ctdest.iParm = t
10ee0 61 62 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ab2;.      rc = 
10ef0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
10f00 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73  arse, p, &inters
10f10 65 63 74 64 65 73 74 2c 20 30 2c 20 30 2c 20 30  ectdest, 0, 0, 0
10f20 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d  , aff);.      p-
10f30 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
10f40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
10f50 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69  xprDelete(p->pLi
10f60 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
10f70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
10f80 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
10f90 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
10fa0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
10fb0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
10fc0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
10fd0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e   }..      /* Gen
10fe0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
10ff0 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
11000 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
11010 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
11020 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
11030 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
11040 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
11050 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
11060 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
11070 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65   ){.        Sele
11080 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
11090 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
110a0 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
110b0 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
110c0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
110d0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
110e0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
110f0 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
11100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11110 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
11120 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
11130 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
11140 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
11150 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
11160 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
11170 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
11180 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
11190 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
111a0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
111b0 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  b1, iBreak);.   
111c0 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
111d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
111e0 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31   OP_RowKey, tab1
111f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
11200 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11210 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
11220 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  b2, iCont);.    
11230 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e    rc = selectInn
11240 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
11250 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
11260 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  1, p->pEList->nE
11270 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11290 20 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20    pOrderBy, -1, 
112a0 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
112b0 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  reak, 0);.      
112c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
112d0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
112e0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
112f0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
11300 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11310 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
11320 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
11330 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11340 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  2(v, OP_Next, ta
11350 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  b1, iStart);.   
11360 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
11370 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
11380 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
11390 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
113a0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
113b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
113c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
113d0 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
113e0 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
113f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11400 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
11410 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
11420 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
11430 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
11440 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
11450 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
11460 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
11470 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
11480 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
11490 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  );.  if( p->pELi
114a0 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f  st->nExpr!=pPrio
114b0 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  r->pEList->nExpr
114c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
114d0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
114e0 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
114f0 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
11500 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f  f %s".      " do
11510 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61   not have the sa
11520 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  me number of res
11530 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65  ult columns", se
11540 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
11550 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
11560 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
11570 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
11580 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d    /* Set the num
11590 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
115a0 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
115b0 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d  es.  */.  nCol =
115c0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
115d0 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 65 74  r;.  while( nSet
115e0 50 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  P2 ){.    sqlite
115f0 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
11600 20 61 53 65 74 50 32 5b 2d 2d 6e 53 65 74 50 32   aSetP2[--nSetP2
11610 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20  ], nCol);.  }.. 
11620 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c   /* Compute coll
11630 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
11640 75 73 65 64 20 62 79 20 65 69 74 68 65 72 20 74  used by either t
11650 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11660 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e  se or.  ** by an
11670 79 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  y temporary tabl
11680 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70  es needed to imp
11690 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f  lement the compo
116a0 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a  und select..  **
116b0 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49   Attach the KeyI
116c0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f  nfo structure to
116d0 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74   all temporary t
116e0 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74  ables.  Invoke t
116f0 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59  he.  ** ORDER BY
11700 20 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74   processing if t
11710 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
11720 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a   BY clause..  **
11730 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
11740 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
11750 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
11760 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
11770 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
11780 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
11790 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
117a0 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
117b0 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
117c0 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
117d0 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
117e0 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
117f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11800 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
11810 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
11820 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
11830 20 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e   pOrderBy || p->
11840 75 73 65 73 45 70 68 6d 20 29 7b 0a 20 20 20 20  usesEphm ){.    
11850 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11870 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
11880 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
11890 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
118a0 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
118b0 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
118c0 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
118d0 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
118e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
118f0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
11900 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73  through SELECT s
11910 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
11920 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20   int nKeyCol;   
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11940 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
11950 69 65 73 20 69 6e 20 70 4b 65 79 49 6e 66 6f 2d  ies in pKeyInfo-
11960 3e 61 43 6f 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43  >aCol[] */.    C
11970 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b  ollSeq **apColl;
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11990 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
119a0 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  ugh pKeyInfo->aC
119b0 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c  oll[] */.    Col
119c0 6c 53 65 71 20 2a 2a 61 43 6f 70 79 3b 20 20 20  lSeq **aCopy;   
119d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
119e0 63 6f 70 79 20 6f 66 20 70 4b 65 79 49 6e 66 6f  copy of pKeyInfo
119f0 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 0a 20 20  ->aColl[] */..  
11a00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
11a10 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20  ghtmost==p );.  
11a20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c    nKeyCol = nCol
11a30 20 2b 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70   + (pOrderBy ? p
11a40 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a  OrderBy->nExpr :
11a50 20 30 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66   0);.    pKeyInf
11a60 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
11a70 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
11a80 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
11a90 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
11aa0 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 4b 65  f(*pKeyInfo)+nKe
11ab0 79 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  yCol*(sizeof(Col
11ac0 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20  lSeq*) + 1));.  
11ad0 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20    if( !pKeyInfo 
11ae0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
11af0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
11b00 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
11b10 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
11b20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e      pKeyInfo->en
11b30 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e  c = ENC(pParse->
11b40 64 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  db);.    pKeyInf
11b50 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c  o->nField = nCol
11b60 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  ;..    for(i=0, 
11b70 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d  apColl=pKeyInfo-
11b80 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  >aColl; i<nCol; 
11b90 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a  i++, apColl++){.
11ba0 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
11bb0 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
11bc0 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
11bd0 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a  ;.      if( 0==*
11be0 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  apColl ){.      
11bf0 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 50 61 72    *apColl = pPar
11c00 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
11c10 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
11c20 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ..    for(pLoop=
11c30 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
11c40 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  pLoop->pPrior){.
11c50 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
11c60 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
11c70 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f    int addr = pLo
11c80 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
11c90 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
11ca0 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20   addr<0 ){.     
11cb0 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69       /* If [0] i
11cc0 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31  s unused then [1
11cd0 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64  ] is also unused
11ce0 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20  .  So we can.   
11cf0 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
11d00 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73   safely abort as
11d10 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72   soon as the fir
11d20 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69  st unused slot i
11d30 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  s found */.     
11d40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
11d50 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
11d60 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20  [1]<0 );.       
11d70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
11d80 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
11d90 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
11da0 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a  v, addr, nCol);.
11db0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11dc0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
11dd0 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79  ddr, (char*)pKey
11de0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
11df0 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  );.        pLoop
11e00 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
11e10 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  ] = -1;.      }.
11e20 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
11e30 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
11e40 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
11e50 5f 69 74 65 6d 20 2a 70 4f 54 65 72 6d 20 3d 20  _item *pOTerm = 
11e60 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 20  pOrderBy->a;.   
11e70 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 45     int nOrderByE
11e80 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
11e90 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  nExpr;.      int
11ea0 20 61 64 64 72 3b 0a 20 20 20 20 20 20 75 38 20   addr;.      u8 
11eb0 2a 70 53 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20  *pSortOrder;..  
11ec0 20 20 20 20 2f 2a 20 52 65 75 73 65 20 74 68 65      /* Reuse the
11ed0 20 73 61 6d 65 20 70 4b 65 79 49 6e 66 6f 20 66   same pKeyInfo f
11ee0 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  or the ORDER BY 
11ef0 61 73 20 77 61 73 20 75 73 65 64 20 61 62 6f 76  as was used abov
11f00 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74  e for.      ** t
11f10 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
11f20 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ct statements.  
11f30 45 78 63 65 70 74 20 77 65 20 68 61 76 65 20 74  Except we have t
11f40 6f 20 63 68 61 6e 67 65 20 6f 75 74 20 74 68 65  o change out the
11f50 0a 20 20 20 20 20 20 2a 2a 20 70 4b 65 79 49 6e  .      ** pKeyIn
11f60 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75  fo->aColl[] valu
11f70 65 73 2e 20 20 53 6f 6d 65 20 6f 66 20 74 68 65  es.  Some of the
11f80 20 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65 73 20   aColl[] values 
11f90 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
11fa0 20 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f 6e   reused when con
11fb0 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 70 4b  structing the pK
11fc0 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 4f  eyInfo for the O
11fd0 52 44 45 52 20 42 59 2c 20 73 6f 20 6d 61 6b 65  RDER BY, so make
11fe0 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79  .      ** a copy
11ff0 2e 20 20 53 75 66 66 69 63 69 65 6e 74 20 73 70  .  Sufficient sp
12000 61 63 65 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68  ace to hold both
12010 20 74 68 65 20 6e 43 6f 6c 20 65 6e 74 72 69 65   the nCol entrie
12020 73 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74  s for.      ** t
12030 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
12040 63 74 20 61 6e 64 20 74 68 65 20 6e 4f 72 64 65  ct and the nOrde
12050 72 62 79 45 78 70 72 20 65 6e 74 72 69 65 73 20  rbyExpr entries 
12060 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  for the ORDER BY
12070 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 61 6c  .      ** was al
12080 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 2e 20 20  located above.  
12090 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d  But we need to m
120a0 6f 76 65 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ove the compound
120b0 20 73 65 6c 65 63 74 0a 20 20 20 20 20 20 2a 2a   select.      **
120c0 20 65 6e 74 72 69 65 73 20 6f 75 74 20 6f 66 20   entries out of 
120d0 74 68 65 20 77 61 79 20 62 65 66 6f 72 65 20 63  the way before c
120e0 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65 20  onstructing the 
120f0 4f 52 44 45 52 20 42 59 20 65 6e 74 72 69 65 73  ORDER BY entries
12100 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 6f 76 65 20  ..      ** Move 
12110 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
12120 65 63 74 20 65 6e 74 72 69 65 73 20 69 6e 74 6f  ect entries into
12130 20 61 43 6f 70 79 5b 5d 20 77 68 65 72 65 20 74   aCopy[] where t
12140 68 65 79 20 63 61 6e 20 62 65 0a 20 20 20 20 20  hey can be.     
12150 20 2a 2a 20 61 63 63 65 73 73 65 64 20 61 6e 64   ** accessed and
12160 20 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f 6e   reused when con
12170 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 4f 52  structing the OR
12180 44 45 52 20 42 59 20 65 6e 74 72 69 65 73 2e 0a  DER BY entries..
12190 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
121a0 20 6e 43 6f 6c 20 6d 69 67 68 74 20 62 65 20 67   nCol might be g
121b0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 6c  reater than or l
121c0 65 73 73 20 74 68 61 6e 20 6e 4f 72 64 65 72 42  ess than nOrderB
121d0 79 45 78 70 72 0a 20 20 20 20 20 20 2a 2a 20 77  yExpr.      ** w
121e0 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 6d 65  e have to use me
121f0 6d 6d 6f 76 65 28 29 20 77 68 65 6e 20 64 6f 69  mmove() when doi
12200 6e 67 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20  ng the copy..   
12210 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 43 6f 70     */.      aCop
12220 79 20 3d 20 26 70 4b 65 79 49 6e 66 6f 2d 3e 61  y = &pKeyInfo->a
12230 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 45 78 70  Coll[nOrderByExp
12240 72 5d 3b 0a 20 20 20 20 20 20 70 53 6f 72 74 4f  r];.      pSortO
12250 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  rder = pKeyInfo-
12260 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
12270 38 2a 29 26 61 43 6f 70 79 5b 6e 43 6f 6c 5d 3b  8*)&aCopy[nCol];
12280 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 61  .      memmove(a
12290 43 6f 70 79 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  Copy, pKeyInfo->
122a0 61 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73 69 7a 65  aColl, nCol*size
122b0 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a 0a  of(CollSeq*));..
122c0 20 20 20 20 20 20 61 70 43 6f 6c 6c 20 3d 20 70        apColl = p
122d0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a  KeyInfo->aColl;.
122e0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
122f0 3c 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 20 69  <nOrderByExpr; i
12300 2b 2b 2c 20 70 4f 54 65 72 6d 2b 2b 2c 20 61 70  ++, pOTerm++, ap
12310 43 6f 6c 6c 2b 2b 2c 20 70 53 6f 72 74 4f 72 64  Coll++, pSortOrd
12320 65 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45  er++){.        E
12330 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 54  xpr *pExpr = pOT
12340 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
12350 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e      if( (pExpr->
12360 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
12370 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  llate) ){.      
12380 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
12390 72 2d 3e 70 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20  r->pColl!=0 );. 
123a0 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c           *apColl
123b0 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b   = pExpr->pColl;
123c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
123d0 20 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c            *apCol
123e0 6c 20 3d 20 61 43 6f 70 79 5b 70 45 78 70 72 2d  l = aCopy[pExpr-
123f0 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20  >iColumn];.     
12400 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 53     }.        *pS
12410 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 54 65 72  ortOrder = pOTer
12420 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
12430 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
12440 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  rt( p->pRightmos
12450 74 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 61 73  t==p );.      as
12460 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
12470 6e 45 70 68 6d 5b 32 5d 3e 3d 30 20 29 3b 0a 20  nEphm[2]>=0 );. 
12480 20 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 61       addr = p->a
12490 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3b 0a  ddrOpenEphm[2];.
124a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
124b0 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
124c0 72 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  r, p->pOrderBy->
124d0 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 20 20  nExpr+2);.      
124e0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
124f0 20 3d 20 6e 4f 72 64 65 72 42 79 45 78 70 72 3b   = nOrderByExpr;
12500 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12510 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
12520 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49  dr, (char*)pKeyI
12530 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
12540 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
12550 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20  pKeyInfo = 0;.  
12560 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
12570 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20  Tail(pParse, p, 
12580 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  v, p->pEList->nE
12590 78 70 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  xpr, &dest);.   
125a0 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
125b0 66 72 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  free(pKeyInfo);.
125c0 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63    }..multi_selec
125d0 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e  t_end:.  pDest->
125e0 69 4d 65 6d 20 3d 20 64 65 73 74 2e 69 4d 65 6d  iMem = dest.iMem
125f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12600 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12610 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
12620 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64  SELECT */..#ifnd
12630 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
12640 49 45 57 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44  IEW./* Forward D
12650 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  eclarations */.s
12660 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
12670 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33  ExprList(sqlite3
12680 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e  *, ExprList*, in
12690 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  t, ExprList*);.s
126a0 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
126b0 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c  Select(sqlite3*,
126c0 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20   Select *, int, 
126d0 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a  ExprList *);../*
126e0 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68  .** Scan through
126f0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
12700 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20  pExpr.  Replace 
12710 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20  every reference 
12720 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69  to.** a column i
12730 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
12740 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70  Table with a cop
12750 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e  y of the iColumn
12760 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  -th.** entry in 
12770 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65  pEList.  (But le
12780 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ave references t
12790 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75  o the ROWID colu
127a0 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  mn .** unchanged
127b0 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .).**.** This ro
127c0 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66  utine is part of
127d0 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
127e0 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75  procedure.  A su
127f0 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20  bquery.** whose 
12800 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65  result set is de
12810 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20  fined by pEList 
12820 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79  appears as entry
12830 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20   in the.** FROM 
12840 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
12850 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65  CT such that the
12860 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73   VDBE cursor ass
12870 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a  igned to that.**
12880 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74   FORM clause ent
12890 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54  ry is iTable.  T
128a0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
128b0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a   the necessary .
128c0 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45  ** changes to pE
128d0 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72  xpr so that it r
128e0 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
128f0 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  o the source tab
12900 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  le.** of the sub
12910 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65  query rather the
12920 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
12930 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
12940 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
12950 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33  tExpr(.  sqlite3
12960 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
12970 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
12980 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e  rors to this con
12990 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
129a0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
129b0 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
129c0 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
129d0 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ccurs */.  int i
129e0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  Table,         /
129f0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
12a00 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
12a10 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
12a20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
12a30 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
12a40 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
12a50 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
12a60 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
12a70 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
12a80 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
12a90 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
12aa0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
12ab0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
12ac0 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
12ad0 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
12ae0 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73  *pNew;.      ass
12af0 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26  ert( pEList!=0 &
12b00 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
12b10 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
12b20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12b30 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
12b40 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
12b50 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  ==0 && pExpr->pL
12b60 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
12b70 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61  pNew = pEList->a
12b80 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
12b90 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
12ba0 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b  sert( pNew!=0 );
12bb0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
12bc0 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20   = pNew->op;.   
12bd0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
12be0 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20  ->pLeft==0 );.  
12bf0 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
12c00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
12c10 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 4c 65 66  p(db, pNew->pLef
12c20 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
12c30 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  ( pExpr->pRight=
12c40 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
12c50 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r->pRight = sqli
12c60 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
12c70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  New->pRight);.  
12c80 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
12c90 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
12ca0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73       pExpr->pLis
12cb0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
12cc0 69 73 74 44 75 70 28 64 62 2c 20 70 4e 65 77 2d  istDup(db, pNew-
12cd0 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  >pList);.      p
12ce0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
12cf0 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  New->iTable;.   
12d00 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
12d10 20 70 4e 65 77 2d 3e 70 54 61 62 3b 0a 20 20 20   pNew->pTab;.   
12d20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
12d30 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d  n = pNew->iColum
12d40 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  n;.      pExpr->
12d50 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67  iAgg = pNew->iAg
12d60 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  g;.      sqlite3
12d70 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70  TokenCopy(db, &p
12d80 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e  Expr->token, &pN
12d90 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ew->token);.    
12da0 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
12db0 70 79 28 64 62 2c 20 26 70 45 78 70 72 2d 3e 73  py(db, &pExpr->s
12dc0 70 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e  pan, &pNew->span
12dd0 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
12de0 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
12df0 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
12e00 4e 65 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  New->pSelect);. 
12e10 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67       pExpr->flag
12e20 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73 3b  s = pNew->flags;
12e30 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
12e40 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62      substExpr(db
12e50 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
12e60 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
12e70 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64  .    substExpr(d
12e80 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  b, pExpr->pRight
12e90 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
12ea0 29 3b 0a 20 20 20 20 73 75 62 73 74 53 65 6c 65  );.    substSele
12eb0 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 53  ct(db, pExpr->pS
12ec0 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70  elect, iTable, p
12ed0 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
12ee0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45  tExprList(db, pE
12ef0 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62  xpr->pList, iTab
12f00 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
12f10 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
12f20 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
12f30 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
12f40 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
12f50 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
12f60 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
12f70 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c  *pList,     /* L
12f80 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
12f90 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
12fa0 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
12fb0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
12fc0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
12fd0 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
12fe0 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
12ff0 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
13000 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
13010 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
13020 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
13030 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
13040 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
13050 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75  pr; i++){.    su
13060 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73  bstExpr(db, pLis
13070 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
13080 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
13090 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
130a0 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20  d substSelect(. 
130b0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
130c0 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
130d0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65  malloc errors he
130e0 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  re */.  Select *
130f0 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
13100 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13110 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b   in which to mak
13120 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
13130 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
13140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
13150 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  le to be replace
13160 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
13170 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
13180 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
13190 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 21 70 20   */.){.  if( !p 
131a0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73  ) return;.  subs
131b0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
131c0 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  >pEList, iTable,
131d0 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
131e0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
131f0 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c  >pGroupBy, iTabl
13200 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
13210 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
13220 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61  p->pOrderBy, iTa
13230 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
13240 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
13250 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65  >pHaving, iTable
13260 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
13270 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57  stExpr(db, p->pW
13280 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45  here, iTable, pE
13290 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65  List);.  substSe
132a0 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69  lect(db, p->pPri
132b0 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  or, iTable, pELi
132c0 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  st);.}.#endif /*
132d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
132e0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
132f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13300 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54  MIT_VIEW./*.** T
13310 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
13320 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
13330 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72  subqueries in or
13340 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20  der to speed.** 
13350 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72  execution.  It r
13360 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
13370 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
13380 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
13390 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a  ing.** occurs..*
133a0 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
133b0 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
133c0 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
133d0 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
133e0 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
133f0 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
13400 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
13410 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
13420 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
13430 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
13440 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
13450 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
13460 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
13470 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
13480 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
13490 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
134a0 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
134b0 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
134c0 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
134d0 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
134e0 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
134f0 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
13500 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
13510 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
13520 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
13530 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
13540 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
13550 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
13560 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
13570 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
13580 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
13590 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
135a0 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
135b0 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
135c0 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
135d0 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
135e0 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
135f0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
13600 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
13610 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
13620 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
13630 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
13640 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
13650 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f  his simpificatio
13660 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
13670 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
13680 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
13690 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
136a0 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
136b0 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
136c0 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
136d0 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
136e0 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
136f0 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
13700 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
13710 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
13720 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
13730 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
13740 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
13750 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
13760 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
13770 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
13780 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
13790 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
137a0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
137b0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
137c0 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  te or the outer 
137d0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
137e0 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  oin..**.**   (3)
137f0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
13800 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
13810 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
13820 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f 72  t outer join, or
13830 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 73  .**        the s
13840 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 69  ubquery is not i
13850 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20 28  tself a join.  (
13860 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a 0a  Ticket #306).**.
13870 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75  **   (4)  The su
13880 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
13890 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75  STINCT or the ou
138a0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
138b0 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
138c0 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75 65   (5)  The subque
138d0 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
138e0 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
138f0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
13900 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
13910 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
13920 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65   (6)  The subque
13930 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
13940 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
13950 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
13960 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
13970 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
13980 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65   (7)  The subque
13990 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c  ry has a FROM cl
139a0 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38  ause..**.**   (8
139b0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
139c0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
139d0 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
139e0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
139f0 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29  oin..**.**   (9)
13a00 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
13a10 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
13a20 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
13a30 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
13a40 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72  e.**        aggr
13a50 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  egates..**.**  (
13a60 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72  10)  The subquer
13a70 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
13a80 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
13a90 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
13aa0 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
13ab0 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a  use LIMIT..**.**
13ac0 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71    (11)  The subq
13ad0 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
13ae0 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
13af0 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20  both have ORDER 
13b00 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  BY clauses..**.*
13b10 2a 20 20 28 31 32 29 20 20 54 68 65 20 73 75 62  *  (12)  The sub
13b20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65  query is not the
13b30 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
13b40 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
13b50 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   or the.**      
13b60 20 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e    subquery has n
13b70 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  o WHERE clause. 
13b80 20 28 61 64 64 65 64 20 62 79 20 74 69 63 6b 65   (added by ticke
13b90 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 20 28  t #350).**.**  (
13ba0 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  13)  The subquer
13bb0 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72  y and outer quer
13bc0 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
13bd0 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20 28  e LIMIT.**.**  (
13be0 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  14)  The subquer
13bf0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f  y does not use O
13c00 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31 35  FFSET.**.**  (15
13c10 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  )  The outer que
13c20 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ry is not part o
13c30 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
13c40 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20  ect or the.**   
13c50 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f       subquery do
13c60 65 73 20 6e 6f 74 20 68 61 76 65 20 62 6f 74 68  es not have both
13c70 20 61 6e 20 4f 52 44 45 52 20 42 59 20 61 6e 64   an ORDER BY and
13c80 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e   a LIMIT clause.
13c90 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
13ca0 74 69 63 6b 65 74 20 23 32 33 33 39 29 0a 2a 2a  ticket #2339).**
13cb0 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
13cc0 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
13cd0 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
13ce0 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
13cf0 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
13d00 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
13d10 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
13d20 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
13d30 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
13d40 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
13d50 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
13d60 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
13d70 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
13d80 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
13d90 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
13da0 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
13db0 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
13dc0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
13dd0 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
13de0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
13df0 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
13e00 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
13e10 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
13e20 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
13e30 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
13e40 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
13e50 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
13e60 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
13e70 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
13e80 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
13e90 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
13ea0 75 65 72 79 28 0a 20 20 73 71 6c 69 74 65 33 20  uery(.  sqlite3 
13eb0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
13ec0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
13ed0 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
13ee0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
13ef0 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
13f00 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
13f10 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
13f20 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
13f30 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
13f40 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
13f50 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
13f60 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20  /.  int isAgg,  
13f70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
13f80 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
13f90 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
13fa0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
13fb0 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nt subqueryIsAgg
13fc0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
13fd0 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
13fe0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
13ff0 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  ions */.){.  Sel
14000 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20  ect *pSub;      
14010 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75   /* The inner qu
14020 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79  ery or "subquery
14030 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  " */.  SrcList *
14040 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
14050 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
14060 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
14070 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
14080 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
14090 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
140a0 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
140b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
140c0 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
140d0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
140e0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
140f0 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
14100 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
14110 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
14120 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
14130 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
14140 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
14150 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
14160 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
14170 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
14180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14190 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
141a0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
141b0 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
141c0 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
141d0 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  uery */..  /* Ch
141e0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c  eck to see if fl
141f0 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
14200 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30  itted.  Return 0
14210 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20   if not..  */.  
14220 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
14230 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
14240 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
14250 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d   pSrc && iFrom>=
14260 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d  0 && iFrom<pSrc-
14270 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69  >nSrc );.  pSubi
14280 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
14290 46 72 6f 6d 5d 3b 0a 20 20 70 53 75 62 20 3d 20  From];.  pSub = 
142a0 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
142b0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  t;.  assert( pSu
142c0 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  b!=0 );.  if( is
142d0 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49  Agg && subqueryI
142e0 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
142f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14300 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
14310 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75  (1)  */.  if( su
14320 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70  bqueryIsAgg && p
14330 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65  Src->nSrc>1 ) re
14340 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
14350 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
14360 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72  (2)  */.  pSubSr
14370 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
14380 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72    assert( pSubSr
14390 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20  c );.  /* Prior 
143a0 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32  to version 3.1.2
143b0 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  , when LIMIT and
143c0 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62   OFFSET had to b
143d0 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e  e simple constan
143e0 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62  ts,.  ** not arb
143f0 69 74 72 61 72 79 20 65 78 70 72 65 73 73 73 69  itrary expresssi
14400 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20  ons, we allowed 
14410 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f  some combining o
14420 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  f LIMIT and OFFS
14430 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  ET.  ** because 
14440 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f  they could be co
14450 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c  mputed at compil
14460 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65  e-time.  But whe
14470 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
14480 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61  ET.  ** became a
14490 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
144a0 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f  ions, we were fo
144b0 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74  rced to add rest
144c0 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20  rictions (13).  
144d0 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a  ** and (14). */.
144e0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
144f0 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20  it && p->pLimit 
14500 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
14510 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
14520 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a  riction (13) */.
14530 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66    if( pSub->pOff
14540 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  set ) return 0; 
14550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14560 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
14570 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a  riction (14) */.
14580 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d    if( p->pRightm
14590 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  ost && pSub->pLi
145a0 6d 69 74 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  mit && pSub->pOr
145b0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74  derBy ){.    ret
145c0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145f0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
14600 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
14610 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
14620 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
14650 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
14660 66 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73 74  f( (pSub->isDist
14670 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 70 4c  inct || pSub->pL
14680 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20 20  imit) .         
14690 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
146a0 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 20 20 20   || isAgg) ){   
146b0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
146c0 63 74 69 6f 6e 73 20 28 34 29 28 35 29 28 38 29  ctions (4)(5)(8)
146d0 28 39 29 20 2a 2f 0a 20 20 20 20 20 72 65 74 75  (9) */.     retu
146e0 72 6e 20 30 3b 20 20 20 20 20 20 20 0a 20 20 7d  rn 0;       .  }
146f0 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73 74  .  if( p->isDist
14700 69 6e 63 74 20 26 26 20 73 75 62 71 75 65 72 79  inct && subquery
14710 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
14720 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
14730 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f  triction (6)  */
14740 0a 20 20 69 66 28 20 28 70 2d 3e 64 69 73 61 6c  .  if( (p->disal
14750 6c 6f 77 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d  lowOrderBy || p-
14760 3e 70 4f 72 64 65 72 42 79 29 20 26 26 20 70 53  >pOrderBy) && pS
14770 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
14780 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
14790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
147c0 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a  riction (11) */.
147d0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69    }..  /* Restri
147e0 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65  ction 3:  If the
147f0 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
14800 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
14810 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a  he subquery is .
14820 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73    ** not used as
14830 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
14840 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a  nd of an outer j
14850 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f  oin.  Examples o
14860 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20  f why this.  ** 
14870 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
14880 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
14890 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
148a0 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33  JOIN (t2 JOIN t3
148b0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
148c0 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
148d0 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
148e0 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
148f0 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
14900 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e  ER JOIN t2) JOIN
14910 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68   t3.  **.  ** wh
14920 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c  ich is not at al
14930 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  l the same thing
14940 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
14950 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20  bSrc->nSrc>1 && 
14960 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74  (pSubitem->joint
14970 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
14980 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
14990 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
149a0 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49  striction 12:  I
149b0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
149c0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
149d0 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
149e0 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d  ter.  ** join, m
149f0 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
14a00 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
14a10 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20  RE clause..  ** 
14a20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77  An examples of w
14a30 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  hy this is not a
14a40 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
14a50 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
14a60 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45  T OUTER JOIN (SE
14a70 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57  LECT * FROM t2 W
14a80 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a  HERE t2.x>0).  *
14a90 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
14aa0 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
14ab0 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
14ac0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
14ad0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
14ae0 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e  IN t2) WHERE t2.
14af0 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75  x>0.  **.  ** Bu
14b00 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73  t the t2.x>0 tes
14b10 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  t will always fa
14b20 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77  il on a NULL row
14b30 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20   of t2, which.  
14b40 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63  ** effectively c
14b50 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45  onverts the OUTE
14b60 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49  R JOIN into an I
14b70 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a  NNER JOIN..  */.
14b80 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d    if( (pSubitem-
14b90 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  >jointype & JT_O
14ba0 55 54 45 52 29 21 3d 30 20 26 26 20 70 53 75 62  UTER)!=0 && pSub
14bb0 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a 20  ->pWhere!=0 ){. 
14bc0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
14bd0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
14be0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
14bf0 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69  t means flatteni
14c00 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 20  ng is permitted 
14c10 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46 72  for the.  ** iFr
14c20 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
14c30 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
14c40 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
14c50 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f  y..  */..  /* Mo
14c60 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52  ve all of the FR
14c70 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  OM elements of t
14c80 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
14c90 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52   the.  ** the FR
14ca0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
14cb0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
14cc0 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73  efore doing this
14cd0 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  , remember.  ** 
14ce0 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
14cf0 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  r for the origin
14d00 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  al outer query F
14d10 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20  ROM element in. 
14d20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68   ** iParent.  Th
14d30 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72  e iParent cursor
14d40 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
14d50 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74  sed.  Subsequent
14d60 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   code.  ** will 
14d70 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  scan expressions
14d80 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61   looking for iPa
14d90 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
14da0 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  and replace.  **
14db0 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65   those reference
14dc0 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f  s with expressio
14dd0 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20  ns that resolve 
14de0 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
14df0 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e  FROM.  ** elemen
14e00 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f  ts we are now co
14e10 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20  pying in..  */. 
14e20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69   iParent = pSubi
14e30 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
14e40 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
14e50 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  c = pSubSrc->nSr
14e60 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74  c;.    int joint
14e70 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ype = pSubitem->
14e80 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20 20 73  jointype;..    s
14e90 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
14ea0 65 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  e(pSubitem->pTab
14eb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
14ec0 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ree(pSubitem->zD
14ed0 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
14ee0 6c 69 74 65 33 5f 66 72 65 65 28 70 53 75 62 69  lite3_free(pSubi
14ef0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
14f00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
14f10 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
14f20 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  .    pSubitem->p
14f30 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  Tab = 0;.    pSu
14f40 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
14f50 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 69 74   = 0;.    pSubit
14f60 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  em->zName = 0;. 
14f70 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c     pSubitem->zAl
14f80 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ias = 0;.    if(
14f90 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20   nSubSrc>1 ){.  
14fa0 20 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d 20      int extra = 
14fb0 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20 20  nSubSrc - 1;.   
14fc0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53     for(i=1; i<nS
14fd0 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
14fe0 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69       pSrc = sqli
14ff0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
15000 28 64 62 2c 20 70 53 72 63 2c 20 30 2c 20 30 29  (db, pSrc, 0, 0)
15010 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
15020 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc==0 ){.       
15030 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a     p->pSrc = 0;.
15040 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
15050 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
15060 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
15070 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
15080 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
15090 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69  rc-1; i-extra>=i
150a0 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  From; i--){.    
150b0 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d      pSrc->a[i] =
150c0 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61   pSrc->a[i-extra
150d0 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
150e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
150f0 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
15100 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69       pSrc->a[i+i
15110 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d  From] = pSubSrc-
15120 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  >a[i];.      mem
15130 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
15140 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
15150 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
15160 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
15170 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65  [iFrom].jointype
15180 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d   = jointype;.  }
15190 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e  ..  /* Now begin
151a0 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75   substituting su
151b0 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65  bquery result se
151c0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  t expressions fo
151d0 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  r .  ** referenc
151e0 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
151f0 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
15200 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a  uery..  ** .  **
15210 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
15220 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
15230 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
15240 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
15250 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
15260 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a   WHERE a>b;.  **
15270 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
15280 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
15290 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
152a0 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
152b0 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20        /.  **    
152c0 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
152d0 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
152e0 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
152f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15300 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  _/.  **.  ** We 
15310 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
15320 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
15330 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
15340 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
15350 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65 20 73  ee.  ** "a" we s
15360 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20  ubstitute "x*3" 
15370 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
15380 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75  we see "b" we su
15390 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e  bstitute "y+10".
153a0 0a 20 20 2a 2f 0a 20 20 70 4c 69 73 74 20 3d 20  .  */.  pList = 
153b0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72  p->pEList;.  for
153c0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
153d0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
153e0 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20  Expr *pExpr;.   
153f0 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
15400 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45  .zName==0 && (pE
15410 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
15420 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a  ].pExpr)->span.z
15430 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69  !=0 ){.      pLi
15440 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
15450 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73   .             s
15460 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
15470 64 62 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72  db, (char*)pExpr
15480 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d  ->span.z, pExpr-
15490 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a  >span.n);.    }.
154a0 20 20 7d 0a 20 20 73 75 62 73 74 45 78 70 72 4c    }.  substExprL
154b0 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ist(db, p->pELis
154c0 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  t, iParent, pSub
154d0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 69 66 28  ->pEList);.  if(
154e0 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75   isAgg ){.    su
154f0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
15500 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61  p->pGroupBy, iPa
15510 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
15520 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
15530 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  pr(db, p->pHavin
15540 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
15550 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  ->pEList);.  }. 
15560 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
15570 72 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  rBy ){.    asser
15580 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
15590 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  0 );.    p->pOrd
155a0 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
155b0 64 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d  derBy;.    pSub-
155c0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
155d0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f   }else if( p->pO
155e0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 75  rderBy ){.    su
155f0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
15600 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61  p->pOrderBy, iPa
15610 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
15620 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  st);.  }.  if( p
15630 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  Sub->pWhere ){. 
15640 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69     pWhere = sqli
15650 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
15660 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  Sub->pWhere);.  
15670 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65 72  }else{.    pWher
15680 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
15690 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
156a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
156b0 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20  >pHaving==0 );. 
156c0 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
156d0 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70  p->pWhere;.    p
156e0 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
156f0 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e;.    substExpr
15700 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
15710 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
15720 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
15730 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
15740 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 2d 3e  3ExprAnd(db, p->
15750 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20  pHaving, .      
15760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15770 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15780 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75  3ExprDup(db, pSu
15790 62 2d 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20 20  b->pHaving));.  
157a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
157b0 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
157c0 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
157d0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
157e0 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75  (db, pSub->pGrou
157f0 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pBy);.  }else{. 
15800 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
15810 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72   p->pWhere, iPar
15820 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
15830 74 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72  t);.    p->pWher
15840 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
15850 6e 64 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  nd(db, p->pWhere
15860 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 7d 0a 0a  , pWhere);.  }..
15870 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e    /* The flatten
15880 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74  ed query is dist
15890 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74  inct if either t
158a0 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a  he inner or the.
158b0 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
158c0 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
158d0 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74 69   */.  p->isDisti
158e0 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
158f0 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44  nct || pSub->isD
15900 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 0a 20  istinct;..  /*. 
15910 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46   ** SELECT ... F
15920 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
15930 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62  LIMIT a OFFSET b
15940 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54  ) LIMIT x OFFSET
15950 20 79 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e   y;.  **.  ** On
15960 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20  e is tempted to 
15970 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64  try to add a and
15980 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68   b to combine th
15990 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74  e limits.  But t
159a0 68 69 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  his.  ** does no
159b0 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72  t work if either
159c0 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69   limit is negati
159d0 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ve..  */.  if( p
159e0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
159f0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
15a00 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
15a10 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSub->pLimit = 
15a20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e  0;.  }..  /* Fin
15a30 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68  ially, delete wh
15a40 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68  at is left of th
15a50 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72  e subquery and r
15a60 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65  eturn.  ** succe
15a70 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
15a80 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
15a90 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  Sub);.  return 1
15aa0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
15ab0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
15ac0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  /../*.** Analyze
15ad0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
15ae0 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
15af0 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  an argument to s
15b00 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61  ee if it.** is a
15b10 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
15b20 71 75 65 72 79 2e 20 52 65 74 75 72 6e 20 4f 52  query. Return OR
15b30 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 4f 52 44  DERBY_MIN or ORD
15b40 45 52 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20  ERBY_MAX if .** 
15b50 69 74 20 69 73 2c 20 6f 72 20 30 20 6f 74 68 65  it is, or 0 othe
15b60 72 77 69 73 65 2e 20 41 74 20 70 72 65 73 65 6e  rwise. At presen
15b70 74 2c 20 61 20 71 75 65 72 79 20 69 73 20 63 6f  t, a query is co
15b80 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 0a 2a  nsidered to be.*
15b90 2a 20 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20  * a min()/max() 
15ba0 71 75 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  query if:.**.** 
15bb0 20 20 31 2e 20 54 68 65 72 65 20 69 73 20 61 20    1. There is a 
15bc0 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e  single object in
15bd0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
15be0 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65  ..**.**   2. The
15bf0 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 65  re is a single e
15c00 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
15c10 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64   result set, and
15c20 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 65   it is.**      e
15c30 69 74 68 65 72 20 6d 69 6e 28 78 29 20 6f 72 20  ither min(x) or 
15c40 6d 61 78 28 78 29 2c 20 77 68 65 72 65 20 78 20  max(x), where x 
15c50 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65  is a column refe
15c60 72 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rence..*/.static
15c70 20 69 6e 74 20 6d 69 6e 4d 61 78 51 75 65 72 79   int minMaxQuery
15c80 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15c90 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 45 78  Select *p){.  Ex
15ca0 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70  pr *pExpr;.  Exp
15cb0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
15cc0 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66  p->pEList;..  if
15cd0 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
15ce0 3d 31 20 29 20 72 65 74 75 72 6e 20 4f 52 44 45  =1 ) return ORDE
15cf0 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45  RBY_NORMAL;.  pE
15d00 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  xpr = pEList->a[
15d10 30 5d 2e 70 45 78 70 72 3b 0a 20 20 70 45 4c 69  0].pExpr;.  pELi
15d20 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
15d30 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  t;.  if( pExpr->
15d40 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
15d50 49 4f 4e 20 7c 7c 20 70 45 4c 69 73 74 3d 3d 30  ION || pEList==0
15d60 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   || pEList->nExp
15d70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
15d80 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61  .  if( pEList->a
15d90 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54  [0].pExpr->op!=T
15da0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 20 72  K_AGG_COLUMN ) r
15db0 65 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4e 4f  eturn ORDERBY_NO
15dc0 52 4d 41 4c 3b 0a 20 20 69 66 28 20 70 45 78 70  RMAL;.  if( pExp
15dd0 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20  r->token.n!=3 ) 
15de0 72 65 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4e  return ORDERBY_N
15df0 4f 52 4d 41 4c 3b 0a 20 20 69 66 28 20 73 71 6c  ORMAL;.  if( sql
15e00 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
15e10 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
15e20 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29  .z,"min",3)==0 )
15e30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4f 52 44  {.    return ORD
15e40 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73  ERBY_MIN;.  }els
15e50 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
15e60 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78  NICmp((char*)pEx
15e70 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78  pr->token.z,"max
15e80 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ",3)==0 ){.    r
15e90 65 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4d 41  eturn ORDERBY_MA
15ea0 58 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  X;.  }.  return 
15eb0 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
15ec0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
15ed0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
15ee0 65 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e 20  ement passed in 
15ef0 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74  as an argument t
15f00 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69  o see if it.** i
15f10 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29  s a simple min()
15f20 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e   or max() query.
15f30 20 20 49 66 20 69 74 20 69 73 20 61 6e 64 20 74    If it is and t
15f40 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65  his query can be
15f50 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75 73  .** satisfied us
15f60 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65 65  ing a single see
15f70 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
15f80 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20  ng or end of an 
15f90 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67  index,.** then g
15fa0 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
15fb0 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
15fc0 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20   and return 1.  
15fd0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  If this is not a
15fe0 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28   .** simple min(
15ff0 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
16000 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 3b  , then return 0;
16010 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20  .**.** A simply 
16020 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
16030 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  uery looks like 
16040 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
16050 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52 4f  ELECT min(a) FRO
16060 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53  M table;.**    S
16070 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f  ELECT max(a) FRO
16080 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54  M table;.**.** T
16090 68 65 20 71 75 65 72 79 20 6d 61 79 20 68 61 76  he query may hav
160a0 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
160b0 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52 4f  table in its FRO
160c0 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65  M argument.  The
160d0 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20  re.** can be no 
160e0 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49  GROUP BY or HAVI
160f0 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61 75  NG or WHERE clau
16100 73 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ses.  The result
16110 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20   set must.** be 
16120 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
16130 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63  () of a single c
16140 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
16150 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a  le.  The column.
16160 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29 20  ** in the min() 
16170 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
16180 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78 65  n must be indexe
16190 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  d..**.** The par
161a0 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73 20  ameters to this 
161b0 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65 20  routine are the 
161c0 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c 69  same as for sqli
161d0 74 65 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20  te3Select()..** 
161e0 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  See the header c
161f0 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72  omment on that r
16200 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
16210 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
16220 6e 2e 0a 2a 2f 0a 23 69 66 20 30 0a 73 74 61 74  n..*/.#if 0.stat
16230 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e  ic int simpleMin
16240 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20 2a  MaxQuery(Parse *
16250 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
16260 70 2c 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  p, SelectDest *p
16270 44 65 73 74 29 7b 0a 20 20 45 78 70 72 20 2a 70  Dest){.  Expr *p
16280 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  Expr;.  int iCol
16290 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
162a0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
162b0 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64    int base;.  Vd
162c0 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65  be *v;.  int see
162d0 6b 4f 70 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  kOp;.  ExprList 
162e0 2a 70 45 4c 69 73 74 2c 20 2a 70 4c 69 73 74 2c  *pEList, *pList,
162f0 20 65 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74   eList;.  struct
16300 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 65   ExprList_item e
16310 4c 69 73 74 49 74 65 6d 3b 0a 20 20 53 72 63 4c  ListItem;.  SrcL
16320 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74  ist *pSrc;.  int
16330 20 62 72 6b 3b 0a 20 20 69 6e 74 20 69 44 62 3b   brk;.  int iDb;
16340 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
16350 73 65 65 20 69 66 20 74 68 69 73 20 71 75 65 72  see if this quer
16360 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69  y is a simple mi
16370 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
16380 72 79 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a 2a  ry.  Return.  **
16390 20 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20 20   zero if it is  
163a0 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  not..  */.  if( 
163b0 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20 70  p->pGroupBy || p
163c0 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d 3e  ->pHaving || p->
163d0 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
163e0 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  0;.  pSrc = p->p
163f0 53 72 63 3b 0a 20 20 69 66 28 20 70 53 72 63 2d  Src;.  if( pSrc-
16400 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
16410 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  n 0;.  pEList = 
16420 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
16430 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
16440 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
16450 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  pExpr = pEList->
16460 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
16470 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
16480 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
16490 65 74 75 72 6e 20 30 3b 0a 20 20 70 4c 69 73 74  eturn 0;.  pList
164a0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
164b0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
164c0 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  || pList->nExpr!
164d0 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
164e0 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
164f0 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e 20  n.n!=3 ) return 
16500 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
16510 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
16520 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
16530 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  min",3)==0 ){.  
16540 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65    seekOp = OP_Re
16550 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66  wind;.  }else if
16560 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
16570 70 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  p((char*)pExpr->
16580 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29  token.z,"max",3)
16590 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f  ==0 ){.    seekO
165a0 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d  p = OP_Last;.  }
165b0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
165c0 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 20   0;.  }.  pExpr 
165d0 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  = pList->a[0].pE
165e0 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  xpr;.  if( pExpr
165f0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
16600 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43  ) return 0;.  iC
16610 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
16620 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70 53  umn;.  pTab = pS
16630 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  rc->a[0].pTab;..
16640 20 20 2f 2a 20 54 68 69 73 20 6f 70 74 69 6d 69    /* This optimi
16650 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  zation cannot be
16660 20 75 73 65 64 20 77 69 74 68 20 76 69 72 74 75   used with virtu
16670 61 6c 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20  al tables. */.  
16680 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
16690 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
166a0 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
166b0 74 6f 20 68 65 72 65 2c 20 69 74 20 6d 65 61 6e  to here, it mean
166c0 73 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f  s the query is o
166d0 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 6f  f the correct fo
166e0 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74  rm..  ** Check t
166f0 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20 68  o make sure we h
16700 61 76 65 20 61 6e 20 69 6e 64 65 78 20 61 6e 64  ave an index and
16710 20 6d 61 6b 65 20 70 49 64 78 20 70 6f 69 6e 74   make pIdx point
16720 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70 70   to the.  ** app
16730 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 2e 20  ropriate index. 
16740 20 49 66 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   If the min() or
16750 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 61 6e 20   max() is on an 
16760 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 0a  INTEGER PRIMARY.
16770 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c    ** key column,
16780 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e 65 63   no index is nec
16790 65 73 73 61 72 79 20 73 6f 20 73 65 74 20 70 49  essary so set pI
167a0 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20  dx to NULL.  If 
167b0 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20 69  no.  ** usable i
167c0 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2c 20 72  ndex is found, r
167d0 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20  eturn 0..  */.  
167e0 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
167f0 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65    pIdx = 0;.  }e
16800 6c 73 65 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  lse{.    CollSeq
16810 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
16820 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
16830 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
16840 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
16850 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f  return 0;.    fo
16860 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
16870 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
16880 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
16890 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
168a0 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a  ->nColumn>=1 );.
168b0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
168c0 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f  aiColumn[0]==iCo
168d0 6c 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  l && .          
168e0 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
168f0 70 28 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30  p(pIdx->azColl[0
16900 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  ], pColl->zName)
16910 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
16920 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
16930 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30  .    if( pIdx==0
16940 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
16950 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
16960 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20  column types if 
16970 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
16980 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20   the callback.  
16990 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69  This.  ** step i
169a0 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
169b0 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67   output is going
169c0 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61   to a table or a
169d0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20   memory cell..  
169e0 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ** The column na
169f0 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  mes have already
16a00 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20   been generated 
16a10 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  in the calling f
16a20 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
16a30 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
16a40 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
16a50 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
16a60 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  0;..  /* If the 
16a70 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
16a80 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
16a90 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
16aa0 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
16ab0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
16ac0 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
16ad0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
16ae0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16af0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
16b00 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 31 29 3b  Dest->iParm, 1);
16b10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
16b20 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69  ating code to fi
16b30 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68  nd the min or th
16b40 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c  e max.  Basicall
16b50 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20  y all we have.  
16b60 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64  ** to do is find
16b70 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 74 68   the first or th
16b80 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
16b90 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78  the chosen index
16ba0 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d  .  If.  ** the m
16bb0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73  in() or max() is
16bc0 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20   on the INTEGER 
16bd0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
16be0 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  n find the first
16bf0 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e  .  ** or last en
16c00 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  try in the main 
16c10 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 44  table..  */.  iD
16c20 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
16c30 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
16c40 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
16c50 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ma);.  assert( i
16c60 44 62 3e 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 69  Db>=0 || pTab->i
16c70 73 45 70 68 65 6d 20 29 3b 0a 20 20 73 71 6c 69  sEphem );.  sqli
16c80 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
16c90 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
16ca0 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  ;.  sqlite3Table
16cb0 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
16cc0 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
16cd0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
16ce0 20 62 61 73 65 20 3d 20 70 53 72 63 2d 3e 61 5b   base = pSrc->a[
16cf0 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 62 72  0].iCursor;.  br
16d00 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
16d10 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63  akeLabel(v);.  c
16d20 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
16d30 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
16d40 62 72 6b 29 3b 0a 20 20 69 66 28 20 70 53 72 63  brk);.  if( pSrc
16d50 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d  ->a[0].pSelect==
16d60 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
16d70 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
16d80 2c 20 62 61 73 65 2c 20 69 44 62 2c 20 70 54 61  , base, iDb, pTa
16d90 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
16da0 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 3d  .  }.  if( pIdx=
16db0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
16dc0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 73  3VdbeAddOp2(v, s
16dd0 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b  eekOp, base, 0);
16de0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
16df0 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   Even though the
16e00 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20   cursor used to 
16e10 6f 70 65 6e 20 74 68 65 20 69 6e 64 65 78 20 68  open the index h
16e20 65 72 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20  ere is closed.  
16e30 20 20 2a 2a 20 61 73 20 73 6f 6f 6e 20 61 73 20    ** as soon as 
16e40 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20 68  a single value h
16e50 61 73 20 62 65 65 6e 20 72 65 61 64 20 66 72 6f  as been read fro
16e60 6d 20 69 74 2c 20 61 6c 6c 6f 63 61 74 65 20 69  m it, allocate i
16e70 74 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 28  t.    ** using (
16e80 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 29 20  pParse->nTab++) 
16e90 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 63  to prevent the c
16ea0 75 72 73 6f 72 20 69 64 20 66 72 6f 6d 20 62 65  ursor id from be
16eb0 69 6e 67 20 0a 20 20 20 20 2a 2a 20 72 65 75 73  ing .    ** reus
16ec0 65 64 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f  ed. This is impo
16ed0 72 74 61 6e 74 20 66 6f 72 20 73 74 61 74 65 6d  rtant for statem
16ee0 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ents of the form
16ef0 20 0a 20 20 20 20 2a 2a 20 22 49 4e 53 45 52 54   .    ** "INSERT
16f00 20 49 4e 54 4f 20 78 20 53 45 4c 45 43 54 20 6d   INTO x SELECT m
16f10 61 78 28 29 20 46 52 4f 4d 20 78 22 2e 0a 20 20  ax() FROM x"..  
16f20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64    */.    int iId
16f30 78 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  x;.    KeyInfo *
16f40 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
16f50 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
16f60 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69 49  e, pIdx);.    iI
16f70 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
16f80 62 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b++;.    assert(
16f90 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
16fa0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
16fb0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16fc0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
16fd0 6e 52 65 61 64 2c 20 69 49 64 78 2c 20 70 49 64  nRead, iIdx, pId
16fe0 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20  x->tnum, iDb,.  
16ff0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
17000 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P4_KEYINFO_HA
17010 4e 44 4f 46 46 29 3b 0a 20 20 20 20 69 66 28 20  NDOFF);.    if( 
17020 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e  seekOp==OP_Rewin
17030 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
17040 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17050 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a  OP_Null, 0, 0);.
17060 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17070 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 61  eAddOp2(v, OP_Ma
17080 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b  keRecord, 1, 0);
17090 0a 20 20 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  .      seekOp = 
170a0 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20 20 7d  OP_MoveGt;.    }
170b0 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61  .    if( pIdx->a
170c0 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3d 3d 53 51  SortOrder[0]==SQ
170d0 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 29 7b 0a  LITE_SO_DESC ){.
170e0 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20        /* Ticket 
170f0 23 32 35 31 34 3a 20 69 6e 76 65 72 74 20 74 68  #2514: invert th
17100 65 20 73 65 65 6b 20 6f 70 65 72 61 74 6f 72 20  e seek operator 
17110 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 0a  if we are using.
17120 20 20 20 20 20 20 2a 2a 20 61 20 64 65 73 63 65        ** a desce
17130 6e 64 69 6e 67 20 69 6e 64 65 78 2e 20 2a 2f 0a  nding index. */.
17140 20 20 20 20 20 20 69 66 28 20 73 65 65 6b 4f 70        if( seekOp
17150 3d 3d 4f 50 5f 4c 61 73 74 20 29 7b 0a 20 20 20  ==OP_Last ){.   
17160 20 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50       seekOp = OP
17170 5f 52 65 77 69 6e 64 3b 0a 20 20 20 20 20 20 7d  _Rewind;.      }
17180 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
17190 73 65 72 74 28 20 73 65 65 6b 4f 70 3d 3d 4f 50  sert( seekOp==OP
171a0 5f 4d 6f 76 65 47 74 20 29 3b 0a 20 20 20 20 20  _MoveGt );.     
171b0 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d     seekOp = OP_M
171c0 6f 76 65 4c 74 3b 0a 20 20 20 20 20 20 7d 0a 20  oveLt;.      }. 
171d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
171e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 73 65  VdbeAddOp2(v, se
171f0 65 6b 4f 70 2c 20 69 49 64 78 2c 20 30 29 3b 0a  ekOp, iIdx, 0);.
17200 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17210 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52  ddOp2(v, OP_IdxR
17220 6f 77 69 64 2c 20 69 49 64 78 2c 20 30 29 3b 0a  owid, iIdx, 0);.
17230 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17240 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
17250 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20  e, iIdx, 0);.   
17260 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17270 70 32 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c  p2(v, OP_MoveGe,
17280 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20   base, 0);.  }. 
17290 20 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31   eList.nExpr = 1
172a0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73  ;.  memset(&eLis
172b0 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  tItem, 0, sizeof
172c0 28 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20  (eListItem));.  
172d0 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74  eList.a = &eList
172e0 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b  Item;.  eList.a[
172f0 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72  0].pExpr = pExpr
17300 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  ;.  selectInnerL
17310 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26  oop(pParse, p, &
17320 65 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  eList, 0, 0, 0, 
17330 2d 31 2c 20 70 44 65 73 74 2c 20 62 72 6b 2c 20  -1, pDest, brk, 
17340 62 72 6b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  brk, 0);.  sqlit
17350 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
17360 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 73 71  el(v, brk);.  sq
17370 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17380 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73  v, OP_Close, bas
17390 65 2c 20 30 29 3b 0a 20 20 0a 20 20 72 65 74 75  e, 0);.  .  retu
173a0 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 0a  rn 1;.}.#endif .
173b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
173c0 69 6e 65 20 72 65 73 6f 6c 76 65 73 20 61 6e 79  ine resolves any
173d0 20 6e 61 6d 65 73 20 75 73 65 64 20 69 6e 20 74   names used in t
173e0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
173f0 20 74 68 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64   the.** supplied
17400 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
17410 74 2e 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  t. If the SELECT
17420 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
17430 20 72 65 73 6f 6c 76 65 64 0a 2a 2a 20 69 73 20   resolved.** is 
17440 61 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 74 68  a sub-select, th
17450 65 6e 20 70 4f 75 74 65 72 4e 43 20 69 73 20 61  en pOuterNC is a
17460 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
17470 4e 61 6d 65 43 6f 6e 74 65 78 74 20 0a 2a 2a 20  NameContext .** 
17480 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 53 45  of the parent SE
17490 4c 45 43 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  LECT..*/.int sql
174a0 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
174b0 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
174c0 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
174d0 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
174e0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
174f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
17500 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
17510 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
17520 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  d. */.  NameCont
17530 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f  ext *pOuterNC  /
17540 2a 20 54 68 65 20 6f 75 74 65 72 20 6e 61 6d 65  * The outer name
17550 20 63 6f 6e 74 65 78 74 2e 20 4d 61 79 20 62 65   context. May be
17560 20 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45   NULL. */.){.  E
17570 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
17580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
17590 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e  ult set. */.  in
175a0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
175b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 2d           /* For-
175c0 6c 6f 6f 70 20 76 61 72 69 61 62 6c 65 20 75 73  loop variable us
175d0 65 64 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70  ed in multiple p
175e0 6c 61 63 65 73 20 2a 2f 0a 20 20 4e 61 6d 65 43  laces */.  NameC
175f0 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20  ontext sNC;     
17600 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e        /* Local n
17610 61 6d 65 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ame-context */. 
17620 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
17630 70 42 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBy;        /* T
17640 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
17650 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  se */..  /* If t
17660 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
17670 72 75 6e 20 62 65 66 6f 72 65 2c 20 72 65 74 75  run before, retu
17680 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  rn immediately. 
17690 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65  */.  if( p->isRe
176a0 73 6f 6c 76 65 64 20 29 7b 0a 20 20 20 20 61 73  solved ){.    as
176b0 73 65 72 74 28 20 21 70 4f 75 74 65 72 4e 43 20  sert( !pOuterNC 
176c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
176d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
176e0 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 3d 20 31  ->isResolved = 1
176f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
17700 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
17710 65 6e 20 65 72 72 6f 72 73 2c 20 64 6f 20 6e 6f  en errors, do no
17720 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20  thing. */.  if( 
17730 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
17740 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17750 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
17760 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65    /* Prepare the
17770 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
17780 74 2e 20 54 68 69 73 20 63 61 6c 6c 20 77 69 6c  t. This call wil
17790 6c 20 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 63  l allocate all c
177a0 75 72 73 6f 72 73 0a 20 20 2a 2a 20 72 65 71 75  ursors.  ** requ
177b0 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74  ired to handle t
177c0 68 65 20 74 61 62 6c 65 73 20 61 6e 64 20 73 75  he tables and su
177d0 62 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  bqueries in the 
177e0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
177f0 2f 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65  /.  if( prepSele
17800 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70  ctStmt(pParse, p
17810 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
17820 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
17830 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  }..  /* Resolve 
17840 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
17850 69 6e 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  in the LIMIT and
17860 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
17870 20 54 68 65 73 65 0a 20 20 2a 2a 20 61 72 65 20   These.  ** are 
17880 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72  not allowed to r
17890 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 61 6d 65  efer to any name
178a0 73 2c 20 73 6f 20 70 61 73 73 20 61 6e 20 65 6d  s, so pass an em
178b0 70 74 79 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e  pty NameContext.
178c0 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
178d0 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
178e0 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61 72  NC));.  sNC.pPar
178f0 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69  se = pParse;.  i
17900 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
17910 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
17920 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a 20   p->pLimit) ||. 
17930 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17940 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
17950 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 20 29  C, p->pOffset) )
17960 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17970 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
17980 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
17990 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65  local name-conte
179a0 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20 45 78  xt to pass to Ex
179b0 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29  prResolveNames()
179c0 20 74 6f 0a 20 20 2a 2a 20 72 65 73 6f 6c 76 65   to.  ** resolve
179d0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2d   the expression-
179e0 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43  list..  */.  sNC
179f0 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20  .allowAgg = 1;. 
17a00 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
17a10 70 2d 3e 70 53 72 63 3b 0a 20 20 73 4e 43 2e 70  p->pSrc;.  sNC.p
17a20 4e 65 78 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b  Next = pOuterNC;
17a30 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e  ..  /* Resolve n
17a40 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65 73 75  ames in the resu
17a50 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 70 45 4c  lt set. */.  pEL
17a60 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
17a70 0a 20 20 69 66 28 20 21 70 45 4c 69 73 74 20 29  .  if( !pEList )
17a80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
17a90 52 52 4f 52 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  RROR;.  for(i=0;
17aa0 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
17ab0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
17ac0 20 2a 70 58 20 3d 20 70 45 4c 69 73 74 2d 3e 61   *pX = pEList->a
17ad0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
17ae0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
17af0 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
17b00 20 70 58 29 20 29 7b 0a 20 20 20 20 20 20 72 65   pX) ){.      re
17b10 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
17b20 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  R;.    }.  }..  
17b30 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
17b40 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  no aggregate fun
17b50 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 72 65  ctions in the re
17b60 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e 6f  sult-set, and no
17b70 20 47 52 4f 55 50 20 42 59 20 0a 20 20 2a 2a 20   GROUP BY .  ** 
17b80 65 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e  expression, do n
17b90 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72 65 67 61  ot allow aggrega
17ba0 74 65 73 20 69 6e 20 61 6e 79 20 6f 66 20 74 68  tes in any of th
17bb0 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
17bc0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ons..  */.  asse
17bd0 72 74 28 20 21 70 2d 3e 69 73 41 67 67 20 29 3b  rt( !p->isAgg );
17be0 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
17bf0 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 69 66 28  >pGroupBy;.  if(
17c00 20 70 47 72 6f 75 70 42 79 20 7c 7c 20 73 4e 43   pGroupBy || sNC
17c10 2e 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70  .hasAgg ){.    p
17c20 2d 3e 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d  ->isAgg = 1;.  }
17c30 65 6c 73 65 7b 0a 20 20 20 20 73 4e 43 2e 61 6c  else{.    sNC.al
17c40 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a  lowAgg = 0;.  }.
17c50 0a 20 20 2f 2a 20 49 66 20 61 20 48 41 56 49 4e  .  /* If a HAVIN
17c60 47 20 63 6c 61 75 73 65 20 69 73 20 70 72 65 73  G clause is pres
17c70 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ent, then there 
17c80 6d 75 73 74 20 62 65 20 61 20 47 52 4f 55 50 20  must be a GROUP 
17c90 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  BY clause..  */.
17ca0 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
17cb0 20 26 26 20 21 70 47 72 6f 75 70 42 79 20 29 7b   && !pGroupBy ){
17cc0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
17cd0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
17ce0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
17cf0 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  is required befo
17d00 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20  re HAVING");.   
17d10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
17d20 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
17d30 41 64 64 20 74 68 65 20 65 78 70 72 65 73 73 69  Add the expressi
17d40 6f 6e 20 6c 69 73 74 20 74 6f 20 74 68 65 20 6e  on list to the n
17d50 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f  ame-context befo
17d60 72 65 20 70 61 72 73 69 6e 67 20 74 68 65 0a 20  re parsing the. 
17d70 20 2a 2a 20 6f 74 68 65 72 20 65 78 70 72 65 73   ** other expres
17d80 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 53 45 4c  sions in the SEL
17d90 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ECT statement. T
17da0 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a 20  his is so that. 
17db0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20   ** expressions 
17dc0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
17dd0 75 73 65 20 28 65 74 63 2e 29 20 63 61 6e 20 72  use (etc.) can r
17de0 65 66 65 72 20 74 6f 20 65 78 70 72 65 73 73 69  efer to expressi
17df0 6f 6e 73 20 62 79 0a 20 20 2a 2a 20 61 6c 69 61  ons by.  ** alia
17e00 73 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ses in the resul
17e10 74 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  t set..  **.  **
17e20 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66   Minor point: If
17e30 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
17e40 65 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  e, then the expr
17e50 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20  ession will be. 
17e60 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74 65 64   ** re-evaluated
17e70 20 66 6f 72 20 65 61 63 68 20 72 65 66 65 72 65   for each refere
17e80 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a  nce to it..  */.
17e90 20 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70    sNC.pEList = p
17ea0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
17eb0 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
17ec0 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d  veNames(&sNC, p-
17ed0 3e 70 57 68 65 72 65 29 20 7c 7c 0a 20 20 20 20  >pWhere) ||.    
17ee0 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
17ef0 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
17f00 2d 3e 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  ->pHaving) ){.  
17f10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17f20 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
17f30 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b   p->pPrior==0 ){
17f40 0a 20 20 20 20 69 66 28 20 70 72 6f 63 65 73 73  .    if( process
17f50 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
17f60 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
17f70 72 42 79 2c 20 31 2c 20 26 73 4e 43 2e 68 61 73  rBy, 1, &sNC.has
17f80 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 72 65  Agg) ){.      re
17f90 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
17fa0 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  R;.    }.  }.  i
17fb0 66 28 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47  f( processOrderG
17fc0 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
17fd0 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 26  , pGroupBy, 0, &
17fe0 73 4e 43 2e 68 61 73 41 67 67 29 20 29 7b 0a 20  sNC.hasAgg) ){. 
17ff0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18000 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
18010 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
18020 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
18030 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18040 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
18050 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
18060 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
18070 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
18080 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
18090 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
180a0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
180b0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
180c0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
180d0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
180e0 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b  tem=pGroupBy->a;
180f0 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
18100 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
18110 29 7b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  ){.      if( Exp
18120 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 49 74  rHasProperty(pIt
18130 65 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 41 67  em->pExpr, EP_Ag
18140 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  g) ){.        sq
18150 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18160 61 72 73 65 2c 20 22 61 67 67 72 65 67 61 74 65  arse, "aggregate
18170 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e   functions are n
18180 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a  ot allowed in ".
18190 20 20 20 20 20 20 20 20 20 20 20 20 22 74 68 65              "the
181a0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
181b0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
181c0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
181d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
181e0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
181f0 20 69 73 20 6f 6e 65 20 53 45 4c 45 43 54 20 6f   is one SELECT o
18200 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2c 20 62 65  f a compound, be
18210 20 73 75 72 65 20 74 6f 20 72 65 73 6f 6c 76 65   sure to resolve
18220 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 69 6e 20 74   names.  ** in t
18230 68 65 20 6f 74 68 65 72 20 53 45 4c 45 43 54 73  he other SELECTs
18240 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
18250 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65  pPrior ){.    re
18260 74 75 72 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  turn sqlite3Sele
18270 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
18280 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 75  , p->pPrior, pOu
18290 74 65 72 4e 43 29 3b 0a 20 20 7d 65 6c 73 65 7b  terNC);.  }else{
182a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
182b0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
182c0 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67  .** Reset the ag
182d0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
182e0 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  tor..**.** The a
182f0 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
18300 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66  ator is a set of
18310 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68   memory cells th
18320 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72  at hold.** inter
18330 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20  mediate results 
18340 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e  while calculatin
18350 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  g an aggregate. 
18360 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
18370 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73 20 4e   simply stores N
18380 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74  ULLs in all of t
18390 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  hose memory cell
183a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
183b0 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74  d resetAccumulat
183c0 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
183d0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
183e0 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
183f0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
18400 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
18410 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
18420 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20 70 41  *pFunc;.  if( pA
18430 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41  ggInfo->nFunc+pA
18440 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d  ggInfo->nColumn=
18450 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
18460 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
18470 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   i<pAggInfo->nCo
18480 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
18490 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
184a0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
184b0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
184c0 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  i].iMem);.  }.  
184d0 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e  for(pFunc=pAggIn
184e0 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20  fo->aFunc, i=0; 
184f0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
18500 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29  c; i++, pFunc++)
18510 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
18520 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
18530 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69 4d  ll, 0, pFunc->iM
18540 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75  em);.    if( pFu
18550 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  nc->iDistinct>=0
18560 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
18570 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70  pE = pFunc->pExp
18580 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  r;.      if( pE-
18590 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  >pList==0 || pE-
185a0 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  >pList->nExpr!=1
185b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
185c0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
185d0 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 69 6e  se, "DISTINCT in
185e0 20 61 67 67 72 65 67 61 74 65 20 6d 75 73 74 20   aggregate must 
185f0 62 65 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20 20  be followed ".  
18600 20 20 20 20 20 20 20 20 20 22 62 79 20 61 6e 20           "by an 
18610 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20  expression");.  
18620 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69        pFunc->iDi
18630 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
18640 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18650 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
18660 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
18670 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
18680 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  , pE->pList);.  
18690 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
186a0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
186b0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75  enEphemeral, pFu
186c0 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30  nc->iDistinct, 0
186d0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
186e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
186f0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
18700 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
18710 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FF);.      }.   
18720 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
18730 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67  Invoke the OP_Ag
18740 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65  gFinalize opcode
18750 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65   for every aggre
18760 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
18770 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   in the AggInfo 
18780 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
18790 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69  atic void finali
187a0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50  zeAggFunctions(P
187b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
187c0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
187d0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
187e0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
187f0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
18800 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
18810 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
18820 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
18830 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
18840 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
18850 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
18860 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
18870 70 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74  pList;.    sqlit
18880 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
18890 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d  OP_AggFinal, pF-
188a0 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70  >iMem, pList ? p
188b0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
188c0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
188d0 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
188e0 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  )pF->pFunc, P4_F
188f0 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a  UNCDEF);.  }.}..
18900 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
18910 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d   accumulator mem
18920 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e  ory cells for an
18930 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64   aggregate based
18940 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65   on.** the curre
18950 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
18960 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
18970 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c  id updateAccumul
18980 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
18990 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
189a0 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
189b0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
189c0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
189d0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
189e0 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20  c *pF;.  struct 
189f0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b  AggInfo_col *pC;
18a00 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  ..  pAggInfo->di
18a10 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
18a20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
18a30 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
18a40 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
18a50 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
18a60 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e  int nArg;.    in
18a70 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a  t addrNext = 0;.
18a80 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
18a90 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
18aa0 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  >pList;.    if( 
18ab0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
18ac0 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Arg = pList->nEx
18ad0 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
18ae0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
18af0 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  t(pParse, pList,
18b00 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
18b10 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a        nArg = 0;.
18b20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
18b30 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
18b40 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  {.      addrNext
18b50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
18b60 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
18b70 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
18b80 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44  1 );.      codeD
18b90 69 73 74 69 6e 63 74 5f 4f 4c 44 28 76 2c 20 70  istinct_OLD(v, p
18ba0 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64  F->iDistinct, ad
18bb0 64 72 4e 65 78 74 2c 20 31 29 3b 0a 20 20 20 20  drNext, 1);.    
18bc0 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46  }.    if( pF->pF
18bd0 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71  unc->needCollSeq
18be0 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
18bf0 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
18c00 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
18c10 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
18c20 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
18c30 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
18c40 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73  t!=0 );  /* pLis
18c50 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e  t!=0 if pF->pFun
18c60 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 69  c->needCollSeq i
18c70 73 20 74 72 75 65 20 2a 2f 0a 20 20 20 20 20 20  s true */.      
18c80 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
18c90 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20  List->a; !pColl 
18ca0 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20  && j<nArg; j++, 
18cb0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
18cc0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
18cd0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
18ce0 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
18cf0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
18d00 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
18d10 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
18d20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
18d30 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
18d40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18d50 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
18d60 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28  lSeq, 0, 0, 0, (
18d70 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
18d80 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
18d90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18da0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
18db0 53 74 65 70 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20  Step, pF->iMem, 
18dc0 6e 41 72 67 2c 20 30 2c 20 0a 20 20 20 20 20 20  nArg, 0, .      
18dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18de0 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
18df0 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
18e00 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20     if( addrNext 
18e10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18e20 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18e30 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20  (v, addrNext);. 
18e40 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
18e50 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d  =0, pC=pAggInfo-
18e60 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66  >aCol; i<pAggInf
18e70 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b  o->nAccumulator;
18e80 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20   i++, pC++){.   
18e90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18ea0 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78  (pParse, pC->pEx
18eb0 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20  pr, pC->iMem);. 
18ec0 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64   }.  pAggInfo->d
18ed0 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d  irectMode = 0;.}
18ee0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
18ef0 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 2f 2a  _OMIT_TRIGGER./*
18f00 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
18f10 6e 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 61  n is used when a
18f20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
18f30 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 72 65  t is used to cre
18f40 61 74 65 20 61 0a 2a 2a 20 74 65 6d 70 6f 72 61  ate a.** tempora
18f50 72 79 20 74 61 62 6c 65 20 66 6f 72 20 69 74 65  ry table for ite
18f60 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 77  rating through w
18f70 68 65 6e 20 72 75 6e 6e 69 6e 67 20 61 6e 20 49  hen running an I
18f80 4e 53 54 45 41 44 20 4f 46 0a 2a 2a 20 55 50 44  NSTEAD OF.** UPD
18f90 41 54 45 20 6f 72 20 49 4e 53 54 45 41 44 20 4f  ATE or INSTEAD O
18fa0 46 20 44 45 4c 45 54 45 20 74 72 69 67 67 65 72  F DELETE trigger
18fb0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6f 73 73  . .**.** If poss
18fc0 69 62 6c 65 2c 20 74 68 65 20 53 45 4c 45 43 54  ible, the SELECT
18fd0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6d 6f   statement is mo
18fe0 64 69 66 69 65 64 20 73 6f 20 74 68 61 74 20 4e  dified so that N
18ff0 55 4c 4c 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72  ULL values.** ar
19000 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
19010 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
19020 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  for all columns 
19030 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 0a 2a  for which the .*
19040 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
19050 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20  bit in argument 
19060 6d 61 73 6b 20 69 73 20 6e 6f 74 20 73 65 74 2e  mask is not set.
19070 20 49 66 20 6d 61 73 6b 20 74 61 6b 65 73 20 74   If mask takes t
19080 68 65 0a 2a 2a 20 73 70 65 63 69 61 6c 20 76 61  he.** special va
19090 6c 75 65 20 30 78 66 66 66 66 66 66 66 66 2c 20  lue 0xffffffff, 
190a0 74 68 65 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  then all columns
190b0 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 2e 0a   are populated..
190c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
190d0 6c 65 63 74 4d 61 73 6b 28 50 61 72 73 65 20 2a  lectMask(Parse *
190e0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
190f0 70 2c 20 75 33 32 20 6d 61 73 6b 29 7b 0a 20 20  p, u32 mask){.  
19100 69 66 28 20 21 70 2d 3e 70 50 72 69 6f 72 20 26  if( !p->pPrior &
19110 26 20 21 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  & !p->isDistinct
19120 20 26 26 20 6d 61 73 6b 21 3d 30 78 66 66 66 66   && mask!=0xffff
19130 66 66 66 66 20 29 7b 0a 20 20 20 20 45 78 70 72  ffff ){.    Expr
19140 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
19150 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28    int i;.    if(
19160 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
19170 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2c  solve(pParse, p,
19180 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   0) ){.      ret
19190 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
191a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 4c 69  ;.    }.    pELi
191b0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
191c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
191d0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 26 20  EList->nExpr && 
191e0 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<32; i++){.    
191f0 20 20 69 66 28 20 21 28 6d 61 73 6b 26 28 28 75    if( !(mask&((u
19200 33 32 29 31 3c 3c 69 29 29 20 29 7b 0a 20 20 20  32)1<<i)) ){.   
19210 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
19220 44 65 6c 65 74 65 28 70 45 4c 69 73 74 2d 3e 61  Delete(pEList->a
19230 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
19240 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d      pEList->a[i]
19250 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
19260 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c  Expr(pParse->db,
19270 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20   TK_NULL, 0, 0, 
19280 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
19290 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
192a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
192b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
192c0 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
192d0 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61  given SELECT sta
192e0 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
192f0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
19300 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72  stributed in var
19310 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64  ious ways depend
19320 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f  ing on the.** co
19330 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 53 65  ntents of the Se
19340 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
19350 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
19360 20 61 72 67 75 6d 65 6e 74 20 70 44 65 73 74 0a   argument pDest.
19370 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ** as follows:.*
19380 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73 74 2d 3e  *.**     pDest->
19390 65 44 65 73 74 20 20 20 20 52 65 73 75 6c 74 0a  eDest    Result.
193a0 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  **     ---------
193b0 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
193c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
193d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
193e0 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 61  --.**     SRT_Ca
193f0 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65  llback    Invoke
19400 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f   the callback fo
19410 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68  r each row of th
19420 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
19430 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20      SRT_Mem     
19440 20 20 20 20 53 74 6f 72 65 20 66 69 72 73 74 20      Store first 
19450 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79  result in memory
19460 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61   cell pDest->iPa
19470 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  rm.**.**     SRT
19480 5f 53 65 74 20 20 20 20 20 20 20 20 20 53 74 6f  _Set         Sto
19490 72 65 20 6e 6f 6e 2d 6e 75 6c 6c 20 72 65 73 75  re non-null resu
194a0 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66 20 74  lts as keys of t
194b0 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72  able pDest->iPar
194c0 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  m. .**          
194d0 20 20 20 20 20 20 20 20 20 20 20 41 70 70 6c 79             Apply
194e0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 70 44   the affinity pD
194f0 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 20 62 65  est->affinity be
19500 66 6f 72 65 20 73 74 6f 72 69 6e 67 20 74 68 65  fore storing the
19510 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
19520 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f  _Union       Sto
19530 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20  re results as a 
19540 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61  key in a tempora
19550 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
19560 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
19570 20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20   SRT_Except     
19580 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20   Remove results 
19590 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61  from the tempora
195a0 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
195b0 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
195c0 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20   SRT_Table      
195d0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
195e0 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
195f0 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 0a 2a  e pDest->iParm.*
19600 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 70 68  *.**     SRT_Eph
19610 65 6d 54 61 62 20 20 20 20 43 72 65 61 74 65 20  emTab    Create 
19620 61 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  an temporary tab
19630 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20  le pDest->iParm 
19640 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 20 20 20  and store.**    
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19660 20 74 68 65 20 72 65 73 75 6c 74 20 74 68 65 72   the result ther
19670 65 2e 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  e. The cursor is
19680 20 6c 65 66 74 20 6f 70 65 6e 20 61 66 74 65 72   left open after
19690 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
196a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 69 6e          returnin
196b0 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  g..**.**     SRT
196c0 5f 53 75 62 72 6f 75 74 69 6e 65 20 20 46 6f 72  _Subroutine  For
196d0 20 65 61 63 68 20 72 6f 77 20 72 65 74 75 72 6e   each row return
196e0 65 64 2c 20 70 75 73 68 20 74 68 65 20 72 65 73  ed, push the res
196f0 75 6c 74 73 20 6f 6e 74 6f 20 74 68 65 0a 2a 2a  ults onto the.**
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19710 20 20 20 20 20 76 64 62 65 20 73 74 61 63 6b 20       vdbe stack 
19720 61 6e 64 20 63 61 6c 6c 20 74 68 65 20 73 75 62  and call the sub
19730 72 6f 75 74 69 6e 65 20 28 76 69 61 20 4f 50 5f  routine (via OP_
19740 47 6f 73 75 62 29 0a 2a 2a 20 20 20 20 20 20 20  Gosub).**       
19750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
19760 20 61 64 64 72 65 73 73 20 70 44 65 73 74 2d 3e   address pDest->
19770 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
19780 20 53 52 54 5f 45 78 69 73 74 73 20 20 20 20 20   SRT_Exists     
19790 20 53 74 6f 72 65 20 61 20 31 20 69 6e 20 6d 65   Store a 1 in me
197a0 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d  mory cell pDest-
197b0 3e 69 50 61 72 6d 20 69 66 20 74 68 65 20 72 65  >iParm if the re
197c0 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  sult.**         
197d0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
197e0 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a  is not empty..**
197f0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44 69 73 63  .**     SRT_Disc
19800 61 72 64 20 20 20 20 20 54 68 72 6f 77 20 74 68  ard     Throw th
19810 65 20 72 65 73 75 6c 74 73 20 61 77 61 79 2e 0a  e results away..
19820 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65  **.** See the se
19830 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20  lectInnerLoop() 
19840 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 20 63  function for a c
19850 61 6e 6f 6e 69 63 61 6c 20 6c 69 73 74 69 6e 67  anonical listing
19860 20 6f 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f   of the .** allo
19870 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44  wed values of eD
19880 65 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65  est and their me
19890 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  anings..**.** Th
198a0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
198b0 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
198c0 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
198d0 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
198e0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
198f0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
19900 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
19910 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
19920 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
19930 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19940 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
19950 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
19960 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
19970 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
19980 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
19990 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54  do that..**.** T
199a0 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65  he pParent, pare
199b0 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72  ntTab, and *pPar
199c0 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61 72  entAgg fields ar
199d0 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74  e filled in if t
199e0 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73  his.** SELECT is
199f0 20 61 20 73 75 62 71 75 65 72 79 2e 20 20 54 68   a subquery.  Th
19a00 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74  is routine may t
19a10 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  ry to combine th
19a20 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74  is SELECT.** wit
19a30 68 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20  h its parent to 
19a40 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c  form a single fl
19a50 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f  at query.  In so
19a60 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74   doing, it might
19a70 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70  .** change the p
19a80 61 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d  arent query from
19a90 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65   a non-aggregate
19aa0 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65   to an aggregate
19ab0 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74   query..** For t
19ac0 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  hat reason, the 
19ad0 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20  pParentAgg flag 
19ae0 69 73 20 70 61 73 73 65 64 20 61 73 20 61 20 70  is passed as a p
19af0 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a  ointer, so it.**
19b00 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e   can be changed.
19b10 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
19b20 3a 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  :   The meaning 
19b30 6f 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70  of the pParent p
19b40 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
19b50 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
19b60 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54   t1 JOIN (SELECT
19b70 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f   x, count(*) FRO
19b80 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a  M t2) JOIN t3;.*
19b90 2a 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  *    \          
19ba0 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
19bb0 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
19bc0 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a  _____/        /.
19bd0 2a 2a 20 20 20 20 20 5c 20 20 20 20 20 20 20 20  **     \        
19be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a                /.
19c10 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  **      \_______
19c20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
19c30 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
19c40 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
19c50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19c60 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
19c70 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
19c80 66 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61  first.   For tha
19c90 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65  t call,.** pPare
19ca0 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e  nt will be NULL.
19cb0 20 20 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f    During the pro
19cc0 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f  cessing of the o
19cd0 75 74 65 72 20 71 75 65 72 79 2c 20 74 68 69 73  uter query, this
19ce0 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20   .** routine is 
19cf0 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
19d00 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ly to handle the
19d10 20 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20   subquery.  For 
19d20 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a  the recursive.**
19d30 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77   call, pParent w
19d40 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ill point to the
19d50 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
19d60 65 63 61 75 73 65 20 74 68 65 20 73 75 62 71 75  ecause the subqu
19d70 65 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65  ery is.** the se
19d80 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20  cond element in 
19d90 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
19da0 2c 20 74 68 65 20 70 61 72 65 6e 74 54 61 62 20  , the parentTab 
19db0 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a  parameter will.*
19dc0 2a 20 62 65 20 31 20 28 74 68 65 20 32 6e 64 20  * be 1 (the 2nd 
19dd0 76 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64  value of a 0-ind
19de0 65 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a  exed array.).*/.
19df0 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
19e00 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
19e10 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
19e20 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
19e30 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
19e40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
19e50 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
19e60 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
19e70 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  d. */.  SelectDe
19e80 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 2f  st *pDest,     /
19e90 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
19ea0 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  h the query resu
19eb0 6c 74 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  lts */.  Select 
19ec0 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20  *pParent,       
19ed0 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
19ee0 54 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73  T for which this
19ef0 20 69 73 20 61 20 73 75 62 2d 71 75 65 72 79 20   is a sub-query 
19f00 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54  */.  int parentT
19f10 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ab,         /* I
19f20 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d  ndex in pParent-
19f30 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20 71 75  >pSrc of this qu
19f40 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50  ery */.  int *pP
19f50 61 72 65 6e 74 41 67 67 2c 20 20 20 20 20 20 20  arentAgg,       
19f60 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65  /* True if pPare
19f70 6e 74 20 75 73 65 73 20 61 67 67 72 65 67 61 74  nt uses aggregat
19f80 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
19f90 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20   char *aff      
19fa0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44          /* If eD
19fb0 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e  est is SRT_Union
19fc0 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  , the affinity s
19fd0 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
19fe0 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
19ff0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1a000 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
1a010 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
1a020 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d    /* Return from
1a030 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1a040 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a  in() */.  Vdbe *
1a050 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1a060 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
1a070 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
1a080 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1a090 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20  int isAgg;      
1a0a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
1a0b0 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
1a0c0 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
1a0d0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1a0e0 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  EList;      /* L
1a0f0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
1a100 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
1a110 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
1a120 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
1a130 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
1a140 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
1a150 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
1a160 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1a170 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
1a180 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
1a190 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
1a1a0 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
1a1b0 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
1a1c0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
1a1d0 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
1a1e0 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
1a1f0 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
1a200 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
1a210 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
1a220 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
1a230 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
1a240 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
1a250 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  isDistinct;     
1a260 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1a270 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
1a280 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
1a290 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b  .  int distinct;
1a2a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1a2b0 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  le to use for th
1a2c0 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a  e distinct set *
1a2d0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
1a2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1a2f0 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
1a300 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
1a310 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f   */.  int addrSo
1a320 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20  rtIndex;     /* 
1a330 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50  Address of an OP
1a340 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
1a350 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1a360 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f  AggInfo sAggInfo
1a370 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ;      /* Inform
1a380 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67  ation used by ag
1a390 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
1a3a0 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20  */.  int iEnd;  
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1a3c0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e  ddress of the en
1a3d0 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  d of the query *
1a3e0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
1a3f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a400 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1a410 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d  ction */..  db =
1a420 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1a430 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  f( p==0 || db->m
1a440 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
1a450 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
1a460 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1a470 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
1a480 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1a490 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
1a4a0 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
1a4b0 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41   1;.  memset(&sA
1a4c0 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  ggInfo, 0, sizeo
1a4d0 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20  f(sAggInfo));.. 
1a4e0 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
1a4f0 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 49  OrderBy;.  if( I
1a500 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
1a510 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70 2d  pDest) ){.    p-
1a520 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a  >pOrderBy = 0;..
1a530 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 73 65 20      /* In these 
1a540 63 61 73 65 73 20 74 68 65 20 44 49 53 54 49 4e  cases the DISTIN
1a550 43 54 20 6f 70 65 72 61 74 6f 72 20 6d 61 6b 65  CT operator make
1a560 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
1a570 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  to the.    ** re
1a580 73 75 6c 74 73 2c 20 73 6f 20 72 65 6d 6f 76 65  sults, so remove
1a590 20 69 74 20 69 66 20 69 74 20 77 65 72 65 20 73   it if it were s
1a5a0 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f  pecified..    */
1a5b0 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73  .    assert(pDes
1a5c0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
1a5d0 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65  ists || pDest->e
1a5e0 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20  Dest==SRT_Union 
1a5f0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  || .           p
1a600 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
1a610 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74  _Except || pDest
1a620 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
1a630 63 61 72 64 29 3b 0a 20 20 20 20 70 2d 3e 69 73  card);.    p->is
1a640 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
1a650 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  }.  if( sqlite3S
1a660 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61  electResolve(pPa
1a670 72 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20  rse, p, 0) ){.  
1a680 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
1a690 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f 72 64  d;.  }.  p->pOrd
1a6a0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
1a6b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1a6c0 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
1a6d0 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68  ELECT.  /* If th
1a6e0 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71  ere is are a seq
1a6f0 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73  uence of queries
1a700 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72  , do the earlier
1a710 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a   ones first..  *
1a720 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
1a730 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r ){.    if( p->
1a740 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b  pRightmost==0 ){
1a750 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
1a760 4c 6f 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d 20  Loop, *pRight = 
1a770 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74  0;.      int cnt
1a780 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
1a790 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
1a7a0 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
1a7b0 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20  ior, cnt++){.   
1a7c0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67       pLoop->pRig
1a7d0 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20  htmost = p;.    
1a7e0 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74      pLoop->pNext
1a7f0 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
1a800 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f     pRight = pLoo
1a810 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
1a820 20 69 66 28 20 53 51 4c 49 54 45 5f 4d 41 58 5f   if( SQLITE_MAX_
1a830 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3e  COMPOUND_SELECT>
1a840 30 20 26 26 20 63 6e 74 3e 53 51 4c 49 54 45 5f  0 && cnt>SQLITE_
1a850 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
1a860 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ECT ){.        s
1a870 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a880 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
1a890 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75   terms in compou
1a8a0 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20  nd SELECT");.   
1a8b0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1a8c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a8d0 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
1a8e0 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ect(pParse, p, p
1a8f0 44 65 73 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a  Dest, aff);.  }.
1a900 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
1a910 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f  e local copies o
1a920 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
1a930 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e   for this query.
1a940 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74  .  */.  pTabList
1a950 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57   = p->pSrc;.  pW
1a960 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
1a970 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70  ;.  pGroupBy = p
1a980 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48  ->pGroupBy;.  pH
1a990 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
1a9a0 6e 67 3b 0a 20 20 69 73 41 67 67 20 3d 20 70 2d  ng;.  isAgg = p-
1a9b0 3e 69 73 41 67 67 3b 0a 20 20 69 73 44 69 73 74  >isAgg;.  isDist
1a9c0 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
1a9d0 69 6e 63 74 3b 0a 20 20 70 45 4c 69 73 74 20 3d  inct;.  pEList =
1a9e0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
1a9f0 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f  ( pEList==0 ) go
1aa00 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
1aa10 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f    /* .  ** Do no
1aa20 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74  t even attempt t
1aa30 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63  o generate any c
1aa40 6f 64 65 20 69 66 20 77 65 20 68 61 76 65 20 61  ode if we have a
1aa50 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a  lready seen.  **
1aa60 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74   errors before t
1aa70 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
1aa80 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ts..  */.  if( p
1aa90 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20  Parse->nErr>0 ) 
1aaa0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1aab0 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e  ..  /* If writin
1aac0 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67  g to memory or g
1aad0 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a  enerating a set.
1aae0 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67    ** only a sing
1aaf0 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65  le column may be
1ab00 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69   output..  */.#i
1ab10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ab20 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28  T_SUBQUERY.  if(
1ab30 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
1ab40 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
1ab50 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70  pParse, pDest, p
1ab60 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
1ab70 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
1ab80 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  _end;.  }.#endif
1ab90 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ..  /* ORDER BY 
1aba0 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 73  is ignored for s
1abb0 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73  ome destinations
1abc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 67 6e  ..  */.  if( Ign
1abd0 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
1abe0 65 73 74 29 20 29 7b 0a 20 20 20 20 70 4f 72 64  est) ){.    pOrd
1abf0 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erBy = 0;.  }.. 
1ac00 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
1ac10 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ting code..  */.
1ac20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1ac30 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1ac40 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
1ac50 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
1ac60 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1ac70 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
1ac80 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
1ac90 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20  clause.  */.#if 
1aca0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1acb0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1acc0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1acd0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66  E_OMIT_VIEW).  f
1ace0 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
1acf0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
1ad00 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1ad10 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
1ad20 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  t = 0;.    int n
1ad30 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
1ad40 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  t;.    struct Sr
1ad50 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1ad60 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
1ad70 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44  [i];.    SelectD
1ad80 65 73 74 20 64 65 73 74 3b 0a 0a 20 20 20 20 69  est dest;..    i
1ad90 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
1ada0 74 3d 3d 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69  t==0 || pItem->i
1adb0 73 50 6f 70 75 6c 61 74 65 64 20 29 20 63 6f 6e  sPopulated ) con
1adc0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
1add0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29  Item->zName!=0 )
1ade0 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64 41 75  {.      zSavedAu
1adf0 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
1ae00 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
1ae10 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1ae20 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
1ae30 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Item->zName;.   
1ae40 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f     needRestoreCo
1ae50 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d  ntext = 1;.    }
1ae60 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65 65 64  else{.      need
1ae70 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d  RestoreContext =
1ae80 20 30 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64 65   0;.    }.#if de
1ae90 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1aea0 54 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  T) || SQLITE_MAX
1aeb0 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20  _EXPR_DEPTH>0.  
1aec0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50    /* Increment P
1aed0 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20  arse.nHeight by 
1aee0 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
1aef0 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73  e largest expres
1af00 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65  sion.    ** tree
1af10 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 74   refered to by t
1af20 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20  his, the parent 
1af30 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c  select. The chil
1af40 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20  d select.    ** 
1af50 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72  may contain expr
1af60 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20  ession trees of 
1af70 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28  at most.    ** (
1af80 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
1af90 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69  DEPTH-Parse.nHei
1afa0 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69  ght) height. Thi
1afb0 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a  s is a bit.    *
1afc0 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74  * more conservat
1afd0 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ive than necessa
1afe0 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73  ry, but much eas
1aff0 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69  ier than enforci
1b000 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61  ng.    ** an exa
1b010 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f  ct limit..    */
1b020 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
1b030 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  ight += sqlite3S
1b040 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
1b050 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  p);.#endif.    s
1b060 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
1b070 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
1b080 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d  EphemTab, pItem-
1b090 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  >iCursor);.    s
1b0a0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1b0b0 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  rse, pItem->pSel
1b0c0 65 63 74 2c 20 26 64 65 73 74 2c 20 70 2c 20 69  ect, &dest, p, i
1b0d0 2c 20 26 69 73 41 67 67 2c 20 30 29 3b 0a 20 20  , &isAgg, 0);.  
1b0e0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1b0f0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
1b100 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1b110 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  .    }.#if defin
1b120 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
1b130 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  || SQLITE_MAX_EX
1b140 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70  PR_DEPTH>0.    p
1b150 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
1b160 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
1b170 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 23 65  xprHeight(p);.#e
1b180 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6e 65 65  ndif.    if( nee
1b190 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20  dRestoreContext 
1b1a0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
1b1b0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
1b1c0 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
1b1d0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  t;.    }.    pTa
1b1e0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
1b1f0 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d  .    pWhere = p-
1b200 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28  >pWhere;.    if(
1b210 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
1b220 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
1b230 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d     pOrderBy = p-
1b240 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d  >pOrderBy;.    }
1b250 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
1b260 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
1b270 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
1b280 61 76 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73  aving;.    isDis
1b290 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
1b2a0 74 69 6e 63 74 3b 0a 20 20 7d 0a 23 65 6e 64 69  tinct;.  }.#endi
1b2b0 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  f..  /* Check fo
1b2c0 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  r the special ca
1b2d0 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72  se of a min() or
1b2e0 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20   max() function 
1b2f0 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  by itself.  ** i
1b300 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
1b310 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 69  ..  */.#if 0.  i
1b320 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51  f( simpleMinMaxQ
1b330 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
1b340 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 72 63  pDest) ){.    rc
1b350 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73   = 0;.    goto s
1b360 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23  elect_end;.  }.#
1b370 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63  endif..  /* Chec
1b380 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  k to see if this
1b390 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74   is a subquery t
1b3a0 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74  hat can be "flat
1b3b0 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20  tened" into its 
1b3c0 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  parent..  ** If 
1b3d0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20  flattening is a 
1b3e0 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73  possiblity, do s
1b3f0 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  o and return imm
1b400 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f  ediately.  .  */
1b410 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b420 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
1b430 70 50 61 72 65 6e 74 20 26 26 20 70 50 61 72 65  pParent && pPare
1b440 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20 20 66  ntAgg &&.      f
1b450 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 64  lattenSubquery(d
1b460 62 2c 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65  b, pParent, pare
1b470 6e 74 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41  ntTab, *pParentA
1b480 67 67 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20  gg, isAgg) ){.  
1b490 20 20 69 66 28 20 69 73 41 67 67 20 29 20 2a 70    if( isAgg ) *p
1b4a0 50 61 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20  ParentAgg = 1;. 
1b4b0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
1b4c0 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  nd;.  }.#endif..
1b4d0 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65    /* If possible
1b4e0 2c 20 72 65 77 72 69 74 65 20 74 68 65 20 71 75  , rewrite the qu
1b4f0 65 72 79 20 74 6f 20 75 73 65 20 47 52 4f 55 50  ery to use GROUP
1b500 20 42 59 20 69 6e 73 74 65 61 64 20 6f 66 20 44   BY instead of D
1b510 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2a 20 47 52  ISTINCT..  ** GR
1b520 4f 55 50 20 42 59 20 6d 61 79 20 75 73 65 20 61  OUP BY may use a
1b530 6e 20 69 6e 64 65 78 2c 20 44 49 53 54 49 4e 43  n index, DISTINC
1b540 54 20 6e 65 76 65 72 20 64 6f 65 73 2e 0a 20 20  T never does..  
1b550 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69  */.  if( p->isDi
1b560 73 74 69 6e 63 74 20 26 26 20 21 70 2d 3e 69 73  stinct && !p->is
1b570 41 67 67 20 26 26 20 21 70 2d 3e 70 47 72 6f 75  Agg && !p->pGrou
1b580 70 42 79 20 29 7b 0a 20 20 20 20 70 2d 3e 70 47  pBy ){.    p->pG
1b590 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
1b5a0 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
1b5b0 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
1b5c0 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
1b5d0 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 2d 3e 69  roupBy;.    p->i
1b5e0 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  sDistinct = 0;. 
1b5f0 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20     isDistinct = 
1b600 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
1b610 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
1b620 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
1b630 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20  n this sorting. 
1b640 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20   ** index might 
1b650 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75  end up being unu
1b660 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20  sed if the data 
1b670 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74  can be .  ** ext
1b680 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f  racted in pre-so
1b690 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20  rted order.  If 
1b6a0 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
1b6b0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
1b6c0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1b6d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c   instruction wil
1b6e0 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20  l be changed to 
1b6f0 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a  an OP_Noop once.
1b700 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f    ** we figure o
1b710 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74  ut that the sort
1b720 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  ing index is not
1b730 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61 64   needed.  The ad
1b740 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a  drSortIndex.  **
1b750 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
1b760 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20  d to facilitate 
1b770 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a  that change..  *
1b780 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
1b790 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
1b7a0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69  *pKeyInfo;.    i
1b7b0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1b7c0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
1b7d0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
1b7e0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
1b7f0 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
1b800 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
1b810 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72  rBy);.    pOrder
1b820 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70  By->iECursor = p
1b830 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
1b840 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
1b850 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74  hm[2] = addrSort
1b860 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71  Index =.      sq
1b870 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1b880 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
1b890 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
1b8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8b0 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
1b8c0 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  or, pOrderBy->nE
1b8d0 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20  xpr+2, 0,.      
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8f0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
1b900 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
1b910 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c  _HANDOFF);.  }el
1b920 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74  se{.    addrSort
1b930 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a  Index = -1;.  }.
1b940 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
1b950 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
1b960 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
1b970 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
1b980 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
1b990 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
1b9a0 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
1b9b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b9c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
1b9d0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73  nEphemeral, pDes
1b9e0 74 2d 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73 74  t->iParm, pEList
1b9f0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20  ->nExpr);.  }.. 
1ba00 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
1ba10 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64  ter..  */.  iEnd
1ba20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1ba30 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f  keLabel(v);.  co
1ba40 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
1ba50 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
1ba60 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  End);..  /* Open
1ba70 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
1ba80 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
1ba90 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
1baa0 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69  */.  if( isDisti
1bab0 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  nct ){.    KeyIn
1bac0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
1bad0 20 20 61 73 73 65 72 74 28 20 69 73 41 67 67 20    assert( isAgg 
1bae0 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 3b 0a 20  || pGroupBy );. 
1baf0 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50     distinct = pP
1bb00 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
1bb10 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
1bb20 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
1bb30 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
1bb40 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
1bb50 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1bb60 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
1bb70 64 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a  distinct, 0, 0,.
1bb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb90 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1bba0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
1bbb0 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
1bbc0 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69  }else{.    disti
1bbd0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  nct = -1;.  }.. 
1bbe0 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e   /* Aggregate an
1bbf0 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  d non-aggregate 
1bc00 71 75 65 72 69 65 73 20 61 72 65 20 68 61 6e 64  queries are hand
1bc10 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
1bc20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  */.  if( !isAgg 
1bc30 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  && pGroupBy==0 )
1bc40 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
1bc50 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67  se is for non-ag
1bc60 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 0a  gregate queries.
1bc70 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68 65      ** Begin the
1bc80 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20   database scan. 
1bc90 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f     */.    pWInfo
1bca0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
1bcb0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
1bcc0 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26  bList, pWhere, &
1bcd0 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20  pOrderBy, 0);.  
1bce0 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
1bcf0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1bd00 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f  d;..    /* If so
1bd10 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
1bd20 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
1bd30 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
1bd40 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
1bd50 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
1bd60 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
1bd70 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
1bd80 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
1bd90 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
1bda0 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
1bdb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1bdc0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
1bdd0 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   && pOrderBy==0 
1bde0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1bdf0 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
1be00 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65  (v, addrSortInde
1be10 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e  x, 1);.      p->
1be20 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
1be30 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  = -1;.    }..   
1be40 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
1be50 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a  dard inner loop.
1be60 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1be70 74 28 21 69 73 44 69 73 74 69 6e 63 74 29 3b 0a  t(!isDistinct);.
1be80 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e      if( selectIn
1be90 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
1bea0 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p, pEList, 0, 0,
1beb0 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 70   pOrderBy, -1, p
1bec0 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
1bed0 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
1bee0 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49  ->iContinue, pWI
1bef0 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66  nfo->iBreak, aff
1bf00 29 20 29 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f  ) ){.       goto
1bf10 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
1bf20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74   }..    /* End t
1bf30 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
1bf40 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
1bf50 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
1bf60 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c  d(pWInfo);.  }el
1bf70 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
1bf80 69 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  is the processin
1bf90 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
1bfa0 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e  queries */.    N
1bfb0 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
1bfc0 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
1bfd0 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  xt for processin
1bfe0 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  g aggregate info
1bff0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  rmation */.    i
1c000 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20  nt iAMem;       
1c010 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
1c020 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72  address for stor
1c030 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55  ing current GROU
1c040 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
1c050 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iBMem;          
1c060 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
1c070 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75  ress for previou
1c080 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  s GROUP BY */.  
1c090 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20    int iUseFlag; 
1c0a0 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64        /* Mem add
1c0b0 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61  ress holding fla
1c0c0 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  g indicating tha
1c0d0 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20  t at least.     
1c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0f0 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66     ** one row of
1c100 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   the input to th
1c110 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73  e aggregator has
1c120 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20   been.          
1c130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1c140 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
1c150 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67    int iAbortFlag
1c160 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64  ;     /* Mem add
1c170 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65  ress which cause
1c180 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66  s query abort if
1c190 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20   positive */.   
1c1a0 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74   int groupBySort
1c1b0 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d  ;    /* Rows com
1c1c0 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e  e from source in
1c1d0 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20   GROUP BY order 
1c1e0 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  */...    /* The 
1c1f0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
1c200 6c 65 73 20 68 6f 6c 64 20 61 64 64 72 65 73 73  les hold address
1c210 65 73 20 6f 72 20 6c 61 62 65 6c 73 20 66 6f 72  es or labels for
1c220 20 70 61 72 74 73 20 6f 66 20 74 68 65 0a 20 20   parts of the.  
1c230 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63    ** virtual mac
1c240 68 69 6e 65 20 70 72 6f 67 72 61 6d 20 77 65 20  hine program we 
1c250 61 72 65 20 70 75 74 74 69 6e 67 20 74 6f 67 65  are putting toge
1c260 74 68 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ther */.    int 
1c270 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
1c280 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
1c290 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1c2a0 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74  outputs a result
1c2b0 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
1c2c0 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20  addrSetAbort;   
1c2d0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61      /* Set the a
1c2e0 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65  bort flag and re
1c2f0 74 75 72 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  turn */.    int 
1c300 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f  addrInitializeLo
1c310 6f 70 3b 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  op; /* Start of 
1c320 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69 61  code that initia
1c330 6c 69 7a 65 73 20 74 68 65 20 69 6e 70 75 74 20  lizes the input 
1c340 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20  loop */.    int 
1c350 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20  addrTopOfLoop;  
1c360 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
1c370 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
1c380 20 20 20 20 69 6e 74 20 61 64 64 72 47 72 6f 75      int addrGrou
1c390 70 42 79 43 68 61 6e 67 65 3b 20 20 2f 2a 20 43  pByChange;  /* C
1c3a0 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68  ode that runs wh
1c3b0 65 6e 20 61 6e 79 20 47 52 4f 55 50 20 42 59 20  en any GROUP BY 
1c3c0 74 65 72 6d 20 63 68 61 6e 67 65 73 20 2a 2f 0a  term changes */.
1c3d0 20 20 20 20 69 6e 74 20 61 64 64 72 50 72 6f 63      int addrProc
1c3e0 65 73 73 52 6f 77 3b 20 20 20 20 20 2f 2a 20 43  essRow;     /* C
1c3f0 6f 64 65 20 74 6f 20 70 72 6f 63 65 73 73 20 61  ode to process a
1c400 20 73 69 6e 67 6c 65 20 69 6e 70 75 74 20 72 6f   single input ro
1c410 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  w */.    int add
1c420 72 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  rEnd;           
1c430 20 2f 2a 20 45 6e 64 20 6f 66 20 61 6c 6c 20 70   /* End of all p
1c440 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 20  rocessing */.   
1c450 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67   int addrSorting
1c460 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  Idx;     /* The 
1c470 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1c480 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67   for the sorting
1c490 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
1c4a0 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20  t addrReset;    
1c4b0 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
1c4c0 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e  ine for resettin
1c4d0 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
1c4e0 72 20 2a 2f 0a 0a 20 20 20 20 61 64 64 72 45 6e  r */..    addrEn
1c4f0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
1c500 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
1c510 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
1c520 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
1c530 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
1c540 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
1c550 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
1c560 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
1c570 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
1c580 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
1c590 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
1c5a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1c5b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
1c5c0 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
1c5d0 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
1c5e0 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
1c5f0 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
1c600 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
1c610 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f      sNC.pAggInfo
1c620 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
1c630 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
1c640 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
1c650 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
1c660 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20  >nExpr+1 : 0;.  
1c670 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
1c680 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
1c690 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1c6a0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
1c6b0 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 20  t(&sNC, pEList) 
1c6c0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
1c6d0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
1c6e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1c6f0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
1c700 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79  t(&sNC, pOrderBy
1c710 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1c720 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
1c730 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  }.    if( pHavin
1c740 67 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  g && sqlite3Expr
1c750 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
1c760 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29  s(&sNC, pHaving)
1c770 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
1c780 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
1c790 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
1c7a0 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
1c7b0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
1c7c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
1c7d0 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
1c7e0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
1c7f0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
1c800 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
1c810 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
1c820 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 20 29 7b  pExpr->pList) ){
1c830 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
1c840 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
1c850 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1c860 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c870 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
1c880 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63  nd;..    /* Proc
1c890 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
1c8a0 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50  gates with GROUP
1c8b0 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66   BY is very diff
1c8c0 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a  erent and.    **
1c8d0 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   much more compl
1c8e0 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74  ex than aggregat
1c8f0 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f  es without a GRO
1c900 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  UP BY..    */.  
1c910 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
1c920 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  {.      KeyInfo 
1c930 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b  *pKeyInfo;  /* K
1c940 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  eying informatio
1c950 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20  n for the group 
1c960 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20  by clause */..  
1c970 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61      /* Create la
1c980 62 65 6c 73 20 74 68 61 74 20 77 65 20 77 69 6c  bels that we wil
1c990 6c 20 62 65 20 6e 65 65 64 69 6e 67 0a 20 20 20  l be needing.   
1c9a0 20 20 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20     */.     .    
1c9b0 20 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65    addrInitialize
1c9c0 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
1c9d0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1c9e0 20 20 20 20 20 20 61 64 64 72 47 72 6f 75 70 42        addrGroupB
1c9f0 79 43 68 61 6e 67 65 20 3d 20 73 71 6c 69 74 65  yChange = sqlite
1ca00 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1ca10 29 3b 0a 20 20 20 20 20 20 61 64 64 72 50 72 6f  );.      addrPro
1ca20 63 65 73 73 52 6f 77 20 3d 20 73 71 6c 69 74 65  cessRow = sqlite
1ca30 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1ca40 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
1ca50 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50  there is a GROUP
1ca60 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69   BY clause we mi
1ca70 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69  ght need a sorti
1ca80 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20  ng index to.    
1ca90 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69    ** implement i
1caa0 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61  t.  Allocate tha
1cab0 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  t sorting index 
1cac0 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e  now.  If it turn
1cad0 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  s out.      ** t
1cae0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  hat we do not ne
1caf0 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c  ed it after all,
1cb00 20 74 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72   the OpenEphemer
1cb10 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20  al instruction. 
1cb20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
1cb30 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
1cb40 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a   Noop.  .      *
1cb50 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f  /.      sAggInfo
1cb60 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50  .sortingIdx = pP
1cb70 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
1cb80 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
1cb90 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
1cba0 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
1cbb0 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72  pBy);.      addr
1cbc0 53 6f 72 74 69 6e 67 49 64 78 20 3d 0a 20 20 20  SortingIdx =.   
1cbd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1cbe0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
1cbf0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 73 41  penEphemeral, sA
1cc00 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1cc10 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 73 41 67 67              sAgg
1cc30 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
1cc40 75 6d 6e 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  umn, 0,.        
1cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc60 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
1cc70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
1cc80 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  DOFF);..      /*
1cc90 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
1cca0 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65  ry locations use
1ccb0 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67  d by GROUP BY ag
1ccc0 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69  gregate processi
1ccd0 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ng.      */.    
1cce0 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70    iUseFlag = ++p
1ccf0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1cd00 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20     iAbortFlag = 
1cd10 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1cd20 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50        iAMem = pP
1cd30 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
1cd40 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
1cd50 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
1cd60 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d  nExpr;.      iBM
1cd70 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
1cd80 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
1cd90 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
1cda0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
1cdb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cdc0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1cdd0 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c  ger, 0, iAbortFl
1cde0 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
1cdf0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61  omment((v, "clea
1ce00 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  r abort flag"));
1ce10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ce20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1ce30 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46  nteger, 0, iUseF
1ce40 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
1ce50 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
1ce60 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  icate accumulato
1ce70 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20  r empty"));.    
1ce80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ce90 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1cea0 30 2c 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a  0, addrInitializ
1ceb0 65 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20 20 20 2f  eLoop);..      /
1cec0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1ced0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
1cee0 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  puts a single ro
1cef0 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
1cf00 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54        ** set.  T
1cf10 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66  his subroutine f
1cf20 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68  irst looks at th
1cf30 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20  e iUseFlag.  If 
1cf40 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a  iUseFlag.      *
1cf50 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  * is less than o
1cf60 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
1cf70 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
1cf80 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a  is a no-op.  If.
1cf90 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f        ** the pro
1cfa0 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f  cessing calls fo
1cfb0 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61  r the query to a
1cfc0 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f  bort, this subro
1cfd0 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  utine.      ** i
1cfe0 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41  ncrements the iA
1cff0 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20  bortFlag memory 
1d000 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
1d010 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20  returning in.   
1d020 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73     ** order to s
1d030 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72  ignal the caller
1d040 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20   to abort..     
1d050 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65   */.      addrSe
1d060 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33  tAbort = sqlite3
1d070 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1d080 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
1d090 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d0a0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41  P_Integer, 1, iA
1d0b0 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
1d0c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1d0d0 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67   "set abort flag
1d0e0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1d0f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d100 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29  OP_Return, 0, 0)
1d110 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
1d120 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
1d130 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1d140 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d150 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d160 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67  _IfPos, iUseFlag
1d170 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
1d180 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  2);.      VdbeCo
1d190 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70  mment((v, "Group
1d1a0 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
1d1b0 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22  tor entry point"
1d1c0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
1d1d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d1e0 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b  P_Return, 0, 0);
1d1f0 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41  .      finalizeA
1d200 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
1d210 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
1d220 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e        if( pHavin
1d230 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
1d240 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1d250 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
1d260 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31   addrOutputRow+1
1d270 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
1d280 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ULL);.      }.  
1d290 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49      rc = selectI
1d2a0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
1d2b0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30   p, p->pEList, 0
1d2c0 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20  , 0, pOrderBy,. 
1d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2e0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e            distin
1d2f0 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20  ct, pDest,.     
1d300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d310 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
1d320 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62  Row+1, addrSetAb
1d330 6f 72 74 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  ort, aff);.     
1d340 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1d350 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
1d360 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
1d370 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d380 4f 70 32 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op2(v, OP_Return
1d390 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 56  , 0, 0);.      V
1d3a0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1d3b0 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75  end groupby resu
1d3c0 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b  lt generator"));
1d3d0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
1d3e0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
1d3f0 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74   that will reset
1d400 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63   the group-by ac
1d410 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20  cumulator.      
1d420 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 52 65 73  */.      addrRes
1d430 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  et = sqlite3Vdbe
1d440 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1d450 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
1d460 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
1d470 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
1d480 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d490 70 32 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p2(v, OP_Return,
1d4a0 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f   0, 0);..      /
1d4b0 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74  * Begin a loop t
1d4c0 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
1d4d0 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73   all source rows
1d4e0 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
1d4f0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  er..      ** Thi
1d500 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20  s might involve 
1d510 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f  two separate loo
1d520 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f  ps with an OP_So
1d530 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f  rt in between, o
1d540 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69  r.      ** it mi
1d550 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ght be a single 
1d560 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61  loop that uses a
1d570 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61  n index to extra
1d580 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  ct information. 
1d590 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72       ** in the r
1d5a0 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65  ight order to be
1d5b0 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20  gin with..      
1d5c0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1d5d0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1d5e0 28 76 2c 20 61 64 64 72 49 6e 69 74 69 61 6c 69  (v, addrInitiali
1d5f0 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73  zeLoop);.      s
1d600 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d610 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c  (v, OP_Gosub, 0,
1d620 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
1d630 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
1d640 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
1d650 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
1d660 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70 42  pWhere, &pGroupB
1d670 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  y, 0);.      if(
1d680 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
1d690 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1d6a0 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
1d6b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
1d6c0 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  * The optimizer 
1d6d0 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76  is able to deliv
1d6e0 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70  er rows in group
1d6f0 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20   by order so.   
1d700 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f       ** we do no
1d710 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20  t have to sort. 
1d720 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
1d730 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  meral table will
1d740 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63   be.        ** c
1d750 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62  ancelled later b
1d760 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20  ecause we still 
1d770 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  need to use the 
1d780 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20  pKeyInfo.       
1d790 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72 6f   */.        pGro
1d7a0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
1d7b0 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f 75  By;.        grou
1d7c0 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20  pBySort = 0;.   
1d7d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d7e0 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f    /* Rows are co
1d7f0 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65  ming out in unde
1d800 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20  termined order. 
1d810 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68   We have to push
1d820 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68  .        ** each
1d830 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74   row into a sort
1d840 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69  ing index, termi
1d850 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c  nate the first l
1d860 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  oop,.        ** 
1d870 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74  then loop over t
1d880 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
1d890 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
1d8a0 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
1d8b0 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64      ** in sorted
1d8c0 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
1d8d0 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  /.        groupB
1d8e0 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  ySort = 1;.     
1d8f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1d900 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
1d910 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 29 3b  e, pGroupBy, 0);
1d920 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d930 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d940 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49  _Sequence, sAggI
1d950 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
1d960 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  0);.        j = 
1d970 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b  pGroupBy->nExpr+
1d980 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  1;.        for(i
1d990 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
1d9a0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
1d9b0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
1d9c0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
1d9d0 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f   = &sAggInfo.aCo
1d9e0 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
1d9f0 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
1da00 72 43 6f 6c 75 6d 6e 3c 6a 20 29 20 63 6f 6e 74  rColumn<j ) cont
1da10 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1da20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1da30 65 74 43 6f 6c 75 6d 6e 28 76 2c 20 70 43 6f 6c  etColumn(v, pCol
1da40 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43  ->pTab, pCol->iC
1da50 6f 6c 75 6d 6e 2c 70 43 6f 6c 2d 3e 69 54 61 62  olumn,pCol->iTab
1da60 6c 65 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20  le,0);.         
1da70 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a   j++;.        }.
1da80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1da90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1daa0 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6a 2c 20 30  MakeRecord, j, 0
1dab0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1dac0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1dad0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 73 41  OP_IdxInsert, sA
1dae0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1daf0 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  x, 0);.        s
1db00 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
1db10 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
1db20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1db30 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41  2(v, OP_Sort, sA
1db40 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1db50 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  x, addrEnd);.   
1db60 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1db70 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73  ((v, "GROUP BY s
1db80 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20  ort"));.        
1db90 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74  sAggInfo.useSort
1dba0 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20  ingIdx = 1;.    
1dbb0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76    }..      /* Ev
1dbc0 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65  aluate the curre
1dbd0 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
1dbe0 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62  s and store in b
1dbf0 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20  0, b1, b2....   
1dc00 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d     ** (b0 is mem
1dc10 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d  ory location iBM
1dc20 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65  em+0, b1 is iBMe
1dc30 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  m+1, and so fort
1dc40 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  h).      ** Then
1dc50 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72   compare the cur
1dc60 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
1dc70 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  rms against the 
1dc80 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20  GROUP BY terms. 
1dc90 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
1dca0 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75   previous row cu
1dcb0 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
1dcc0 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a  n a0, a1, a2....
1dcd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
1dce0 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73  ddrTopOfLoop = s
1dcf0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1dd00 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
1dd10 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75  for(j=0; j<pGrou
1dd20 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  pBy->nExpr; j++)
1dd30 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72  {.        if( gr
1dd40 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
1dd50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1dd60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
1dd70 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e 66 6f 2e  olumn, sAggInfo.
1dd80 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a 29 3b 0a  sortingIdx, j);.
1dd90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1dda0 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
1ddb0 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  o.directMode = 1
1ddc0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1ddd0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1dde0 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
1ddf0 6a 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  j].pExpr, 0);.  
1de00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1de10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1de20 32 28 76 2c 20 6a 3c 70 47 72 6f 75 70 42 79 2d  2(v, j<pGroupBy-
1de30 3e 6e 45 78 70 72 2d 31 3f 4f 50 5f 4d 6f 76 65  >nExpr-1?OP_Move
1de40 3a 4f 50 5f 43 6f 70 79 2c 20 30 2c 20 69 42 4d  :OP_Copy, 0, iBM
1de50 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  em+j);.      }. 
1de60 20 20 20 20 20 66 6f 72 28 6a 3d 70 47 72 6f 75       for(j=pGrou
1de70 70 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 6a 3e  pBy->nExpr-1; j>
1de80 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; j--){.      
1de90 20 20 69 66 28 20 6a 3c 70 47 72 6f 75 70 42 79    if( j<pGroupBy
1dea0 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20  ->nExpr-1 ){.   
1deb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1dec0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
1ded0 43 6f 70 79 2c 20 69 42 4d 65 6d 2b 6a 2c 20 30  Copy, iBMem+j, 0
1dee0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1def0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1df00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
1df10 70 79 2c 20 69 41 4d 65 6d 2b 6a 2c 20 30 29 3b  py, iAMem+j, 0);
1df20 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  .        if( j==
1df30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
1df40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1df50 28 76 2c 20 4f 50 5f 45 71 2c 20 30 2c 20 61 64  (v, OP_Eq, 0, ad
1df60 64 72 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20  drProcessRow);. 
1df70 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1df80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1df90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1dfa0 4e 65 2c 20 30 2c 20 61 64 64 72 47 72 6f 75 70  Ne, 0, addrGroup
1dfb0 42 79 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  ByChange);.     
1dfc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
1dfd0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1dfe0 28 76 2c 20 2d 31 2c 20 28 76 6f 69 64 2a 29 70  (v, -1, (void*)p
1dff0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
1e000 5d 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  ], P4_COLLSEQ);.
1e010 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e020 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
1e030 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 55 41 4c 29  QLITE_NULLEQUAL)
1e040 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1e050 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1e060 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e  e that runs when
1e070 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42  ever the GROUP B
1e080 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20  Y changes..     
1e090 20 2a 2a 20 43 68 61 6e 67 65 20 69 6e 20 74 68   ** Change in th
1e0a0 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64  e GROUP BY are d
1e0b0 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70  etected by the p
1e0c0 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20  revious code.   
1e0d0 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66     ** block.  If
1e0e0 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63   there were no c
1e0f0 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f  hanges, this blo
1e100 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20  ck is skipped.. 
1e110 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1e120 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65   This code copie
1e130 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20  s current group 
1e140 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62  by terms in b0,b
1e150 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a  1,b2,....      *
1e160 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c  * over to a0,a1,
1e170 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c  a2.  It then cal
1e180 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  ls the output su
1e190 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
1e1a0 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65  * and resets the
1e1b0 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
1e1c0 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
1e1d0 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a   in preparation.
1e1e0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
1e1f0 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62   next GROUP BY b
1e200 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atch..      */. 
1e210 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e220 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1e230 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67  addrGroupByChang
1e240 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  e);.      for(j=
1e250 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
1e260 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
1e270 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e280 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f 76 65  ddOp2(v, OP_Move
1e290 2c 20 69 42 4d 65 6d 2b 6a 2c 20 69 41 4d 65 6d  , iBMem+j, iAMem
1e2a0 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
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 47 6f 73 75 62  dOp2(v, OP_Gosub
1e2d0 2c 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52  , 0, addrOutputR
1e2e0 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
1e2f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
1e300 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20  ut one row"));. 
1e310 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e320 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
1e330 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20  os, iAbortFlag, 
1e340 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
1e350 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1e360 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61  "check abort fla
1e370 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
1e380 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e390 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64   OP_Gosub, 0, ad
1e3a0 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
1e3b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1e3c0 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74  "reset accumulat
1e3d0 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
1e3e0 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72   Update the aggr
1e3f0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
1e400 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  rs based on the 
1e410 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20  content of.     
1e420 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
1e430 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  row.      */.   
1e440 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1e450 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
1e460 64 72 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20  drProcessRow);. 
1e470 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
1e480 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
1e490 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
1e4a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e4b0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1e4c0 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 1, iUseFlag);.
1e4d0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1e4e0 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
1e4f0 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61  data in accumula
1e500 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
1e510 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
1e520 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
1e530 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
1e540 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1e550 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e560 20 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e   OP_Next, sAggIn
1e570 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
1e580 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20  ddrTopOfLoop);. 
1e590 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e5a0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1e5b0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
1e5c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e5d0 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
1e5e0 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20  addrSortingIdx, 
1e5f0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
1e600 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65     /* Output the
1e610 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65   final row of re
1e620 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sult.      */.  
1e630 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e640 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1e650 62 2c 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74  b, 0, addrOutput
1e660 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
1e670 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
1e680 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29  put final row"))
1e690 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 20 2f  ;.      .    } /
1e6a0 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79  * endif pGroupBy
1e6b0 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20   */.    else {. 
1e6c0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
1e6d0 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20  MinMax = 0;.    
1e6e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c    ExprList *pDel
1e6f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 38 20 66   = 0;.      u8 f
1e700 6c 61 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  lag;..      /* C
1e710 68 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72  heck if the quer
1e720 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  y is of one of t
1e730 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
1e740 6d 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ms:.      **.   
1e750 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
1e760 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  in(x) FROM .... 
1e770 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
1e780 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e   max(x) FROM ...
1e790 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1e7a0 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  ** If it is, the
1e7b0 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69  n ask the code i
1e7c0 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74  n where.c to att
1e7d0 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73  empt to sort res
1e7e0 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 61 73  ults.      ** as
1e7f0 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   if there was an
1e800 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72   "ORDER ON x" or
1e810 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53   "ORDER ON x DES
1e820 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20  C" clause. .    
1e830 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20    ** If where.c 
1e840 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75  is able to produ
1e850 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65  ce results sorte
1e860 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c  d in this order,
1e870 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61   then.      ** a
1e880 64 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20  dd vdbe code to 
1e890 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
1e8a0 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70   processing loop
1e8b0 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20   after the .    
1e8c0 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61    ** first itera
1e8d0 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20  tion (since the 
1e8e0 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
1e8f0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a  of the loop is .
1e900 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74        ** guarant
1e910 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  eed to operate o
1e920 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74  n the row with t
1e930 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61  he minimum or ma
1e940 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 2a 2a 20  ximum .      ** 
1e950 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20  value of x, the 
1e960 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65  only row require
1e970 64 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  d)..      **.   
1e980 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20     ** A special 
1e990 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73  flag must be pas
1e9a0 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
1e9b0 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c  ereBegin() to sl
1e9c0 69 67 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20  ightly.      ** 
1e9d0 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 75 72  modify behaviour
1e9e0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
1e9f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
1ea00 20 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20   + If the query 
1ea10 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e  is a "SELECT min
1ea20 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c  (x)", then the l
1ea30 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20  oop coded by.   
1ea40 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e     **     where.
1ea50 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65  c should not ite
1ea60 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61  rate over any va
1ea70 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c  lues with a NULL
1ea80 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20   value.      ** 
1ea90 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20      for x..     
1eaa0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 2b   **.      **   +
1eab0 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63   The optimizer c
1eac0 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28  ode in where.c (
1ead0 74 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64  the thing that d
1eae0 65 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20  ecides which.   
1eaf0 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20     **     index 
1eb00 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73  or indices to us
1eb10 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20  e) should place 
1eb20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f  a different prio
1eb30 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 2a  rity on .      *
1eb40 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67  *     satisfying
1eb50 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20   the 'ORDER BY' 
1eb60 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64  clause than it d
1eb70 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73  oes in other cas
1eb80 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  es..      **    
1eb90 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61   Refer to code a
1eba0 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77  nd comments in w
1ebb0 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69  here.c for detai
1ebc0 6c 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ls..      */.   
1ebd0 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78     flag = minMax
1ebe0 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 29  Query(pParse, p)
1ebf0 3b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  ;.      if( flag
1ec00 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 69 6e   ){.        pMin
1ec10 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Max = sqlite3Exp
1ec20 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
1ec30 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
1ec40 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  pr->pList);.    
1ec50 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20      if( pMinMax 
1ec60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69  ){.          pMi
1ec70 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  nMax->a[0].sortO
1ec80 72 64 65 72 20 3d 20 28 28 66 6c 61 67 3d 3d 4f  rder = ((flag==O
1ec90 52 44 45 52 42 59 5f 4d 49 4e 29 3f 30 3a 31 29  RDERBY_MIN)?0:1)
1eca0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e  ;.          pMin
1ecb0 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  Max->a[0].pExpr-
1ecc0 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
1ecd0 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 6c 20  .          pDel 
1ece0 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20  = pMinMax;.     
1ecf0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
1ed00 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
1ed10 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67   runs if the agg
1ed20 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52  regate has no GR
1ed30 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
1ed40 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  The.      ** pro
1ed50 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20  cessing is much 
1ed60 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68  simpler since th
1ed70 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69  ere is only a si
1ed80 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 2a  ngle row.      *
1ed90 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20  * of output..   
1eda0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65     */.      rese
1edb0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
1edc0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
1edd0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  .      pWInfo = 
1ede0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1edf0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
1ee00 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4d 69  st, pWhere, &pMi
1ee10 6e 4d 61 78 2c 20 66 6c 61 67 29 3b 0a 20 20 20  nMax, flag);.   
1ee20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
1ee30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1ee40 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
1ee50 65 28 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20  e(pDel);.       
1ee60 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1ee70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ee80 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
1ee90 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
1eea0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
1eeb0 21 70 4d 69 6e 4d 61 78 20 26 26 20 66 6c 61 67  !pMinMax && flag
1eec0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1eed0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1eee0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57 49   OP_Goto, 0, pWI
1eef0 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 20 20  nfo->iBreak);.  
1ef00 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1ef10 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69  t((v, "%s() by i
1ef20 6e 64 65 78 22 2c 20 28 66 6c 61 67 3d 3d 4f 52  ndex", (flag==OR
1ef30 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a  DERBY_MIN?"min":
1ef40 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20  "max")));.      
1ef50 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  }.      sqlite3W
1ef60 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
1ef70 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41  .      finalizeA
1ef80 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
1ef90 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
1efa0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
1efb0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48   0;.      if( pH
1efc0 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  aving ){.       
1efd0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1efe0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
1eff0 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51  ing, addrEnd, SQ
1f000 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1f010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f020 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
1f030 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
1f040 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d  List, 0, 0, 0, -
1f050 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  1, .            
1f060 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c            pDest,
1f070 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e   addrEnd, addrEn
1f080 64 2c 20 61 66 66 29 3b 0a 0a 20 20 20 20 20 20  d, aff);..      
1f090 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1f0a0 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 20  elete(pDel);.   
1f0b0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1f0c0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1f0d0 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
1f0e0 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67  .  } /* endif ag
1f0f0 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
1f100 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
1f110 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
1f120 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e  lause, then we n
1f130 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20  eed to sort the 
1f140 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64  results.  ** and
1f150 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68   send them to th
1f160 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62  e callback one b
1f170 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  y one..  */.  if
1f180 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
1f190 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
1f1a0 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c  il(pParse, p, v,
1f1b0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
1f1c0 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  pDest);.  }..#if
1f1d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f1e0 5f 53 55 42 51 55 45 52 59 0a 20 20 2f 2a 20 49  _SUBQUERY.  /* I
1f1f0 66 20 74 68 69 73 20 77 61 73 20 61 20 73 75 62  f this was a sub
1f200 71 75 65 72 79 2c 20 77 65 20 68 61 76 65 20 6e  query, we have n
1f210 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68 65  ow converted the
1f220 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 61   subquery into a
1f230 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
1f240 74 61 62 6c 65 2e 20 20 53 6f 20 73 65 74 20 74  table.  So set t
1f250 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e  he SrcList_item.
1f260 69 73 50 6f 70 75 6c 61 74 65 64 20 66 6c 61 67  isPopulated flag
1f270 20 74 6f 20 70 72 65 76 65 6e 74 0a 20 20 2a 2a   to prevent.  **
1f280 20 74 68 69 73 20 73 75 62 71 75 65 72 79 20 66   this subquery f
1f290 72 6f 6d 20 62 65 69 6e 67 20 65 76 61 6c 75 61  rom being evalua
1f2a0 74 65 64 20 61 67 61 69 6e 20 61 6e 64 20 74 6f  ted again and to
1f2b0 20 66 6f 72 63 65 20 74 68 65 20 75 73 65 20 6f   force the use o
1f2c0 66 0a 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f  f.  ** the tempo
1f2d0 72 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  rary table..  */
1f2e0 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29  .  if( pParent )
1f2f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1f300 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72  arent->pSrc->nSr
1f310 63 3e 70 61 72 65 6e 74 54 61 62 20 29 3b 0a 20  c>parentTab );. 
1f320 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1f330 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65  nt->pSrc->a[pare
1f340 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d  ntTab].pSelect==
1f350 70 20 29 3b 0a 20 20 20 20 70 50 61 72 65 6e 74  p );.    pParent
1f360 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74  ->pSrc->a[parent
1f370 54 61 62 5d 2e 69 73 50 6f 70 75 6c 61 74 65 64  Tab].isPopulated
1f380 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 1;.  }.#endif
1f390 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
1f3a0 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75   to skip this qu
1f3b0 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
1f3c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1f3d0 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20  el(v, iEnd);..  
1f3e0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61  /* The SELECT wa
1f3f0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
1f400 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20  oded.   Set the 
1f410 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30  return code to 0
1f420 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
1f430 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a  e no errors..  *
1f440 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  /.  rc = 0;..  /
1f450 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20  * Control jumps 
1f460 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72  to here if an er
1f470 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1f480 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f  ed above, or upo
1f490 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75  n.  ** successfu
1f4a0 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  l coding of the 
1f4b0 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c  SELECT..  */.sel
1f4c0 65 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49  ect_end:..  /* I
1f4d0 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e  dentify column n
1f4e0 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20  ames if we will 
1f4f0 62 65 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e  be using them in
1f500 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68   a callback.  Th
1f510 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20  is.  ** step is 
1f520 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f  skipped if the o
1f530 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
1f540 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 65 73  o some other des
1f550 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  tination..  */. 
1f560 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f570 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65  OK && pDest->eDe
1f580 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
1f590 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
1f5a0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
1f5b0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
1f5c0 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  List);.  }..  sq
1f5d0 6c 69 74 65 33 5f 66 72 65 65 28 73 41 67 67 49  lite3_free(sAggI
1f5e0 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  nfo.aCol);.  sql
1f5f0 69 74 65 33 5f 66 72 65 65 28 73 41 67 67 49 6e  ite3_free(sAggIn
1f600 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74  fo.aFunc);.  ret
1f610 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64  urn rc;.}..#if d
1f620 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
1f630 42 55 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  BUG)./*.********
1f640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f680 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66  *******.** The f
1f690 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69 73  ollowing code is
1f6a0 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
1f6b0 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
1f6c0 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 64 65 0a  only.  The code.
1f6d0 2a 2a 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ** that follows 
1f6e0 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20  does not appear 
1f6f0 69 6e 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  in normal builds
1f700 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
1f710 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
1f720 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 74 68 65  to print out the
1f730 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20   content of all 
1f740 6f 72 20 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a  or part of a .**
1f750 20 70 61 72 73 65 20 73 74 72 75 63 74 75 72 65   parse structure
1f760 73 20 73 75 63 68 20 61 73 20 53 65 6c 65 63 74  s such as Select
1f770 20 6f 72 20 45 78 70 72 2e 20 20 53 75 63 68 20   or Expr.  Such 
1f780 70 72 69 6e 74 6f 75 74 73 20 61 72 65 20 75 73  printouts are us
1f790 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c 70  eful.** for help
1f7a0 69 6e 67 20 74 6f 20 75 6e 64 65 72 73 74 61 6e  ing to understan
1f7b0 64 20 77 68 61 74 20 69 73 20 68 61 70 70 65 6e  d what is happen
1f7c0 69 6e 67 20 69 6e 73 69 64 65 20 74 68 65 20 63  ing inside the c
1f7d0 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  ode generator.**
1f7e0 20 64 75 72 69 6e 67 20 74 68 65 20 65 78 65 63   during the exec
1f7f0 75 74 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78  ution of complex
1f800 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1f810 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ts..**.** These 
1f820 72 6f 75 74 69 6e 65 20 61 72 65 20 6e 6f 74 20  routine are not 
1f830 63 61 6c 6c 65 64 20 61 6e 79 77 68 65 72 65 20  called anywhere 
1f840 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
1f850 6e 6f 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20 62  normal.** code b
1f860 61 73 65 2e 20 20 54 68 65 6e 20 61 72 65 20 69  ase.  Then are i
1f870 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 63 61  ntended to be ca
1f880 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
1f890 20 74 68 65 20 64 65 62 75 67 67 65 72 0a 2a 2a   the debugger.**
1f8a0 20 6f 72 20 66 72 6f 6d 20 74 65 6d 70 6f 72 61   or from tempora
1f8b0 72 79 20 22 70 72 69 6e 74 66 22 20 73 74 61 74  ry "printf" stat
1f8c0 65 6d 65 6e 74 73 20 69 6e 73 65 72 74 65 64 20  ements inserted 
1f8d0 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a  for debugging..*
1f8e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72  /.void sqlite3Pr
1f8f0 69 6e 74 45 78 70 72 28 45 78 70 72 20 2a 70 29  intExpr(Expr *p)
1f900 7b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e  {.  if( p->token
1f910 2e 7a 20 26 26 20 70 2d 3e 74 6f 6b 65 6e 2e 6e  .z && p->token.n
1f920 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
1f930 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 25  3DebugPrintf("(%
1f940 2e 2a 73 22 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e  .*s", p->token.n
1f950 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20  , p->token.z);. 
1f960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
1f970 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1f980 28 25 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20  (%d", p->op);.  
1f990 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74  }.  if( p->pLeft
1f9a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1f9b0 65 62 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b  ebugPrintf(" ");
1f9c0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
1f9d0 74 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b  tExpr(p->pLeft);
1f9e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52  .  }.  if( p->pR
1f9f0 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ight ){.    sqli
1fa00 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1fa10 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
1fa20 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 52 69  PrintExpr(p->pRi
1fa30 67 68 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ght);.  }.  sqli
1fa40 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1fa50 29 22 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  )");.}.void sqli
1fa60 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74  te3PrintExprList
1fa70 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
1fa80 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1fa90 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1faa0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1fab0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
1fac0 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  r(pList->a[i].pE
1fad0 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 69 3c  xpr);.    if( i<
1fae0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29  pList->nExpr-1 )
1faf0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
1fb00 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20 22 29  ebugPrintf(", ")
1fb10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f  ;.    }.  }.}.vo
1fb20 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53  id sqlite3PrintS
1fb30 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c  elect(Select *p,
1fb40 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20   int indent){.  
1fb50 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1fb60 74 66 28 22 25 2a 73 53 45 4c 45 43 54 28 25 70  tf("%*sSELECT(%p
1fb70 29 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c  ) ", indent, "",
1fb80 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 72   p);.  sqlite3Pr
1fb90 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  intExprList(p->p
1fba0 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  EList);.  sqlite
1fbb0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
1fbc0 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72  ");.  if( p->pSr
1fbd0 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  c ){.    char *z
1fbe0 50 72 65 66 69 78 3b 0a 20 20 20 20 69 6e 74 20  Prefix;.    int 
1fbf0 69 3b 0a 20 20 20 20 7a 50 72 65 66 69 78 20 3d  i;.    zPrefix =
1fc00 20 22 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72   "FROM";.    for
1fc10 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d  (i=0; i<p->pSrc-
1fc20 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
1fc30 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1fc40 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
1fc50 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a  &p->pSrc->a[i];.
1fc60 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
1fc70 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 22 2c  ugPrintf("%*s ",
1fc80 20 69 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66   indent+6, zPref
1fc90 69 78 29 3b 0a 20 20 20 20 20 20 7a 50 72 65 66  ix);.      zPref
1fca0 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 69  ix = "";.      i
1fcb0 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
1fcc0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1fcd0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1fce0 22 28 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  "(\n");.        
1fcf0 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65  sqlite3PrintSele
1fd00 63 74 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  ct(pItem->pSelec
1fd10 74 2c 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20  t, indent+10);. 
1fd20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
1fd30 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 29 22  bugPrintf("%*s)"
1fd40 2c 20 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b  , indent+8, "");
1fd50 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1fd60 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b   pItem->zName ){
1fd70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1fd80 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 73 22  DebugPrintf("%s"
1fd90 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
1fda0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1fdb0 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29  f( pItem->pTab )
1fdc0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1fdd0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 74  3DebugPrintf("(t
1fde0 61 62 6c 65 3a 20 25 73 29 22 2c 20 70 49 74 65  able: %s)", pIte
1fdf0 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  m->pTab->zName);
1fe00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1fe10 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
1fe20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1fe30 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1fe40 20 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e   AS %s", pItem->
1fe50 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d  zAlias);.      }
1fe60 0a 20 20 20 20 20 20 69 66 28 20 69 3c 70 2d 3e  .      if( i<p->
1fe70 70 53 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a  pSrc->nSrc-1 ){.
1fe80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
1fe90 65 62 75 67 50 72 69 6e 74 66 28 22 2c 22 29 3b  ebugPrintf(",");
1fea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1feb0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1fec0 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20  f("\n");.    }. 
1fed0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65   }.  if( p->pWhe
1fee0 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  re ){.    sqlite
1fef0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
1ff00 73 20 57 48 45 52 45 20 22 2c 20 69 6e 64 65 6e  s WHERE ", inden
1ff10 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69  t, "");.    sqli
1ff20 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e  te3PrintExpr(p->
1ff30 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c  pWhere);.    sql
1ff40 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1ff50 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  "\n");.  }.  if(
1ff60 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a   p->pGroupBy ){.
1ff70 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1ff80 50 72 69 6e 74 66 28 22 25 2a 73 20 47 52 4f 55  Printf("%*s GROU
1ff90 50 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20  P BY ", indent, 
1ffa0 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "");.    sqlite3
1ffb0 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d  PrintExprList(p-
1ffc0 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
1ffd0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1ffe0 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  tf("\n");.  }.  
1fff0 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29  if( p->pHaving )
20000 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
20010 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 48 41  ugPrintf("%*s HA
20020 56 49 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20  VING ", indent, 
20030 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "");.    sqlite3
20040 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 48 61  PrintExpr(p->pHa
20050 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  ving);.    sqlit
20060 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
20070 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n");.  }.  if( p
20080 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
20090 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
200a0 69 6e 74 66 28 22 25 2a 73 20 4f 52 44 45 52 20  intf("%*s ORDER 
200b0 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  BY ", indent, ""
200c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
200d0 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  intExprList(p->p
200e0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71  OrderBy);.    sq
200f0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
20100 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a  ("\n");.  }.}./*
20110 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75   End of the stru
20120 63 74 75 72 65 20 64 65 62 75 67 20 70 72 69 6e  cture debug prin
20130 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a  ting code.******
20140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20180 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20  *******/.#endif 
20190 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
201a0 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
201b0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
201c0 20 2a 2f 0a                                       */.